mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The concurrency runtime now deploys back to macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, which corresponds to the 5.1 release of the stdlib. Adjust macro usages accordingly.
82 lines
2.2 KiB
Swift
82 lines
2.2 KiB
Swift
// RUN: %empty-directory(%t)
|
|
// RUN: %round-trip-syntax-test --swift-syntax-test %swift-syntax-test --file %s
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
actor Counter {
|
|
private var value = 0
|
|
private let scratchBuffer: UnsafeMutableBufferPointer<Int>
|
|
|
|
init(maxCount: Int) {
|
|
scratchBuffer = .allocate(capacity: maxCount)
|
|
scratchBuffer.initialize(repeating: 0)
|
|
}
|
|
|
|
func next() -> Int {
|
|
let current = value
|
|
|
|
// Make sure we haven't produced this value before
|
|
assert(scratchBuffer[current] == 0)
|
|
scratchBuffer[current] = 1
|
|
|
|
value = value + 1
|
|
return current
|
|
}
|
|
}
|
|
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
func worker(identity: Int, counters: [Counter], numIterations: Int) async {
|
|
for i in 0..<numIterations {
|
|
let counterIndex = Int.random(in: 0 ..< counters.count)
|
|
let counter = counters[counterIndex]
|
|
let nextValue = await counter.next()
|
|
print("Worker \(identity) calling counter \(counterIndex) produced \(nextValue)")
|
|
}
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
func runTest(numCounters: Int, numWorkers: Int, numIterations: Int) async {
|
|
// Create counter actors.
|
|
var counters: [Counter] = []
|
|
for i in 0..<numCounters {
|
|
counters.append(Counter(maxCount: numWorkers * numIterations))
|
|
}
|
|
|
|
// Create a bunch of worker threads.
|
|
var workers: [Task.Handle<Void, Error>] = []
|
|
for i in 0..<numWorkers {
|
|
workers.append(
|
|
detach { [counters] in
|
|
await Task.sleep(UInt64.random(in: 0..<100) * 1_000_000)
|
|
await worker(identity: i, counters: counters, numIterations: numIterations)
|
|
}
|
|
)
|
|
}
|
|
|
|
// Wait until all of the workers have finished.
|
|
for worker in workers {
|
|
try! await worker.get()
|
|
}
|
|
|
|
print("DONE!")
|
|
}
|
|
|
|
@available(SwiftStdlib 5.1, *)
|
|
@main struct Main {
|
|
static func main() async {
|
|
// Useful for debugging: specify counter/worker/iteration counts
|
|
let args = CommandLine.arguments
|
|
let counters = args.count >= 2 ? Int(args[1])! : 10
|
|
let workers = args.count >= 3 ? Int(args[2])! : 100
|
|
let iterations = args.count >= 4 ? Int(args[3])! : 1000
|
|
print("counters: \(counters), workers: \(workers), iterations: \(iterations)")
|
|
await runTest(numCounters: counters, numWorkers: workers, numIterations: iterations)
|
|
}
|
|
}
|
|
|
|
struct X3 {
|
|
subscript(_ i : Int) -> Int {
|
|
get async throws {}
|
|
}
|
|
}
|