Skip to content

Instantly share code, notes, and snippets.

@pookjw
Last active August 30, 2024 17:34
Show Gist options
  • Save pookjw/1c6423650ea6cb61ff9dd847739f3b76 to your computer and use it in GitHub Desktop.
Save pookjw/1c6423650ea6cb61ff9dd847739f3b76 to your computer and use it in GitHub Desktop.
import Dispatch
class MySerialExecutor: SerialExecutor, @unchecked Sendable {
func enqueue(_ job: consuming ExecutorJob) {
let unownedJob = UnownedJob(job)
DispatchQueue(label: "FooQueue").async {
unownedJob.runSynchronously(on: .init(complexEquality: self))
}
}
func isSameExclusiveExecutionContext(other: MySerialExecutor) -> Bool {
Unmanaged.passUnretained(self).toOpaque() == Unmanaged.passUnretained(other).toOpaque()
}
}
@globalActor
actor MyActor {
static let shared = MyActor()
let serialExecutor = MySerialExecutor()
nonisolated var unownedExecutor: UnownedSerialExecutor {
.init(complexEquality: serialExecutor)
}
}
class MyTaskExecutor: TaskExecutor, @unchecked Sendable {
func enqueue(_ job: consuming ExecutorJob) {
job.runSynchronously(on: MyActor.shared.unownedExecutor)
}
}
@main
struct MyScript {
static func main() async {
await Task.detached(executorPreference: MyTaskExecutor()) { @MyActor in
// print("123")
await foo()
}.value
}
}
nonisolated func foo() async {
MainActor.shared.assertIsolated()
MyActor.shared.assertIsolated()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment