1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
// RUN: %target-run-simple-swift( %import-libdispatch -strict-concurrency=complete -parse-as-library) | %FileCheck %s
// REQUIRES: concurrency
// REQUIRES: executable_test
// REQUIRES: libdispatch
// UNSUPPORTED: freestanding
// UNSUPPORTED: back_deployment_runtime
// REQUIRES: concurrency_runtime
import Dispatch
let globalQueue = DispatchQueue(label: "SimpleQueue")
@available(SwiftStdlib 6.0, *)
final class NaiveQueueExecutor: SerialExecutor {
public func enqueue(_ unowned: UnownedJob) {
globalQueue.sync {
unowned.runSynchronously(on: self.asUnownedSerialExecutor())
}
}
public func asUnownedSerialExecutor() -> UnownedSerialExecutor {
return UnownedSerialExecutor(ordinary: self)
}
func checkIsolated() {
// ok
}
}
@available(SwiftStdlib 6.0, *)
actor Simple {
var count = 0
let exec = NaiveQueueExecutor()
func report() {
print("simple.count == \(count)")
count += 1
}
nonisolated var unownedExecutor: UnownedSerialExecutor {
print("Simple.unownedExecutor")
return exec.asUnownedSerialExecutor()
}
}
@globalActor
@available(SwiftStdlib 6.0, *)
actor MyGlobalActor {
static let simple = Simple()
static let shared = MyGlobalActor()
static var sharedUnownedExecutor: UnownedSerialExecutor {
print("MyGlobalActor.sharedUnownedExecutor")
return simple.unownedExecutor
}
nonisolated var unownedExecutor: UnownedSerialExecutor {
print("MyGlobalActor.unownedExecutor")
return Self.simple.unownedExecutor
}
}
@MyGlobalActor
@available(SwiftStdlib 6.0, *)
final class Custom {
var count = 0
let simple = MyGlobalActor.simple
nonisolated var unownedExecutor: UnownedSerialExecutor {
return simple.unownedExecutor
}
func report() async {
simple.preconditionIsolated()
print("custom.count == \(count)")
count += 1
await simple.report()
}
}
@available(SwiftStdlib 6.0, *)
@main struct Main {
static func main() async {
print("begin")
let actor = Custom()
await actor.report()
print("end")
}
}
// CHECK: begin
// CHECK-NEXT: MyGlobalActor.unownedExecutor
// CHECK-NEXT: Simple.unownedExecutor
// CHECK-NEXT: Simple.unownedExecutor
// CHECK-NEXT: custom.count == 0
// CHECK-NEXT: Simple.unownedExecutor
// CHECK-NEXT: simple.count == 0
// CHECK-NEXT: end
|