Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 944b727

Browse files
committedMar 25, 2025
Update proposal and implementation
1 parent 21a88b0 commit 944b727

File tree

6 files changed

+1323
-831
lines changed

6 files changed

+1323
-831
lines changed
 

‎Evolution/0016-mutli-producer-single-consumer-channel.md

+311-166
Large diffs are not rendered by default.

‎Sources/AsyncAlgorithms/Locking.swift

+6-24
Original file line numberDiff line numberDiff line change
@@ -23,33 +23,24 @@ import Bionic
2323
#error("Unsupported platform")
2424
#endif
2525

26-
@usableFromInline
27-
internal class Lock {
26+
internal struct Lock {
2827
#if canImport(Darwin)
29-
@usableFromInline
3028
typealias Primitive = os_unfair_lock
3129
#elseif canImport(Glibc) || canImport(Musl) || canImport(Bionic)
3230
typealias Primitive = pthread_mutex_t
3331
#elseif canImport(WinSDK)
34-
@usableFromInline
3532
typealias Primitive = SRWLOCK
3633
#else
3734
#error("Unsupported platform")
3835
#endif
3936

40-
@usableFromInline
4137
typealias PlatformLock = UnsafeMutablePointer<Primitive>
42-
@usableFromInline
4338
let platformLock: PlatformLock
4439

4540
private init(_ platformLock: PlatformLock) {
4641
self.platformLock = platformLock
4742
}
48-
49-
deinit {
50-
self.deinitialize()
51-
}
52-
43+
5344
fileprivate static func initialize(_ platformLock: PlatformLock) {
5445
#if canImport(Darwin)
5546
platformLock.initialize(to: os_unfair_lock())
@@ -71,8 +62,7 @@ internal class Lock {
7162
platformLock.deinitialize(count: 1)
7263
}
7364

74-
@usableFromInline
75-
static func lock(_ platformLock: PlatformLock) {
65+
fileprivate static func lock(_ platformLock: PlatformLock) {
7666
#if canImport(Darwin)
7767
os_unfair_lock_lock(platformLock)
7868
#elseif canImport(Glibc) || canImport(Musl) || canImport(Bionic)
@@ -84,8 +74,7 @@ internal class Lock {
8474
#endif
8575
}
8676

87-
@usableFromInline
88-
static func unlock(_ platformLock: PlatformLock) {
77+
fileprivate static func unlock(_ platformLock: PlatformLock) {
8978
#if canImport(Darwin)
9079
os_unfair_lock_unlock(platformLock)
9180
#elseif canImport(Glibc) || canImport(Musl) || canImport(Bionic)
@@ -109,12 +98,10 @@ internal class Lock {
10998
platformLock.deallocate()
11099
}
111100

112-
@inlinable
113101
func lock() {
114102
Lock.lock(platformLock)
115103
}
116104

117-
@inlinable
118105
func unlock() {
119106
Lock.unlock(platformLock)
120107
}
@@ -127,7 +114,6 @@ internal class Lock {
127114
///
128115
/// - Parameter body: The block to execute while holding the lock.
129116
/// - Returns: The value returned by the block.
130-
@inlinable
131117
func withLock<T>(_ body: () throws -> T) rethrows -> T {
132118
self.lock()
133119
defer {
@@ -142,17 +128,14 @@ internal class Lock {
142128
}
143129
}
144130

145-
@usableFromInline
146131
struct ManagedCriticalState<State> {
147-
@usableFromInline
148-
final class LockedBuffer: ManagedBuffer<State, Lock.Primitive> {
132+
private final class LockedBuffer: ManagedBuffer<State, Lock.Primitive> {
149133
deinit {
150134
withUnsafeMutablePointerToElements { Lock.deinitialize($0) }
151135
}
152136
}
153137

154-
@usableFromInline
155-
let buffer: ManagedBuffer<State, Lock.Primitive>
138+
private let buffer: ManagedBuffer<State, Lock.Primitive>
156139

157140
init(_ initial: State) {
158141
buffer = LockedBuffer.create(minimumCapacity: 1) { buffer in
@@ -161,7 +144,6 @@ struct ManagedCriticalState<State> {
161144
}
162145
}
163146

164-
@inlinable
165147
func withCriticalRegion<R>(_ critical: (inout State) throws -> R) rethrows -> R {
166148
try buffer.withUnsafeMutablePointers { header, lock in
167149
Lock.lock(lock)

‎Sources/AsyncAlgorithms/MultiProducerSingleConsumerChannel/MultiProducerSingleConsumerChannel+Internal.swift

+285-88
Large diffs are not rendered by default.

‎Sources/AsyncAlgorithms/MultiProducerSingleConsumerChannel/MultiProducerSingleConsumerChannel.swift

+177-101
Large diffs are not rendered by default.

‎Tests/AsyncAlgorithmsTests/MultiProducerSingleConsumerChannel/MultiProducerSingleConsumerChannelTests.swift

+527-452
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import DequeModule
2+
import Synchronization
3+
4+
@available(macOS 15.0, iOS 18.0, watchOS 11.0, tvOS 18.0, visionOS 2.0, *)
5+
final class ManualTaskExecutor: TaskExecutor {
6+
private let jobs = Mutex<Deque<UnownedJob>>(.init())
7+
8+
func enqueue(_ job: UnownedJob) {
9+
self.jobs.withLock { $0.append(job) }
10+
}
11+
12+
func run() {
13+
while let job = self.jobs.withLock({ $0.popFirst() }) {
14+
job.runSynchronously(on: self.asUnownedTaskExecutor())
15+
}
16+
}
17+
}

0 commit comments

Comments
 (0)
Please sign in to comment.