mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
- Introduce an UnownedSerialExecutor type into the concurrency library. - Create a SerialExecutor protocol which allows an executor type to change how it executes jobs. - Add an unownedExecutor requirement to the Actor protocol. - Change the ABI for ExecutorRef so that it stores a SerialExecutor witness table pointer in the implementation field. This effectively makes ExecutorRef an `unowned(unsafe) SerialExecutor`, except that default actors are represented without a witness table pointer (just a bit-pattern). - Synthesize the unownedExecutor method for default actors (i.e. actors that don't provide an unownedExecutor property). - Make synthesized unownedExecutor properties `final`, and give them a semantics attribute specifying that they're for default actors. - Split `Builtin.buildSerialExecutorRef` into a few more precise builtins. We're not using the main-actor one yet, though. Pitch thread: https://forums.swift.org/t/support-custom-executors-in-swift-concurrency/44425
53 lines
2.1 KiB
Swift
53 lines
2.1 KiB
Swift
// RUN: %target-swift-frontend -emit-silgen %s -module-name test -swift-version 5 -enable-experimental-concurrency -enable-actor-data-race-checks | %FileCheck --enable-var-scope %s --check-prefix=CHECK-RAW
|
|
// RUN: %target-swift-frontend -emit-silgen %s -module-name test -swift-version 5 -enable-experimental-concurrency -enable-actor-data-race-checks > %t.sil
|
|
// RUN: %target-sil-opt -enable-sil-verify-all %t.sil -lower-hop-to-actor -enable-experimental-concurrency | %FileCheck --enable-var-scope %s --check-prefix=CHECK-CANONICAL
|
|
// REQUIRES: concurrency
|
|
|
|
import Swift
|
|
import _Concurrency
|
|
|
|
// CHECK-RAW-LABEL: sil [ossa] @$s4test11onMainActoryyF
|
|
// CHECK-RAW: extract_executor [[MAIN_ACTOR:%.*]] : $MainActor
|
|
|
|
// CHECK-CANONICAL-LABEL: sil [ossa] @$s4test11onMainActoryyF
|
|
// CHECK-CANONICAL: function_ref @$ss22_checkExpectedExecutor14_filenameStart01_D6Length01_D7IsASCII5_line9_executoryBp_BwBi1_BwBetF
|
|
@MainActor public func onMainActor() { }
|
|
|
|
func takeClosure(_ fn: @escaping () -> Int) { }
|
|
|
|
func takeUnsafeMainActorClosure(@_unsafeMainActor _ fn: @escaping () -> Int) { }
|
|
|
|
public actor MyActor {
|
|
var counter = 0
|
|
|
|
// CHECK-RAW-LABEL: sil private [ossa] @$s4test7MyActorC10getUpdaterSiycyFSiycfU_
|
|
// CHECK-RAW: extract_executor [[ACTOR:%.*]] : $MyActor
|
|
|
|
// CHECK-CANONICAL-LABEL: sil private [ossa] @$s4test7MyActorC10getUpdaterSiycyFSiycfU_
|
|
// CHECK-CANONICAL: function_ref @$ss22_checkExpectedExecutor14_filenameStart01_D6Length01_D7IsASCII5_line9_executoryBp_BwBi1_BwBetF
|
|
public func getUpdater() -> (() -> Int) {
|
|
return {
|
|
self.counter = self.counter + 1
|
|
return self.counter
|
|
}
|
|
}
|
|
|
|
// CHECK-RAW: sil private [ossa] @$s4test7MyActorCfdSiycfU_
|
|
// CHECK-RAW-NOT: extract_executor
|
|
// CHECK-RAW: return [[VALUE:%.*]] : $Int
|
|
deinit {
|
|
takeClosure { self.counter }
|
|
}
|
|
|
|
// CHECK-RAW-LABEL: sil private [ossa] @$s4test7MyActorC0A10UnsafeMainyyFSiycfU_
|
|
// CHECK-RAW-NOT: _checkExpectedExecutor
|
|
// CHECK-RAW: onMainActor
|
|
// CHECK-RAW: return
|
|
public func testUnsafeMain() {
|
|
takeUnsafeMainActorClosure {
|
|
onMainActor()
|
|
return 5
|
|
}
|
|
}
|
|
}
|