diff --git a/lib/SILGen/SILGen.cpp b/lib/SILGen/SILGen.cpp index 89c843270a319..b18b186c4d75d 100644 --- a/lib/SILGen/SILGen.cpp +++ b/lib/SILGen/SILGen.cpp @@ -527,7 +527,36 @@ FuncDecl *SILGenModule::getExit() { Type SILGenModule::getConfiguredExecutorFactory() { auto &ctx = getASTContext(); - // Look in the main module for a typealias + // First look in the @main struct, if any + NominalTypeDecl *mainType = ctx.MainModule->getMainTypeDecl(); + if (mainType) { + SmallVector decls; + auto identifier = ctx.getIdentifier("DefaultExecutorFactory"); + mainType->lookupQualified(mainType, + DeclNameRef(identifier), + SourceLoc(), + NL_RemoveNonVisible | NL_RemoveOverridden + | NL_OnlyTypes | NL_ProtocolMembers, + decls); + for (auto decl : decls) { + TypeDecl *typeDecl = dyn_cast(decl); + if (typeDecl) { + if (auto *nominalDecl = dyn_cast(typeDecl)) { + return nominalDecl->getDeclaredType(); + } + + if (isa(typeDecl)) { + // We ignore associatedtype declarations; those with a default will + // turn into a `typealias` instead. + continue; + } + + return typeDecl->getDeclaredInterfaceType(); + } + } + } + + // Failing that, look at the top level Type factory = ctx.getNamedSwiftType(ctx.MainModule, "DefaultExecutorFactory"); // If we don't find it, fall back to _Concurrency.PlatformExecutorFactory diff --git a/stdlib/public/Concurrency/CFExecutor.swift b/stdlib/public/Concurrency/CFExecutor.swift index c1e7917d69b94..bc78d3175c60a 100644 --- a/stdlib/public/Concurrency/CFExecutor.swift +++ b/stdlib/public/Concurrency/CFExecutor.swift @@ -47,8 +47,9 @@ enum CoreFoundation { // .. Main Executor ............................................................ +/// A CFRunLoop-based main executor (Apple platforms only) @available(StdlibDeploymentTarget 6.2, *) -public final class CFMainExecutor: DispatchMainExecutor, @unchecked Sendable { +final class CFMainExecutor: DispatchMainExecutor, @unchecked Sendable { override public func run() throws { CoreFoundation.CFRunLoopRun() @@ -62,9 +63,10 @@ public final class CFMainExecutor: DispatchMainExecutor, @unchecked Sendable { // .. Task Executor ............................................................ +/// A `TaskExecutor` to match `CFMainExecutor` (Apple platforms only) @available(StdlibDeploymentTarget 6.2, *) -public final class CFTaskExecutor: DispatchGlobalTaskExecutor, - @unchecked Sendable { +final class CFTaskExecutor: DispatchGlobalTaskExecutor, + @unchecked Sendable { } diff --git a/stdlib/public/Concurrency/Clock.swift b/stdlib/public/Concurrency/Clock.swift index 39e08c9bd9a8b..dd38cbcbadbe0 100644 --- a/stdlib/public/Concurrency/Clock.swift +++ b/stdlib/public/Concurrency/Clock.swift @@ -40,52 +40,64 @@ public protocol Clock: Sendable { #if !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY func sleep(until deadline: Instant, tolerance: Instant.Duration?) async throws -#endif - - /// The traits associated with this clock instance. - @available(StdlibDeploymentTarget 6.2, *) - var traits: ClockTraits { get } - /// Convert a Clock-specific Duration to a Swift Duration - /// - /// Some clocks may define `C.Duration` to be something other than a - /// `Swift.Duration`, but that makes it tricky to convert timestamps - /// between clocks, which is something we want to be able to support. - /// This method will convert whatever `C.Duration` is to a `Swift.Duration`. + /// Run the given job on an unspecified executor at some point + /// after the given instant. /// /// Parameters: /// - /// - from duration: The `Duration` to convert + /// - job: The job we wish to run + /// - at instant: The time at which we would like it to run. + /// - tolerance: The ideal maximum delay we are willing to tolerate. /// - /// Returns: A `Swift.Duration` representing the equivalent duration, or - /// `nil` if this function is not supported. @available(StdlibDeploymentTarget 6.2, *) - func convert(from duration: Duration) -> Swift.Duration? + func run(_ job: consuming ExecutorJob, + at instant: Instant, tolerance: Duration?) - /// Convert a Swift Duration to a Clock-specific Duration + /// Enqueue the given job on the specified executor at some point after the + /// given instant. + /// + /// The default implementation uses the `run` method to trigger a job that + /// does `executor.enqueue(job)`. If a particular `Clock` knows that the + /// executor it has been asked to use is the same one that it will run jobs + /// on, it can short-circuit this behaviour and directly use `run` with + /// the original job. /// /// Parameters: /// - /// - from duration: The `Swift.Duration` to convert. + /// - job: The job we wish to run + /// - on executor: The executor on which we would like it to run. + /// - at instant: The time at which we would like it to run. + /// - tolerance: The ideal maximum delay we are willing to tolerate. /// - /// Returns: A `Duration` representing the equivalent duration, or - /// `nil` if this function is not supported. @available(StdlibDeploymentTarget 6.2, *) - func convert(from duration: Swift.Duration) -> Duration? + func enqueue(_ job: consuming ExecutorJob, + on executor: some Executor, + at instant: Instant, tolerance: Duration?) +#endif +} - /// Convert an `Instant` from some other clock's `Instant` - /// - /// Parameters: - /// - /// - instant: The instant to convert. - // - from clock: The clock to convert from. - /// - /// Returns: An `Instant` representing the equivalent instant, or - /// `nil` if this function is not supported. +#if !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY +extension Clock { + // The default implementation works by creating a trampoline and calling + // the run() method. @available(StdlibDeploymentTarget 6.2, *) - func convert(instant: OtherClock.Instant, - from clock: OtherClock) -> Instant? + public func enqueue(_ job: consuming ExecutorJob, + on executor: some Executor, + at instant: Instant, tolerance: Duration?) { + let trampoline = job.createTrampoline(to: executor) + run(trampoline, at: instant, tolerance: tolerance) + } + + // Clocks that do not implement run will fatalError() if you try to use + // them with an executor that does not understand them. + @available(StdlibDeploymentTarget 6.2, *) + public func run(_ job: consuming ExecutorJob, + at instant: Instant, tolerance: Duration?) { + fatalError("\(Self.self) does not implement run(_:at:tolerance:).") + } } +#endif // !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY @available(StdlibDeploymentTarget 5.7, *) extension Clock { @@ -140,44 +152,6 @@ extension Clock { } } -@available(StdlibDeploymentTarget 6.2, *) -extension Clock { - // For compatibility, return `nil` if this is not implemented - public func convert(from duration: Duration) -> Swift.Duration? { - return nil - } - - public func convert(from duration: Swift.Duration) -> Duration? { - return nil - } - - public func convert(instant: OtherClock.Instant, - from clock: OtherClock) -> Instant? { - let ourNow = now - let otherNow = clock.now - let otherDuration = otherNow.duration(to: instant) - - // Convert to `Swift.Duration` - guard let duration = clock.convert(from: otherDuration) else { - return nil - } - - // Convert from `Swift.Duration` - guard let ourDuration = convert(from: duration) else { - return nil - } - - return ourNow.advanced(by: ourDuration) - } -} - -@available(StdlibDeploymentTarget 6.2, *) -extension Clock where Duration == Swift.Duration { - public func convert(from duration: Duration) -> Duration? { - return duration - } -} - #if !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY @available(StdlibDeploymentTarget 5.7, *) extension Clock { @@ -196,47 +170,10 @@ extension Clock { } #endif -/// Represents traits of a particular Clock implementation. -/// -/// Clocks may be of a number of different varieties; executors will likely -/// have specific clocks that they can use to schedule jobs, and will -/// therefore need to be able to convert timestamps to an appropriate clock -/// when asked to enqueue a job with a delay or deadline. -/// -/// Choosing a clock in general requires the ability to tell which of their -/// clocks best matches the clock that the user is trying to specify a -/// time or delay in. Executors are expected to do this on a best effort -/// basis. -@available(StdlibDeploymentTarget 6.2, *) -public struct ClockTraits: OptionSet { - public let rawValue: UInt32 - - public init(rawValue: UInt32) { - self.rawValue = rawValue - } - - /// Clocks with this trait continue running while the machine is asleep. - public static let continuous = ClockTraits(rawValue: 1 << 0) - - /// Indicates that a clock's time will only ever increase. - public static let monotonic = ClockTraits(rawValue: 1 << 1) - - /// Clocks with this trait are tied to "wall time". - public static let wallTime = ClockTraits(rawValue: 1 << 2) -} - -@available(StdlibDeploymentTarget 6.2, *) -extension Clock { - /// The traits associated with this clock instance. - @available(StdlibDeploymentTarget 6.2, *) - public var traits: ClockTraits { - return [] - } -} - enum _ClockID: Int32 { case continuous = 1 case suspending = 2 + case walltime = 3 } @available(StdlibDeploymentTarget 5.7, *) diff --git a/stdlib/public/Concurrency/ContinuousClock.swift b/stdlib/public/Concurrency/ContinuousClock.swift index 87db5d75bd72f..80ba7bdc51d1b 100644 --- a/stdlib/public/Concurrency/ContinuousClock.swift +++ b/stdlib/public/Concurrency/ContinuousClock.swift @@ -100,12 +100,6 @@ extension ContinuousClock: Clock { ) } - /// The continuous clock is continuous and monotonic - @available(StdlibDeploymentTarget 6.2, *) - public var traits: ClockTraits { - return [.continuous, .monotonic] - } - #if !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY /// Suspend task execution until a given deadline within a tolerance. /// If no tolerance is specified then the system may adjust the deadline @@ -217,3 +211,36 @@ extension ContinuousClock.Instant: InstantProtocol { rhs.duration(to: lhs) } } + +#if !$Embedded && !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY +@available(StdlibDeploymentTarget 6.2, *) +extension ContinuousClock { + + public func run(_ job: consuming ExecutorJob, + at instant: Instant, + tolerance: Duration?) { + guard let executor = Task.currentSchedulingExecutor else { + fatalError("no scheduling executor is available") + } + + executor.enqueue(job, at: instant, + tolerance: tolerance, + clock: self) + } + + public func enqueue(_ job: consuming ExecutorJob, + on executor: some Executor, + at instant: Instant, + tolerance: Duration?) { + if let schedulingExecutor = executor.asSchedulingExecutor { + schedulingExecutor.enqueue(job, at: instant, + tolerance: tolerance, + clock: self) + } else { + let trampoline = job.createTrampoline(to: executor) + run(trampoline, at: instant, tolerance: tolerance) + } + } + +} +#endif diff --git a/stdlib/public/Concurrency/CooperativeExecutor.swift b/stdlib/public/Concurrency/CooperativeExecutor.swift index 3e92e85dde67f..78036141c808e 100644 --- a/stdlib/public/Concurrency/CooperativeExecutor.swift +++ b/stdlib/public/Concurrency/CooperativeExecutor.swift @@ -97,16 +97,77 @@ extension ExecutorJob { } } +#if !$Embedded && !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY +/// A wait queue is a specialised priority queue used to run a timer. +@available(StdlibDeploymentTarget 6.2, *) +struct WaitQueue { + var queue: PriorityQueue + var clock: _ClockID + + init(clock: _ClockID) { + queue = PriorityQueue(compare: { + ExecutorJob($0).cooperativeExecutorTimestamp + < ExecutorJob($1).cooperativeExecutorTimestamp + }) + self.clock = clock + } + + var currentTime: CooperativeExecutor.Timestamp { + var now: CooperativeExecutor.Timestamp = .zero + unsafe _getTime(seconds: &now.seconds, + nanoseconds: &now.nanoseconds, + clock: clock.rawValue) + return now + } + + mutating func enqueue(_ job: consuming ExecutorJob, + after delay: CooperativeExecutor.Duration) { + let deadline = currentTime + delay + job.setupCooperativeExecutorTimestamp() + job.cooperativeExecutorTimestamp = deadline + queue.push(UnownedJob(job)) + } + + mutating func forEachReadyJob(body: (consuming ExecutorJob) -> ()) { + let now = currentTime + while let job = queue.pop( + when: { + ExecutorJob($0).cooperativeExecutorTimestamp < now + }) { + var theJob = ExecutorJob(job) + theJob.clearCooperativeExecutorTimestamp() + body(theJob) + } + } + + var timeToNextJob: CooperativeExecutor.Duration? { + if let job = queue.top { + let deadline = ExecutorJob(job).cooperativeExecutorTimestamp + let now = currentTime + if deadline > now { + return deadline - now + } else { + return CooperativeExecutor.Duration(seconds: 0, nanoseconds: 0) + } + } + return nil + } +} +#endif + /// A co-operative executor that can be used as the main executor or as a /// task executor. @available(StdlibDeploymentTarget 6.2, *) -class CooperativeExecutor: Executor, @unchecked Sendable { +final class CooperativeExecutor: Executor, @unchecked Sendable { var runQueue: PriorityQueue - var waitQueue: PriorityQueue + #if !$Embedded && !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY + var suspendingWaitQueue = WaitQueue(clock: .suspending) + var continuousWaitQueue = WaitQueue(clock: .continuous) + #endif var shouldStop: Bool = false /// Internal representation of a duration for CooperativeExecutor - struct Duration { + struct Duration: Comparable { var seconds: Int64 var nanoseconds: Int64 @@ -120,6 +181,16 @@ class CooperativeExecutor: Executor, @unchecked Sendable { self.seconds = seconds self.nanoseconds = attoseconds / 1_000_000_000 } + + static func == (lhs: Duration, rhs: Duration) -> Bool { + return lhs.seconds == rhs.seconds && lhs.nanoseconds == rhs.nanoseconds + } + static func < (lhs: Duration, rhs: Duration) -> Bool { + return lhs.seconds < rhs.seconds || ( + lhs.seconds == rhs.seconds + && lhs.nanoseconds < rhs.nanoseconds + ) + } } /// Internal representation of a timestamp for CooperativeExecutor @@ -163,11 +234,6 @@ class CooperativeExecutor: Executor, @unchecked Sendable { public init() { runQueue = PriorityQueue(compare: { $0.priority > $1.priority }) - waitQueue = - PriorityQueue(compare: { - ExecutorJob($0).cooperativeExecutorTimestamp - < ExecutorJob($1).cooperativeExecutorTimestamp - }) } public func enqueue(_ job: consuming ExecutorJob) { @@ -175,17 +241,21 @@ class CooperativeExecutor: Executor, @unchecked Sendable { } public var isMainExecutor: Bool { true } - - public var asSchedulable: any SchedulableExecutor { self } } +#if !$Embedded && !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY @available(StdlibDeploymentTarget 6.2, *) -extension CooperativeExecutor: SchedulableExecutor { - var currentTime: Timestamp { +extension CooperativeExecutor: SchedulingExecutor { + + public var asScheduling: (any SchedulingExecutor)? { + return self + } + + func currentTime(clock: _ClockID) -> Timestamp { var now: Timestamp = .zero unsafe _getTime(seconds: &now.seconds, nanoseconds: &now.nanoseconds, - clock: _ClockID.suspending.rawValue) + clock: clock.rawValue) return now } @@ -193,14 +263,24 @@ extension CooperativeExecutor: SchedulableExecutor { after delay: C.Duration, tolerance: C.Duration? = nil, clock: C) { - let duration = Duration(from: clock.convert(from: delay)!) - let deadline = self.currentTime + duration - - job.setupCooperativeExecutorTimestamp() - job.cooperativeExecutorTimestamp = deadline - waitQueue.push(UnownedJob(job)) + // If it's a clock we know, get the duration to wait + if let _ = clock as? ContinuousClock { + let continuousDuration = delay as! ContinuousClock.Duration + let duration = Duration(from: continuousDuration) + continuousWaitQueue.enqueue(job, after: duration) + } else if let _ = clock as? SuspendingClock { + let suspendingDuration = delay as! SuspendingClock.Duration + let duration = Duration(from: suspendingDuration) + suspendingWaitQueue.enqueue(job, after: duration) + } else { + clock.enqueue(job, on: self, at: clock.now.advanced(by: delay), + tolerance: tolerance) + return + } } + } +#endif @available(StdlibDeploymentTarget 6.2, *) extension CooperativeExecutor: RunLoopExecutor { @@ -211,36 +291,47 @@ extension CooperativeExecutor: RunLoopExecutor { public func runUntil(_ condition: () -> Bool) throws { shouldStop = false while !shouldStop && !condition() { - // Process the timer queue - let now = currentTime - while let job = waitQueue.pop(when: { - ExecutorJob($0).cooperativeExecutorTimestamp <= now - }) { - var theJob = ExecutorJob(job) - theJob.clearCooperativeExecutorTimestamp() - runQueue.push(job) + #if !$Embedded && !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY + // Process the timer queues + suspendingWaitQueue.forEachReadyJob { + runQueue.push(UnownedJob($0)) + } + continuousWaitQueue.forEachReadyJob { + runQueue.push(UnownedJob($0)) } + #endif // Now run any queued jobs - while let job = runQueue.pop() { + var runQ = runQueue.take() + while let job = runQ.pop() { unsafe ExecutorJob(job).runSynchronously( on: self.asUnownedSerialExecutor() ) } + #if !$Embedded && !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY // Finally, wait until the next deadline - if let job = waitQueue.top { - let deadline = ExecutorJob(job).cooperativeExecutorTimestamp - let now = self.currentTime - if deadline > now { - let toWait = deadline - now - _sleep(seconds: toWait.seconds, - nanoseconds: toWait.nanoseconds) + var toWait: Duration? = suspendingWaitQueue.timeToNextJob + + if let continuousToWait = continuousWaitQueue.timeToNextJob { + if toWait == nil || continuousToWait < toWait! { + toWait = continuousToWait } - } else { + } + + if let toWait { + _sleep(seconds: toWait.seconds, + nanoseconds: toWait.nanoseconds) + } else if runQueue.isEmpty { + // Stop if no more jobs are available + break + } + #else // $Embedded || SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY + if runQueue.isEmpty { // Stop if no more jobs are available break } + #endif } } diff --git a/stdlib/public/Concurrency/DispatchExecutor.swift b/stdlib/public/Concurrency/DispatchExecutor.swift index 8ba61976f1d4a..0910848ccd96b 100644 --- a/stdlib/public/Concurrency/DispatchExecutor.swift +++ b/stdlib/public/Concurrency/DispatchExecutor.swift @@ -23,8 +23,10 @@ import Swift // .. Main Executor ............................................................ +/// A Dispatch-based main executor. @available(StdlibDeploymentTarget 6.2, *) -public class DispatchMainExecutor: RunLoopExecutor, @unchecked Sendable { +class DispatchMainExecutor: RunLoopExecutor, SchedulingExecutor, + @unchecked Sendable { var threaded = false public init() {} @@ -41,6 +43,18 @@ public class DispatchMainExecutor: RunLoopExecutor, @unchecked Sendable { public func stop() { fatalError("DispatchMainExecutor cannot be stopped") } + + var asScheduling: (any SchedulingExecutor)? { + return self + } + + public func enqueue(_ job: consuming ExecutorJob, + at instant: C.Instant, + tolerance: C.Duration? = nil, + clock: C) { + _dispatchEnqueue(job, at: instant, tolerance: tolerance, clock: clock, + executor: self, global: false) + } } @available(StdlibDeploymentTarget 6.2, *) @@ -57,42 +71,15 @@ extension DispatchMainExecutor: SerialExecutor { } } -@available(StdlibDeploymentTarget 6.2, *) -extension DispatchMainExecutor: SchedulableExecutor { - public var asSchedulable: SchedulableExecutor? { - return self - } - - public func enqueue(_ job: consuming ExecutorJob, - at instant: C.Instant, - tolerance: C.Duration? = nil, - clock: C) { - let tolSec, tolNanosec: CLongLong - if let tolerance = tolerance { - (tolSec, tolNanosec) = delay(from: tolerance, clock: clock) - } else { - tolSec = 0 - tolNanosec = -1 - } - - let (clockID, seconds, nanoseconds) = timestamp(for: instant, clock: clock) - - _dispatchEnqueueWithDeadline(CBool(false), - CLongLong(seconds), CLongLong(nanoseconds), - CLongLong(tolSec), CLongLong(tolNanosec), - clockID.rawValue, - UnownedJob(job)) - } -} - @available(StdlibDeploymentTarget 6.2, *) extension DispatchMainExecutor: MainExecutor {} // .. Task Executor ............................................................ +/// A Dispatch-based `TaskExecutor` @available(StdlibDeploymentTarget 6.2, *) -public class DispatchGlobalTaskExecutor: TaskExecutor, SchedulableExecutor, - @unchecked Sendable { +class DispatchGlobalTaskExecutor: TaskExecutor, SchedulingExecutor, + @unchecked Sendable { public init() {} public func enqueue(_ job: consuming ExecutorJob) { @@ -101,112 +88,98 @@ public class DispatchGlobalTaskExecutor: TaskExecutor, SchedulableExecutor, public var isMainExecutor: Bool { false } + var asScheduling: (any SchedulingExecutor)? { + return self + } + public func enqueue(_ job: consuming ExecutorJob, at instant: C.Instant, tolerance: C.Duration? = nil, clock: C) { - let tolSec, tolNanosec: CLongLong - if let tolerance = tolerance { - (tolSec, tolNanosec) = delay(from: tolerance, clock: clock) - } else { - tolSec = 0 - tolNanosec = -1 - } - - let (clockID, seconds, nanoseconds) = timestamp(for: instant, clock: clock) - - _dispatchEnqueueWithDeadline(CBool(true), - CLongLong(seconds), CLongLong(nanoseconds), - CLongLong(tolSec), CLongLong(tolNanosec), - clockID.rawValue, - UnownedJob(job)) + _dispatchEnqueue(job, at: instant, tolerance: tolerance, clock: clock, + executor: self, global: true) } } // .. Clock Support ............................................................ -/// DispatchMainExecutor and DispatchTaskExecutor both implement this -/// protocol. -/// -/// It is used to help convert instants and durations from arbitrary `Clock`s -/// to Dispatch's time base. -@available(StdlibDeploymentTarget 6.2, *) -protocol DispatchExecutorProtocol: Executor { - - /// Convert an `Instant` from the specified clock to a tuple identifying - /// the Dispatch clock and the seconds and nanoseconds components. - /// - /// Parameters: - /// - /// - for instant: The `Instant` to convert. - /// - clock: The `Clock` instant that the `Instant` came from. - /// - /// Returns: A tuple of `(clockID, seconds, nanoseconds)`. - func timestamp(for instant: C.Instant, clock: C) - -> (clockID: DispatchClockID, seconds: Int64, nanoseconds: Int64) - - /// Convert a `Duration` from the specified clock to a tuple containing - /// seconds and nanosecond components. - func delay(from duration: C.Duration, clock: C) - -> (seconds: Int64, nanoseconds: Int64) - -} - /// An enumeration identifying one of the Dispatch-supported clocks enum DispatchClockID: CInt { case continuous = 1 case suspending = 2 + case walltime = 3 } -@available(StdlibDeploymentTarget 6.2, *) -extension DispatchExecutorProtocol { - - func clamp(_ components: (seconds: Int64, attoseconds: Int64)) - -> (seconds: Int64, attoseconds: Int64) { - if components.seconds < 0 - || components.seconds == 0 && components.attoseconds < 0 { - return (seconds: 0, attoseconds: 0) - } - return (seconds: components.seconds, attoseconds: components.attoseconds) +fileprivate func clamp(_ components: (seconds: Int64, attoseconds: Int64)) + -> (seconds: Int64, attoseconds: Int64) { + if components.seconds < 0 + || components.seconds == 0 && components.attoseconds < 0 { + return (seconds: 0, attoseconds: 0) } + return (seconds: components.seconds, attoseconds: components.attoseconds) +} - func timestamp(for instant: C.Instant, clock: C) - -> (clockID: DispatchClockID, seconds: Int64, nanoseconds: Int64) { - if clock.traits.contains(.continuous) { - let dispatchClock: ContinuousClock = .continuous - let instant = dispatchClock.convert(instant: instant, from: clock)! - let (seconds, attoseconds) = clamp(instant._value.components) - let nanoseconds = attoseconds / 1_000_000_000 - return (clockID: .continuous, - seconds: Int64(seconds), - nanoseconds: Int64(nanoseconds)) - } else { - let dispatchClock: SuspendingClock = .suspending - let instant = dispatchClock.convert(instant: instant, from: clock)! - let (seconds, attoseconds) = clamp(instant._value.components) - let nanoseconds = attoseconds / 1_000_000_000 - return (clockID: .suspending, - seconds: Int64(seconds), - nanoseconds: Int64(nanoseconds)) - } - } +fileprivate func delay(from duration: Swift.Duration) -> ( + seconds: Int64, nanoseconds: Int64 +) { + let (seconds, attoseconds) = clamp(duration.components) + let nanoseconds = attoseconds / 1_000_000_000 + return (seconds: seconds, nanoseconds: nanoseconds) +} - func delay(from duration: C.Duration, clock: C) - -> (seconds: Int64, nanoseconds: Int64) { - let swiftDuration = clock.convert(from: duration)! - let (seconds, attoseconds) = clamp(swiftDuration.components) - let nanoseconds = attoseconds / 1_000_000_000 - return (seconds: seconds, nanoseconds: nanoseconds) +fileprivate func timestamp(for instant: C.Instant, clock: C) + -> (clockID: _ClockID, seconds: Int64, nanoseconds: Int64)? { + if let continuousClock = clock as? ContinuousClock { + return continuousClock.timestamp(for: instant as! ContinuousClock.Instant) + } else if let suspendingClock = clock as? SuspendingClock { + return suspendingClock.timestamp(for: instant as! SuspendingClock.Instant) } - + return nil } -@available(StdlibDeploymentTarget 6.2, *) -extension DispatchGlobalTaskExecutor: DispatchExecutorProtocol { +fileprivate func durationComponents(for duration: C.Duration, clock: C) + -> (seconds: Int64, nanoseconds: Int64) { + if let continuousClock = clock as? ContinuousClock { + return continuousClock.durationComponents(for: duration as! ContinuousClock.Duration) + } else if let suspendingClock = clock as? SuspendingClock { + return suspendingClock.durationComponents(for: duration as! SuspendingClock.Duration) + } + // This shouldn't be reachable + fatalError("unknown clock in Dispatch Executor") } @available(StdlibDeploymentTarget 6.2, *) -extension DispatchMainExecutor: DispatchExecutorProtocol { +fileprivate func _dispatchEnqueue( + _ job: consuming ExecutorJob, + at instant: C.Instant, + tolerance: C.Duration?, + clock: C, + executor: E, + global: Bool +) { + // If it's a clock we know, convert it to something we can use; otherwise, + // call the clock's `enqueue` function to schedule the enqueue of the job. + + guard let (clockID, seconds, nanoseconds) = timestamp(for: instant, + clock: clock) else { + clock.enqueue(job, on: executor, at: instant, tolerance: tolerance) + return + } + + let tolSec: Int64, tolNanosec: Int64 + if let tolerance = tolerance { + (tolSec, tolNanosec) = durationComponents(for: tolerance, + clock: clock) + } else { + tolSec = 0 + tolNanosec = -1 + } + + _dispatchEnqueueWithDeadline(CBool(global), + CLongLong(seconds), CLongLong(nanoseconds), + CLongLong(tolSec), CLongLong(tolNanosec), + clockID.rawValue, + UnownedJob(job)) } #endif // !$Embedded && !os(WASI) diff --git a/stdlib/public/Concurrency/Executor.swift b/stdlib/public/Concurrency/Executor.swift index 645e3791cc348..c69bb27ba6dca 100644 --- a/stdlib/public/Concurrency/Executor.swift +++ b/stdlib/public/Concurrency/Executor.swift @@ -41,10 +41,21 @@ public protocol Executor: AnyObject, Sendable { @available(StdlibDeploymentTarget 6.2, *) var isMainExecutor: Bool { get } #endif // os(WASI) || !$Embedded + + #if !$Embedded + /// Return this executable as a SchedulingExecutor, or nil if that is + /// unsupported. + /// + /// Executors that implement SchedulingExecutor should provide their + /// own copy of this method, which will allow the compiler to avoid a + /// potentially expensive runtime cast. + @available(StdlibDeploymentTarget 6.2, *) + var asSchedulingExecutor: (any SchedulingExecutor)? { get } + #endif } @available(StdlibDeploymentTarget 6.2, *) -public protocol SchedulableExecutor: Executor { +public protocol SchedulingExecutor: Executor { #if !$Embedded && !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY @@ -119,16 +130,20 @@ extension Actor { } extension Executor { - /// Return this executable as a SchedulableExecutor, or nil if that is + + #if !$Embedded + /// Return this executor as a SchedulingExecutor, or nil if that is /// unsupported. /// - /// Executors that implement SchedulableExecutor should provide their + /// Executors that implement SchedulingExecutor should provide their /// own copy of this method, which will allow the compiler to avoid a /// potentially expensive runtime cast. @available(StdlibDeploymentTarget 6.2, *) - var asSchedulable: SchedulableExecutor? { - return self as? SchedulableExecutor + public var asSchedulingExecutor: (any SchedulingExecutor)? { + return self as? SchedulingExecutor } + #endif + } extension Executor { @@ -155,7 +170,7 @@ extension Executor { // Delay support @available(StdlibDeploymentTarget 6.2, *) -extension SchedulableExecutor { +extension SchedulingExecutor { #if !$Embedded && !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY @@ -567,7 +582,7 @@ extension RunLoopExecutor { } -/// The main executor must conform to these three protocols; we have to +/// The main executor must conform to these two protocols; we have to /// make this a protocol for compatibility with Embedded Swift. @available(StdlibDeploymentTarget 6.2, *) public protocol MainExecutor: RunLoopExecutor, SerialExecutor { @@ -693,30 +708,32 @@ extension Task where Success == Never, Failure == Never { return nil } - /// Get the current *schedulable* executor, if any. + #if !$Embedded + /// Get the current *scheduling* executor, if any. /// /// This follows the same logic as `currentExecutor`, except that it ignores - /// any executor that isn't a `SchedulableExecutor`. + /// any executor that isn't a `SchedulingExecutor`. @available(StdlibDeploymentTarget 6.2, *) - @_unavailableInEmbedded - public static var currentSchedulableExecutor: (any SchedulableExecutor)? { + public static var currentSchedulingExecutor: (any SchedulingExecutor)? { if let activeExecutor = unsafe _getActiveExecutor().asSerialExecutor(), - let schedulable = activeExecutor.asSchedulable { - return schedulable + let scheduling = activeExecutor.asSchedulingExecutor { + return scheduling } if let taskExecutor = unsafe _getPreferredTaskExecutor().asTaskExecutor(), - let schedulable = taskExecutor.asSchedulable { - return schedulable + let scheduling = taskExecutor.asSchedulingExecutor { + return scheduling } if let taskExecutor = unsafe _getCurrentTaskExecutor().asTaskExecutor(), - let schedulable = taskExecutor.asSchedulable { - return schedulable + let scheduling = taskExecutor.asSchedulingExecutor { + return scheduling } - if let schedulable = defaultExecutor.asSchedulable { - return schedulable + if let scheduling = defaultExecutor.asSchedulingExecutor { + return scheduling } return nil } + #endif + } diff --git a/stdlib/public/Concurrency/ExecutorImpl.swift b/stdlib/public/Concurrency/ExecutorImpl.swift index 112a200860a3a..52ed84d0f71ef 100644 --- a/stdlib/public/Concurrency/ExecutorImpl.swift +++ b/stdlib/public/Concurrency/ExecutorImpl.swift @@ -47,7 +47,7 @@ internal func donateToGlobalExecutor( @available(SwiftStdlib 6.2, *) @_silgen_name("swift_task_getMainExecutorImpl") internal func getMainExecutor() -> UnownedSerialExecutor { - return _getMainExecutorAsSerialExecutor() + return unsafe _getMainExecutorAsSerialExecutor() } @available(SwiftStdlib 6.2, *) @@ -72,9 +72,9 @@ internal func enqueueOnGlobalExecutor(job unownedJob: UnownedJob) { internal func enqueueOnGlobalExecutor(delay: CUnsignedLongLong, job unownedJob: UnownedJob) { #if !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY - Task.defaultExecutor.asSchedulable!.enqueue(ExecutorJob(unownedJob), - after: .nanoseconds(delay), - clock: .continuous) + Task.defaultExecutor.asSchedulingExecutor!.enqueue(ExecutorJob(unownedJob), + after: .nanoseconds(delay), + clock: .continuous) #else fatalError("swift_task_enqueueGlobalWithDelay() not supported for task-to-thread") #endif @@ -93,15 +93,15 @@ internal func enqueueOnGlobalExecutor(seconds: CLongLong, let leeway = Duration.seconds(leewaySeconds) + Duration.nanoseconds(leewayNanoseconds) switch clock { case _ClockID.suspending.rawValue: - Task.defaultExecutor.asSchedulable!.enqueue(ExecutorJob(unownedJob), - after: delay, - tolerance: leeway, - clock: .suspending) + Task.defaultExecutor.asSchedulingExecutor!.enqueue(ExecutorJob(unownedJob), + after: delay, + tolerance: leeway, + clock: .suspending) case _ClockID.continuous.rawValue: - Task.defaultExecutor.asSchedulable!.enqueue(ExecutorJob(unownedJob), - after: delay, - tolerance: leeway, - clock: .continuous) + Task.defaultExecutor.asSchedulingExecutor!.enqueue(ExecutorJob(unownedJob), + after: delay, + tolerance: leeway, + clock: .continuous) default: fatalError("Unknown clock ID \(clock)") } diff --git a/stdlib/public/Concurrency/PartialAsyncTask.swift b/stdlib/public/Concurrency/PartialAsyncTask.swift index c319847a69cc2..b403d88c39f45 100644 --- a/stdlib/public/Concurrency/PartialAsyncTask.swift +++ b/stdlib/public/Concurrency/PartialAsyncTask.swift @@ -318,7 +318,9 @@ public struct ExecutorJob: Sendable, ~Copyable { } /// Execute a closure, passing it the bounds of the executor private data - /// for the job. + /// for the job. The executor is responsible for ensuring that any resources + /// referenced from the private data area are cleared up prior to running the + /// job. /// /// Parameters: /// @@ -450,6 +452,48 @@ extension ExecutorJob { } } +// Helper to create a trampoline job to execute a job on a specified +// executor. +extension ExecutorJob { + + /// Create a trampoline to enqueue the specified job on the specified + /// executor. + /// + /// This is useful in conjunction with the `Clock.run()` API, which + /// runs a job on an unspecified executor. + /// + /// Parameters: + /// + /// - to executor: The `Executor` on which it should be enqueued. + /// + /// Returns: + /// + /// A new ExecutorJob that will enqueue the specified job on the specified + /// executor. + @available(StdlibDeploymentTarget 6.2, *) + public func createTrampoline(to executor: some Executor) -> ExecutorJob { + let flags = taskCreateFlags( + priority: TaskPriority(priority), + isChildTask: false, + copyTaskLocals: false, + inheritContext: false, + enqueueJob: false, + addPendingGroupTaskUnconditionally: false, + isDiscardingTask: false, + isSynchronousStart: false + ) + + let unownedJob = UnownedJob(context: self.context) + let (trampolineTask, _) = Builtin.createAsyncTask(flags) { + executor.enqueue(unownedJob) + } + let trampoline = Builtin.convertTaskToJob(trampolineTask) + + return ExecutorJob(context: trampoline) + } + +} + // Stack-disciplined job-local allocator support @available(StdlibDeploymentTarget 6.2, *) extension ExecutorJob { @@ -468,9 +512,8 @@ extension ExecutorJob { /// A job-local stack-disciplined allocator. /// /// This can be used to allocate additional data required by an - /// executor implementation; memory allocated in this manner will - /// be released automatically when the job is disposed of by the - /// runtime. + /// executor implementation; memory allocated in this manner must + /// be released by the executor before the job is executed. /// /// N.B. Because this allocator is stack disciplined, explicitly /// deallocating memory out-of-order will cause your program to abort. @@ -498,23 +541,20 @@ extension ExecutorJob { return unsafe UnsafeMutableBufferPointer(start: typedBase, count: capacity) } - /// Deallocate previously allocated memory. Note that the task - /// allocator is stack disciplined, so if you deallocate a block of - /// memory, all memory allocated after that block is also deallocated. + /// Deallocate previously allocated memory. You must do this in + /// reverse order of allocations, prior to running the job. public func deallocate(_ buffer: UnsafeMutableRawBufferPointer) { unsafe _jobDeallocate(context, buffer.baseAddress!) } - /// Deallocate previously allocated memory. Note that the task - /// allocator is stack disciplined, so if you deallocate a block of - /// memory, all memory allocated after that block is also deallocated. + /// Deallocate previously allocated memory. You must do this in + /// reverse order of allocations, prior to running the job. public func deallocate(_ pointer: UnsafeMutablePointer) { unsafe _jobDeallocate(context, UnsafeMutableRawPointer(pointer)) } - /// Deallocate previously allocated memory. Note that the task - /// allocator is stack disciplined, so if you deallocate a block of - /// memory, all memory allocated after that block is also deallocated. + /// Deallocate previously allocated memory. You must do this in + /// reverse order of allocations, prior to running the job. public func deallocate(_ buffer: UnsafeMutableBufferPointer) { unsafe _jobDeallocate(context, UnsafeMutableRawPointer(buffer.baseAddress!)) } diff --git a/stdlib/public/Concurrency/PriorityQueue.swift b/stdlib/public/Concurrency/PriorityQueue.swift index 744c9c4c257a2..b3839167ae823 100644 --- a/stdlib/public/Concurrency/PriorityQueue.swift +++ b/stdlib/public/Concurrency/PriorityQueue.swift @@ -40,6 +40,15 @@ struct PriorityQueue { self.compare = compare } + /// Take the queue. + /// + /// This returns a copy of the queue, and empties the original. + mutating func take() -> PriorityQueue { + var q = PriorityQueue(compare: self.compare) + swap(&self, &q) + return q + } + /// Push an item onto the queue. /// /// Parameters: @@ -51,6 +60,11 @@ struct PriorityQueue { upHeap(ndx: storage.count - 1) } + /// Return `true` if the queue is empty + var isEmpty: Bool { + return storage.isEmpty + } + /// The highest priority item from the queue, or `nil` if none. var top: T? { if storage.isEmpty { diff --git a/stdlib/public/Concurrency/SuspendingClock.swift b/stdlib/public/Concurrency/SuspendingClock.swift index 0f63aa0fa697f..6696ae7767d41 100644 --- a/stdlib/public/Concurrency/SuspendingClock.swift +++ b/stdlib/public/Concurrency/SuspendingClock.swift @@ -87,12 +87,6 @@ extension SuspendingClock: Clock { return Duration(_seconds: seconds, nanoseconds: nanoseconds) } - /// The suspending clock is monotonic - @available(StdlibDeploymentTarget 6.2, *) - public var traits: ClockTraits { - return [.monotonic] - } - #if !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY /// Suspend task execution until a given deadline within a tolerance. /// If no tolerance is specified then the system may adjust the deadline @@ -195,3 +189,36 @@ extension SuspendingClock.Instant: InstantProtocol { rhs.duration(to: lhs) } } + +#if !$Embedded && !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY +@available(StdlibDeploymentTarget 6.2, *) +extension SuspendingClock { + + public func run(_ job: consuming ExecutorJob, + at instant: Instant, + tolerance: Duration?) { + guard let executor = Task.currentSchedulingExecutor else { + fatalError("no scheduling executor is available") + } + + executor.enqueue(job, at: instant, + tolerance: tolerance, + clock: self) + } + + public func enqueue(_ job: consuming ExecutorJob, + on executor: some Executor, + at instant: Instant, + tolerance: Duration?) { + if let schedulingExecutor = executor.asSchedulingExecutor { + schedulingExecutor.enqueue(job, at: instant, + tolerance: tolerance, + clock: self) + } else { + let trampoline = job.createTrampoline(to: executor) + run(trampoline, at: instant, tolerance: tolerance) + } + } + +} +#endif diff --git a/stdlib/public/Concurrency/TaskSleep.swift b/stdlib/public/Concurrency/TaskSleep.swift index c40483bfb4a70..b9994e01698eb 100644 --- a/stdlib/public/Concurrency/TaskSleep.swift +++ b/stdlib/public/Concurrency/TaskSleep.swift @@ -30,7 +30,7 @@ extension Task where Success == Never, Failure == Never { if #available(StdlibDeploymentTarget 6.2, *) { #if !$Embedded - if let executor = Task.currentSchedulableExecutor { + if let executor = Task.currentSchedulingExecutor { executor.enqueue(ExecutorJob(context: job), after: .nanoseconds(duration), clock: .continuous) @@ -39,7 +39,7 @@ extension Task where Success == Never, Failure == Never { #endif } - // If there is no current schedulable executor, fall back to + // If there is no current scheduling executor, fall back to // _enqueueJobGlobalWithDelay() _enqueueJobGlobalWithDelay(duration, job) } @@ -274,7 +274,7 @@ extension Task where Success == Never, Failure == Never { if #available(StdlibDeploymentTarget 6.2, *) { #if !$Embedded - if let executor = Task.currentSchedulableExecutor { + if let executor = Task.currentSchedulingExecutor { executor.enqueue(ExecutorJob(context: job), after: .nanoseconds(duration), clock: .continuous) @@ -283,7 +283,7 @@ extension Task where Success == Never, Failure == Never { #endif } - // If there is no current schedulable executor, fall back to + // If there is no current scheduling executor, fall back to // _enqueueJobGlobalWithDelay() _enqueueJobGlobalWithDelay(duration, job) return diff --git a/stdlib/public/Concurrency/TaskSleepDuration.swift b/stdlib/public/Concurrency/TaskSleepDuration.swift index 7508103149d2d..27f35eb321b7c 100644 --- a/stdlib/public/Concurrency/TaskSleepDuration.swift +++ b/stdlib/public/Concurrency/TaskSleepDuration.swift @@ -13,45 +13,64 @@ import Swift #if !SWIFT_STDLIB_TASK_TO_THREAD_MODEL_CONCURRENCY -@available(StdlibDeploymentTarget 5.7, *) -fileprivate func timestamp(for instant: C.Instant, clock: C) - -> (clockID: _ClockID, seconds: Int64, nanoseconds: Int64) { - var clockID: _ClockID - if #available(StdlibDeploymentTarget 6.2, *) { - if clock.traits.contains(.continuous) { - clockID = .continuous - } else { - clockID = .suspending - } - } else { - fatalError("we shouldn't get here; if we have, availability is broken") +@_unavailableInEmbedded +extension ContinuousClock { + func timestamp(for instant: Instant) + -> (clockID: _ClockID, seconds: Int64, nanoseconds: Int64) + { + let (seconds, nanoseconds) = durationComponents(for: instant._value) + return (clockID: .continuous, seconds: seconds, nanoseconds: nanoseconds) + } + + func durationComponents(for duration: Duration) + -> (seconds: Int64, nanoseconds: Int64) + { + let (seconds, attoseconds) = duration.components + let nanoseconds = attoseconds / 1_000_000_000 + return (seconds: seconds, nanoseconds: nanoseconds) + } +} + +@_unavailableInEmbedded +extension SuspendingClock { + func timestamp(for instant: Instant) + -> (clockID: _ClockID, seconds: Int64, nanoseconds: Int64) + { + let (seconds, nanoseconds) = durationComponents(for: instant._value) + return (clockID: .suspending, seconds: seconds, nanoseconds: nanoseconds) } - var seconds: Int64 = 0 - var nanoseconds: Int64 = 0 - unsafe _getTime(seconds: &seconds, - nanoseconds: &nanoseconds, - clock: clockID.rawValue) - - let delta: Swift.Duration - if #available(StdlibDeploymentTarget 6.2, *) { - delta = clock.convert(from: clock.now.duration(to: instant))! - } else { - fatalError("we shouldn't get here; if we have, availability is broken") + func durationComponents(for duration: Duration) + -> (seconds: Int64, nanoseconds: Int64) + { + let (seconds, attoseconds) = duration.components + let nanoseconds = attoseconds / 1_000_000_000 + return (seconds: seconds, nanoseconds: nanoseconds) } +} - let (deltaSeconds, deltaAttoseconds) = delta.components - let deltaNanoseconds = deltaAttoseconds / 1_000_000_000 - seconds += deltaSeconds - nanoseconds += deltaNanoseconds - if nanoseconds > 1_000_000_000 { - seconds += 1 - nanoseconds -= 1_000_000_000 +fileprivate func timestamp(for instant: C.Instant, clock: C) + -> (clockID: _ClockID, seconds: Int64, nanoseconds: Int64) { + #if !$Embedded + if let continuousClock = clock as? ContinuousClock { + return continuousClock.timestamp(for: instant as! ContinuousClock.Instant) + } else if let suspendingClock = clock as? SuspendingClock { + return suspendingClock.timestamp(for: instant as! SuspendingClock.Instant) } + #endif + fatalError("unknown clock in fallback path") +} - return (clockID: clockID, - seconds: Int64(seconds), - nanoseconds: Int64(nanoseconds)) +fileprivate func durationComponents(for duration: C.Duration, clock: C) + -> (seconds: Int64, nanoseconds: Int64) { + #if !$Embedded + if let continuousClock = clock as? ContinuousClock { + return continuousClock.durationComponents(for: duration as! ContinuousClock.Duration) + } else if let suspendingClock = clock as? SuspendingClock { + return suspendingClock.durationComponents(for: duration as! SuspendingClock.Duration) + } + #endif + fatalError("unknown clock in fallback path") } @available(StdlibDeploymentTarget 5.7, *) @@ -99,7 +118,7 @@ extension Task where Success == Never, Failure == Never { if #available(StdlibDeploymentTarget 6.2, *) { #if !$Embedded - if let executor = Task.currentSchedulableExecutor { + if let executor = Task.currentSchedulingExecutor { executor.enqueue(ExecutorJob(context: job), at: instant, tolerance: tolerance, @@ -111,17 +130,16 @@ extension Task where Success == Never, Failure == Never { fatalError("we shouldn't get here; if we have, availability is broken") } - // If there is no current schedulable executor, fall back to + // If there is no current scheduling executor, fall back to // calling _enqueueJobGlobalWithDeadline(). let (clockID, seconds, nanoseconds) = timestamp(for: instant, clock: clock) let toleranceSeconds: Int64 let toleranceNanoseconds: Int64 if #available(StdlibDeploymentTarget 6.2, *) { - if let tolerance = tolerance, - let components = clock.convert(from: tolerance)?.components { - toleranceSeconds = components.seconds - toleranceNanoseconds = components.attoseconds / 1_000_000_000 + if let tolerance = tolerance { + (toleranceSeconds, toleranceNanoseconds) + = durationComponents(for: tolerance, clock: clock) } else { toleranceSeconds = 0 toleranceNanoseconds = -1 diff --git a/test/Concurrency/Runtime/async_task_executor_nsobject.swift b/test/Concurrency/Runtime/async_task_executor_nsobject.swift index 61a825e5f3e1b..5e06580942017 100644 --- a/test/Concurrency/Runtime/async_task_executor_nsobject.swift +++ b/test/Concurrency/Runtime/async_task_executor_nsobject.swift @@ -24,7 +24,7 @@ import Darwin // This test specifically checks that our reference counting accounts for existence of // objective-c types as TaskExecutors -- which was a bug where we'd swift_release // obj-c excecutors by accident (rdar://131151645). -final class NSQueueTaskExecutor: NSData, TaskExecutor, SchedulableExecutor, @unchecked Sendable { +final class NSQueueTaskExecutor: NSData, TaskExecutor, SchedulingExecutor, @unchecked Sendable { public func enqueue(_ _job: consuming ExecutorJob) { let job = UnownedJob(_job) DispatchQueue.main.async { @@ -37,7 +37,7 @@ final class NSQueueTaskExecutor: NSData, TaskExecutor, SchedulableExecutor, @unc tolerance: C.Duration? = nil, clock: C) { // Convert to `Swift.Duration` - let duration = clock.convert(from: delay)! + let duration = delay as! Swift.Duration // Now turn that into nanoseconds let (seconds, attoseconds) = duration.components diff --git a/test/Concurrency/Runtime/clocks.swift b/test/Concurrency/Runtime/clocks.swift deleted file mode 100644 index 45083e7ea610c..0000000000000 --- a/test/Concurrency/Runtime/clocks.swift +++ /dev/null @@ -1,278 +0,0 @@ -// RUN: %target-run-simple-swift(%import-libdispatch -parse-as-library) -// RUN: %target-run-simple-swift(%import-libdispatch -parse-as-library -swift-version 5 -strict-concurrency=complete -enable-upcoming-feature NonisolatedNonsendingByDefault) -// REQUIRES: swift_feature_NonisolatedNonsendingByDefault - -// REQUIRES: concurrency -// REQUIRES: executable_test - -// rdar://106849189 move-only types should be supported in freestanding mode -// UNSUPPORTED: freestanding - -// UNSUPPORTED: back_deployment_runtime -// REQUIRES: concurrency_runtime - -import StdlibUnittest - -@available(SwiftStdlib 6.2, *) -struct TickingClock: Clock { - struct Duration: DurationProtocol { - var ticks: Int - - static func / (_ lhs: Self, _ rhs: Int) -> Self { - return Duration(ticks: lhs.ticks / rhs) - } - static func * (_ lhs: Self, rhs: Int) -> Self { - return Duration(ticks: lhs.ticks * rhs) - } - static func / (_ lhs: Self, _ rhs: Self) -> Double { - return Double(lhs.ticks) / Double(rhs.ticks) - } - static func < (_ lhs: Self, _ rhs: Self) -> Bool { - return lhs.ticks < rhs.ticks - } - static func + (_ lhs: Self, _ rhs: Self) -> Self { - return Duration(ticks: lhs.ticks + rhs.ticks) - } - static func - (_ lhs: Self, _ rhs: Self) -> Self { - return Duration(ticks: lhs.ticks - rhs.ticks) - } - - static var zero: Self { - return Duration(ticks: 0) - } - } - struct Instant: InstantProtocol { - typealias Duration = TickingClock.Duration - var ticksFromStart: Int - - func advanced(by duration: Duration) -> Self { - return Instant(ticksFromStart: self.ticksFromStart + duration.ticks) - } - func duration(to other: Self) -> Duration { - return Duration(ticks: other.ticksFromStart - self.ticksFromStart) - } - - static func < (_ lhs: Self, _ rhs: Self) -> Bool { - return lhs.ticksFromStart < rhs.ticksFromStart - } - } - - private var _now: Instant - var now: Instant { return _now } - var minimumResolution: Duration { return Duration(ticks: 1) } - var traits: ClockTraits { [.monotonic] } - - init() { - _now = Instant(ticksFromStart: 0) - } - - // These are a bit of a lie, since this clock is weird and doesn't - // actually tell the time; for the purposes of this test, we pretend - // that the ticks are 20ms. - func convert(from duration: Duration) -> Swift.Duration? { - return .seconds(Double(duration.ticks) / 50) - } - - func convert(from duration: Swift.Duration) -> Duration? { - let (seconds, attoseconds) = duration.components - let extraTicks = attoseconds / 20_000_000_000_000_000 - return Duration(ticks: Int(seconds * 50) + Int(extraTicks)) - } - - mutating func tick() { - _now.ticksFromStart += 1 - } - - func sleep( - until instant: Instant, - tolerance: Duration? = nil - ) async throws { - // Do nothing - } -} - -@available(SwiftStdlib 6.2, *) -struct TockingClock: Clock { - struct Duration: DurationProtocol { - var tocks: Int - - static func / (_ lhs: Self, _ rhs: Int) -> Self { - return Duration(tocks: lhs.tocks / rhs) - } - static func * (_ lhs: Self, rhs: Int) -> Self { - return Duration(tocks: lhs.tocks * rhs) - } - static func / (_ lhs: Self, _ rhs: Self) -> Double { - return Double(lhs.tocks) / Double(rhs.tocks) - } - static func < (_ lhs: Self, _ rhs: Self) -> Bool { - return lhs.tocks < rhs.tocks - } - static func + (_ lhs: Self, _ rhs: Self) -> Self { - return Duration(tocks: lhs.tocks + rhs.tocks) - } - static func - (_ lhs: Self, _ rhs: Self) -> Self { - return Duration(tocks: lhs.tocks - rhs.tocks) - } - - static var zero: Self { - return Duration(tocks: 0) - } - } - struct Instant: InstantProtocol { - typealias Duration = TockingClock.Duration - var tocksFromStart: Int - - func advanced(by duration: Duration) -> Self { - return Instant(tocksFromStart: self.tocksFromStart + duration.tocks) - } - func duration(to other: Self) -> Duration { - return Duration(tocks: other.tocksFromStart - self.tocksFromStart) - } - - static func < (_ lhs: Self, _ rhs: Self) -> Bool { - return lhs.tocksFromStart < rhs.tocksFromStart - } - } - - private var _now: Instant - var now: Instant { return _now } - var minimumResolution: Duration { return Duration(tocks: 1) } - var traits: ClockTraits { [.monotonic] } - - init() { - _now = Instant(tocksFromStart: 1000) - } - - // These are a bit of a lie, since this clock is weird and doesn't - // actually tell the time; for the purposes of this test, we pretend - // that the tocks are 10ms. - func convert(from duration: Duration) -> Swift.Duration? { - return .seconds(Double(duration.tocks) / 100) - } - - func convert(from duration: Swift.Duration) -> Duration? { - let (seconds, attoseconds) = duration.components - let extraTocks = attoseconds / 10_000_000_000_000_000 - return Duration(tocks: Int(seconds * 100) + Int(extraTocks)) - } - - mutating func tock() { - _now.tocksFromStart += 1 - } - - func sleep( - until instant: Instant, - tolerance: Duration? = nil - ) async throws { - // Do nothing - } -} - -@available(SwiftStdlib 6.2, *) -@main struct Main { - static func main() { - let tests = TestSuite("clocks") - - var clockA = TickingClock() - let clockB = TickingClock() - - clockA.tick() - clockA.tick() - clockA.tick() - - var clockC = TockingClock() - - clockC.tock() - - tests.test("Convert instants from one clock to another") { - let nowA = clockA.now - let nowB = clockB.now - - expectEqual(nowA.ticksFromStart, 3) - expectEqual(nowB.ticksFromStart, 0) - - let futureA = nowA.advanced(by: TickingClock.Duration(ticks: 23)) - let futureB = nowB.advanced(by: TickingClock.Duration(ticks: 42)) - - expectEqual(futureA.ticksFromStart, 26) - expectEqual(futureB.ticksFromStart, 42) - - let futureAinB = clockB.convert(instant: futureA, from: clockA)! - let futureBinA = clockA.convert(instant: futureB, from: clockB)! - - expectEqual(futureAinB.ticksFromStart, 23) - expectEqual(futureBinA.ticksFromStart, 45) - - let futureAinBinA = clockA.convert(instant: futureAinB, from: clockB)! - let futureBinAinB = clockB.convert(instant: futureBinA, from: clockA)! - - expectEqual(futureAinBinA.ticksFromStart, futureA.ticksFromStart) - expectEqual(futureBinAinB.ticksFromStart, futureB.ticksFromStart) - } - - tests.test("Convert instants between clocks with different representations") { - let nowA = clockA.now - let nowC = clockC.now - - expectEqual(nowA.ticksFromStart, 3) - expectEqual(nowC.tocksFromStart, 1001) - - let futureA = nowA.advanced(by: TickingClock.Duration(ticks: 23)) - let futureC = nowC.advanced(by: TockingClock.Duration(tocks: 42)) - - expectEqual(futureA.ticksFromStart, 26) - expectEqual(futureC.tocksFromStart, 1043) - - let futureAinC = clockC.convert(instant: futureA, from: clockA)! - let futureCinA = clockA.convert(instant: futureC, from: clockC)! - - expectEqual(futureAinC.tocksFromStart, 1047) - expectEqual(futureCinA.ticksFromStart, 24) - - let futureAinCinA = clockA.convert(instant: futureAinC, from: clockC)! - let futureCinAinC = clockC.convert(instant: futureCinA, from: clockA)! - - expectEqual(futureAinCinA.ticksFromStart, futureA.ticksFromStart) - expectEqual(futureCinAinC.tocksFromStart, futureC.tocksFromStart) - } - - tests.test("Convert instants between continuous and suspending clocks") { - let continuous = ContinuousClock() - let suspending = SuspendingClock() - - let nowC = continuous.now - let nowS = suspending.now - - let futureC = nowC.advanced(by: .seconds(5.3)) - let futureS = nowS.advanced(by: .seconds(4.2)) - - let futureCinS = suspending.convert(instant: futureC, - from: .continuous)! - let futureSinC = continuous.convert(instant: futureS, - from: .suspending)! - - let futureCinSinC = continuous.convert(instant: futureCinS, - from: .suspending)! - let futureSinCinS = suspending.convert(instant: futureSinC, - from: .continuous)! - - // These clocks may not be exact, so allow differences of up to 50ms - var delta1 = futureCinSinC - futureC - var delta2 = futureSinCinS - futureS - - // Duration is not SignedNumeric, so we have to do things this way - if delta1 < .zero { - delta1 = .zero - delta1 - } - if delta2 < .zero { - delta2 = .zero - delta2 - } - - expectLT(delta1, .milliseconds(50)) - expectLT(delta2, .milliseconds(50)) - } - - runAllTests() - } -} diff --git a/test/Concurrency/Runtime/custom_main_executor.swift b/test/Concurrency/Runtime/custom_main_executor.swift index cea9b4d04a0e6..9af3300015b76 100644 --- a/test/Concurrency/Runtime/custom_main_executor.swift +++ b/test/Concurrency/Runtime/custom_main_executor.swift @@ -1,3 +1,8 @@ +// RUN: %target-run-simple-swift(-DTOPLEVEL_FACTORY -Xfrontend -disable-availability-checking -g %import-libdispatch -parse-as-library) | %FileCheck %s +// RUN: %target-run-simple-swift(-DPROTOCOL_FACTORY -Xfrontend -disable-availability-checking -g %import-libdispatch -parse-as-library) | %FileCheck %s +// RUN: %target-run-simple-swift(-DPROTOCOL_FACTORY_OVERRIDDEN -Xfrontend -disable-availability-checking -g %import-libdispatch -parse-as-library) | %FileCheck %s +// RUN: %target-run-simple-swift(-DPROTOCOL_FACTORY_DEFAULT -Xfrontend -disable-availability-checking -g %import-libdispatch -parse-as-library) | %FileCheck %s +// RUN: %target-run-simple-swift(-DPROTOCOL_FACTORY_DEFAULT2 -Xfrontend -disable-availability-checking -g %import-libdispatch -parse-as-library) | %FileCheck %s // RUN: %target-run-simple-swift(-Xfrontend -disable-availability-checking -g %import-libdispatch -parse-as-library) | %FileCheck %s // RUN: %target-run-simple-swift(-Xfrontend -disable-availability-checking -g %import-libdispatch -parse-as-library -swift-version 5 -strict-concurrency=complete -enable-upcoming-feature NonisolatedNonsendingByDefault) | %FileCheck %s // REQUIRES: swift_feature_NonisolatedNonsendingByDefault @@ -15,7 +20,9 @@ import StdlibUnittest import Synchronization +#if TOPLEVEL_FACTORY typealias DefaultExecutorFactory = SimpleExecutorFactory +#endif struct SimpleExecutorFactory: ExecutorFactory { public static var mainExecutor: any MainExecutor { @@ -28,6 +35,15 @@ struct SimpleExecutorFactory: ExecutorFactory { } } +struct FatalExecutorFactory: ExecutorFactory { + public static var mainExecutor: any MainExecutor { + fatalError("mainExecutor called on FatalExecutorFactory") + } + public static var defaultExecutor: any TaskExecutor { + fatalError("taskExecutor called on FatalExecutorFactory") + } +} + @available(SwiftStdlib 6.2, *) final class SimpleMainExecutor: MainExecutor, @unchecked Sendable { public var isRunning: Bool = false @@ -76,8 +92,30 @@ final class SimpleTaskExecutor: TaskExecutor, @unchecked Sendable { print("Hello World") } +protocol AppProtocol { + #if PROTOCOL_FACTORY + associatedtype DefaultExecutorFactory + #endif + #if PROTOCOL_FACTORY_DEFAULT + associatedtype DefaultExecutorFactory = SimpleExecutorFactory + #endif + #if PROTOCOL_FACTORY_DEFAULT2 || PROTOCOL_FACTORY_OVERRIDDEN + associatedtype DefaultExecutorFactory = FatalExecutorFactory + #endif +} + +#if PROTOCOL_FACTORY || PROTOCOL_FACTORY_DEFAULT2 +extension AppProtocol { + typealias DefaultExecutorFactory = SimpleExecutorFactory +} +#endif + @available(SwiftStdlib 6.2, *) -@main struct Main { +@main struct Main: AppProtocol { + #if !TOPLEVEL_FACTORY && !PROTOCOL_FACTORY && !PROTOCOL_FACTORY_DEFAULT && !PROTOCOL_FACTORY_DEFAULT2 + typealias DefaultExecutorFactory = SimpleExecutorFactory + #endif + static func main() async { print("Hello") await myAsyncFunction() diff --git a/test/Concurrency/Runtime/sleep_executor.swift b/test/Concurrency/Runtime/sleep_executor.swift index 46809b5212e39..d911a71eb931e 100644 --- a/test/Concurrency/Runtime/sleep_executor.swift +++ b/test/Concurrency/Runtime/sleep_executor.swift @@ -23,8 +23,8 @@ actor MyActor { } @available(SwiftStdlib 6.2, *) -final class TestExecutor: TaskExecutor, SchedulableExecutor, @unchecked Sendable { - var asSchedulable: SchedulableExecutor? { +final class TestExecutor: TaskExecutor, SchedulingExecutor, @unchecked Sendable { + var asScheduling: SchedulingExecutor? { return self } @@ -40,7 +40,7 @@ final class TestExecutor: TaskExecutor, SchedulableExecutor, @unchecked Sendable tolerance: C.Duration? = nil, clock: C) { // Convert to `Swift.Duration` - let duration = clock.convert(from: delay)! + let duration = delay as! Swift.Duration // Now turn that into nanoseconds let (seconds, attoseconds) = duration.components diff --git a/test/abi/Inputs/macOS/arm64/concurrency/baseline b/test/abi/Inputs/macOS/arm64/concurrency/baseline index 62c6c49652893..9f91995fd1839 100644 --- a/test/abi/Inputs/macOS/arm64/concurrency/baseline +++ b/test/abi/Inputs/macOS/arm64/concurrency/baseline @@ -25,6 +25,8 @@ _$sScEN _$sScEs5ErrorsMc _$sScF14isMainExecutorSbvgTj _$sScF14isMainExecutorSbvgTq +_$sScF20asSchedulingExecutors0bC0_pSgvgTj +_$sScF20asSchedulingExecutors0bC0_pSgvgTq _$sScF7enqueueyyScJFTj _$sScF7enqueueyyScJFTq _$sScF7enqueueyys11ExecutorJobVnFTj @@ -37,6 +39,8 @@ _$sScFsE14isMainExecutorSbvg _$sScFsE14isMainExecutorSbvpMV _$sScFsE18_isComplexEqualitySbvg _$sScFsE18_isComplexEqualitySbvpMV +_$sScFsE20asSchedulingExecutors0bC0_pSgvg +_$sScFsE20asSchedulingExecutors0bC0_pSgvpMV _$sScFsE7enqueueyyScJF _$sScFsE7enqueueyys11ExecutorJobVnF _$sScFsE7enqueueyys3JobVnF @@ -219,8 +223,8 @@ _$sScTss5NeverORszABRs_rlE15defaultExecutorSch_pvpZMV _$sScTss5NeverORszABRs_rlE17checkCancellationyyKFZ _$sScTss5NeverORszABRs_rlE17preferredExecutorSch_pSgvgZ _$sScTss5NeverORszABRs_rlE17preferredExecutorSch_pSgvpZMV -_$sScTss5NeverORszABRs_rlE26currentSchedulableExecutors0cD0_pSgvgZ -_$sScTss5NeverORszABRs_rlE26currentSchedulableExecutors0cD0_pSgvpZMV +_$sScTss5NeverORszABRs_rlE25currentSchedulingExecutors0cD0_pSgvgZ +_$sScTss5NeverORszABRs_rlE25currentSchedulingExecutors0cD0_pSgvpZMV _$sScTss5NeverORszABRs_rlE5sleep11nanosecondsys6UInt64V_tYaKFZ _$sScTss5NeverORszABRs_rlE5sleep11nanosecondsys6UInt64V_tYaKFZTu _$sScTss5NeverORszABRs_rlE5sleep5until9tolerance5clocky7InstantQyd___8DurationQyd__Sgqd__tYaKs5ClockRd__lFZ @@ -405,23 +409,6 @@ _$sSctN _$sSctSHsMc _$sSctSQsMc _$ss039_checkIllegalTaskLocalBindingWithinWithC5Group4file4lineySS_SutF -_$ss11ClockTraitsV10continuousABvgZ -_$ss11ClockTraitsV10continuousABvpZMV -_$ss11ClockTraitsV8rawValueABs6UInt32V_tcfC -_$ss11ClockTraitsV8rawValues6UInt32Vvg -_$ss11ClockTraitsV8rawValues6UInt32VvpMV -_$ss11ClockTraitsV8wallTimeABvgZ -_$ss11ClockTraitsV8wallTimeABvpZMV -_$ss11ClockTraitsV9monotonicABvgZ -_$ss11ClockTraitsV9monotonicABvpZMV -_$ss11ClockTraitsVMa -_$ss11ClockTraitsVMn -_$ss11ClockTraitsVN -_$ss11ClockTraitsVSQsMc -_$ss11ClockTraitsVSYsMc -_$ss11ClockTraitsVs10SetAlgebrasMc -_$ss11ClockTraitsVs25ExpressibleByArrayLiteralsMc -_$ss11ClockTraitsVs9OptionSetsMc _$ss11ExecutorJobV010withUnsafeA11PrivateData4bodyxxSwq_YKXE_tq_YKs5ErrorR_r0_lF _$ss11ExecutorJobV11descriptionSSvg _$ss11ExecutorJobV14LocalAllocatorV10deallocateyySpyxGlF @@ -433,6 +420,7 @@ _$ss11ExecutorJobV14LocalAllocatorV8allocate8capacitySwSi_tF _$ss11ExecutorJobV14LocalAllocatorVMa _$ss11ExecutorJobV14LocalAllocatorVMn _$ss11ExecutorJobV14LocalAllocatorVN +_$ss11ExecutorJobV16createTrampoline2toABx_tScFRzlF _$ss11ExecutorJobV4KindV13firstReservedADvgZ _$ss11ExecutorJobV4KindV13firstReservedADvpZMV _$ss11ExecutorJobV4KindV4taskADvgZ @@ -489,35 +477,14 @@ _$ss12MainExecutorTL _$ss13_runAsyncMainyyyyYaKcF _$ss13withTaskGroup2of9returning4bodyq_xm_q_mq_ScGyxGzYaXEtYar0_lF _$ss13withTaskGroup2of9returning4bodyq_xm_q_mq_ScGyxGzYaXEtYar0_lFTu -_$ss14CFMainExecutorC3runyyKF -_$ss14CFMainExecutorC4stopyyF -_$ss14CFMainExecutorCABycfC -_$ss14CFMainExecutorCABycfc -_$ss14CFMainExecutorCMa -_$ss14CFMainExecutorCMm -_$ss14CFMainExecutorCMn -_$ss14CFMainExecutorCMo -_$ss14CFMainExecutorCN -_$ss14CFMainExecutorCfD -_$ss14CFMainExecutorCfd -_$ss14CFTaskExecutorCABycfC -_$ss14CFTaskExecutorCABycfc -_$ss14CFTaskExecutorCMa -_$ss14CFTaskExecutorCMm -_$ss14CFTaskExecutorCMn -_$ss14CFTaskExecutorCMo -_$ss14CFTaskExecutorCN -_$ss14CFTaskExecutorCfD -_$ss14CFTaskExecutorCfd _$ss15ContinuousClockV17minimumResolutions8DurationVvg _$ss15ContinuousClockV17minimumResolutions8DurationVvpMV _$ss15ContinuousClockV3nowAB7InstantVvg _$ss15ContinuousClockV3nowAB7InstantVvgZ _$ss15ContinuousClockV3nowAB7InstantVvpMV +_$ss15ContinuousClockV3run_2at9toleranceys11ExecutorJobVn_AB7InstantVs8DurationVSgtF _$ss15ContinuousClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKF _$ss15ContinuousClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKFTu -_$ss15ContinuousClockV6traitss0B6TraitsVvg -_$ss15ContinuousClockV6traitss0B6TraitsVvpMV _$ss15ContinuousClockV7InstantV1loiySbAD_ADtFZ _$ss15ContinuousClockV7InstantV2eeoiySbAD_ADtFZ _$ss15ContinuousClockV7InstantV3nowADvgZ @@ -537,6 +504,7 @@ _$ss15ContinuousClockV7InstantVSLsMc _$ss15ContinuousClockV7InstantVSQsMc _$ss15ContinuousClockV7InstantVSesMc _$ss15ContinuousClockV7InstantVs0C8ProtocolsMc +_$ss15ContinuousClockV7enqueue_2on2at9toleranceys11ExecutorJobVn_xAB7InstantVs8DurationVSgtScFRzlF _$ss15ContinuousClockVABycfC _$ss15ContinuousClockVMa _$ss15ContinuousClockVMn @@ -564,10 +532,9 @@ _$ss15SuspendingClockV17minimumResolutions8DurationVvpMV _$ss15SuspendingClockV3nowAB7InstantVvg _$ss15SuspendingClockV3nowAB7InstantVvgZ _$ss15SuspendingClockV3nowAB7InstantVvpMV +_$ss15SuspendingClockV3run_2at9toleranceys11ExecutorJobVn_AB7InstantVs8DurationVSgtF _$ss15SuspendingClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKF _$ss15SuspendingClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKFTu -_$ss15SuspendingClockV6traitss0B6TraitsVvg -_$ss15SuspendingClockV6traitss0B6TraitsVvpMV _$ss15SuspendingClockV7InstantV1loiySbAD_ADtFZ _$ss15SuspendingClockV7InstantV1poiyA2D_s8DurationVtFZ _$ss15SuspendingClockV7InstantV1soiyA2D_s8DurationVtFZ @@ -592,6 +559,7 @@ _$ss15SuspendingClockV7InstantVSLsMc _$ss15SuspendingClockV7InstantVSQsMc _$ss15SuspendingClockV7InstantVSesMc _$ss15SuspendingClockV7InstantVs0C8ProtocolsMc +_$ss15SuspendingClockV7enqueue_2on2at9toleranceys11ExecutorJobVn_xAB7InstantVs8DurationVSgtScFRzlF _$ss15SuspendingClockVABycfC _$ss15SuspendingClockVMa _$ss15SuspendingClockVMn @@ -619,6 +587,15 @@ _$ss16AsyncMapSequenceVMa _$ss16AsyncMapSequenceVMn _$ss16AsyncMapSequenceV_9transformAByxq_Gx_q_7ElementQzYactcfC _$ss16AsyncMapSequenceVyxq_GScisMc +_$ss18SchedulingExecutorMp +_$ss18SchedulingExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTj +_$ss18SchedulingExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTq +_$ss18SchedulingExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTj +_$ss18SchedulingExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTq +_$ss18SchedulingExecutorPScFTb +_$ss18SchedulingExecutorPsE7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lF +_$ss18SchedulingExecutorPsE7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lF +_$ss18SchedulingExecutorTL _$ss19AsyncFilterSequenceV04makeA8IteratorAB0E0Vyx_GyF _$ss19AsyncFilterSequenceV10isIncludedySb7ElementQzYacvg _$ss19AsyncFilterSequenceV10isIncludedySb7ElementQzYacvpMV @@ -676,15 +653,6 @@ _$ss19DiscardingTaskGroupV9cancelAllyyF _$ss19DiscardingTaskGroupVMa _$ss19DiscardingTaskGroupVMn _$ss19DiscardingTaskGroupVN -_$ss19SchedulableExecutorMp -_$ss19SchedulableExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTj -_$ss19SchedulableExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTq -_$ss19SchedulableExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTj -_$ss19SchedulableExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTq -_$ss19SchedulableExecutorPScFTb -_$ss19SchedulableExecutorPsE7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lF -_$ss19SchedulableExecutorPsE7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lF -_$ss19SchedulableExecutorTL _$ss19UnownedTaskExecutorV02asbC0Sch_pSgyF _$ss19UnownedTaskExecutorVyABxhcSchRzlufC _$ss20AsyncFlatMapSequenceV04makeA8IteratorAB0F0Vyxq__GyF @@ -716,39 +684,6 @@ _$ss20AsyncFlatMapSequenceVMa _$ss20AsyncFlatMapSequenceVMn _$ss20AsyncFlatMapSequenceV_9transformAByxq_Gx_q_7ElementQzYactcfC _$ss20AsyncFlatMapSequenceVyxq_GScisMc -_$ss20DispatchMainExecutorC02isbC0Sbvg -_$ss20DispatchMainExecutorC02isbC0SbvpMV -_$ss20DispatchMainExecutorC13asSchedulables0eC0_pSgvg -_$ss20DispatchMainExecutorC13asSchedulables0eC0_pSgvpMV -_$ss20DispatchMainExecutorC13checkIsolatedyyF -_$ss20DispatchMainExecutorC3runyyKFTj -_$ss20DispatchMainExecutorC3runyyKFTq -_$ss20DispatchMainExecutorC4stopyyFTj -_$ss20DispatchMainExecutorC4stopyyFTq -_$ss20DispatchMainExecutorC7enqueue_2at9tolerance5clockys0C3JobVn_7InstantQz8DurationQzSgxts5ClockRzlF -_$ss20DispatchMainExecutorC7enqueueyys0C3JobVnF -_$ss20DispatchMainExecutorCABycfC -_$ss20DispatchMainExecutorCABycfCTj -_$ss20DispatchMainExecutorCABycfCTq -_$ss20DispatchMainExecutorCABycfc -_$ss20DispatchMainExecutorCMa -_$ss20DispatchMainExecutorCMm -_$ss20DispatchMainExecutorCMn -_$ss20DispatchMainExecutorCMo -_$ss20DispatchMainExecutorCMu -_$ss20DispatchMainExecutorCN -_$ss20DispatchMainExecutorCScFsMc -_$ss20DispatchMainExecutorCScFsWP -_$ss20DispatchMainExecutorCScfsMc -_$ss20DispatchMainExecutorCScfsWP -_$ss20DispatchMainExecutorCfD -_$ss20DispatchMainExecutorCfd -_$ss20DispatchMainExecutorCs011SchedulableC0sMc -_$ss20DispatchMainExecutorCs011SchedulableC0sWP -_$ss20DispatchMainExecutorCs07RunLoopC0sMc -_$ss20DispatchMainExecutorCs07RunLoopC0sWP -_$ss20DispatchMainExecutorCs0bC0sMc -_$ss20DispatchMainExecutorCs0bC0sWP _$ss21withThrowingTaskGroup2of9returning4bodyq_xm_q_mq_Scgyxs5Error_pGzYaKXEtYaKr0_lF _$ss21withThrowingTaskGroup2of9returning4bodyq_xm_q_mq_Scgyxs5Error_pGzYaKXEtYaKr0_lFTu _$ss21withUnsafeCurrentTask4bodyxxSctSgKXE_tKlF @@ -929,31 +864,6 @@ _$ss25UnimplementedTaskExecutorCSchsMc _$ss25UnimplementedTaskExecutorCSchsWP _$ss25UnimplementedTaskExecutorCfD _$ss25UnimplementedTaskExecutorCfd -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvgTj -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvgTq -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvpMV -_$ss26DispatchGlobalTaskExecutorC7enqueue_2at9tolerance5clockys0D3JobVn_7InstantQz8DurationQzSgxts5ClockRzlFTj -_$ss26DispatchGlobalTaskExecutorC7enqueue_2at9tolerance5clockys0D3JobVn_7InstantQz8DurationQzSgxts5ClockRzlFTq -_$ss26DispatchGlobalTaskExecutorC7enqueueyys0D3JobVnFTj -_$ss26DispatchGlobalTaskExecutorC7enqueueyys0D3JobVnFTq -_$ss26DispatchGlobalTaskExecutorCABycfC -_$ss26DispatchGlobalTaskExecutorCABycfCTj -_$ss26DispatchGlobalTaskExecutorCABycfCTq -_$ss26DispatchGlobalTaskExecutorCABycfc -_$ss26DispatchGlobalTaskExecutorCMa -_$ss26DispatchGlobalTaskExecutorCMm -_$ss26DispatchGlobalTaskExecutorCMn -_$ss26DispatchGlobalTaskExecutorCMo -_$ss26DispatchGlobalTaskExecutorCMu -_$ss26DispatchGlobalTaskExecutorCN -_$ss26DispatchGlobalTaskExecutorCScFsMc -_$ss26DispatchGlobalTaskExecutorCScFsWP -_$ss26DispatchGlobalTaskExecutorCSchsMc -_$ss26DispatchGlobalTaskExecutorCSchsWP -_$ss26DispatchGlobalTaskExecutorCfD -_$ss26DispatchGlobalTaskExecutorCfd -_$ss26DispatchGlobalTaskExecutorCs011SchedulableD0sMc -_$ss26DispatchGlobalTaskExecutorCs011SchedulableD0sWP _$ss27AsyncThrowingFilterSequenceV04makeA8IteratorAB0F0Vyx_GyF _$ss27AsyncThrowingFilterSequenceV10isIncludedySb7ElementQzYaKcvg _$ss27AsyncThrowingFilterSequenceV10isIncludedySb7ElementQzYaKcvpMV @@ -1118,29 +1028,21 @@ _$ss5ClockP17minimumResolution8DurationQzvgTj _$ss5ClockP17minimumResolution8DurationQzvgTq _$ss5ClockP3now7InstantQzvgTj _$ss5ClockP3now7InstantQzvgTq +_$ss5ClockP3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtFTj +_$ss5ClockP3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtFTq _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTj _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTjTu _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTq -_$ss5ClockP6traitss0A6TraitsVvgTj -_$ss5ClockP6traitss0A6TraitsVvgTq _$ss5ClockP7InstantAB_s0B8ProtocolTn -_$ss5ClockP7convert4from8DurationQzSgsAEV_tFTj -_$ss5ClockP7convert4from8DurationQzSgsAEV_tFTq -_$ss5ClockP7convert4froms8DurationVSgAEQz_tFTj -_$ss5ClockP7convert4froms8DurationVSgAEQz_tFTq -_$ss5ClockP7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lFTj -_$ss5ClockP7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lFTq -_$ss5ClockPsE6traitss0A6TraitsVvg -_$ss5ClockPsE6traitss0A6TraitsVvpMV -_$ss5ClockPsE7convert4from8DurationQzSgsAEV_tF -_$ss5ClockPsE7convert4froms8DurationVSgAEQz_tF -_$ss5ClockPsE7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lF +_$ss5ClockP7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lFTj +_$ss5ClockP7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lFTq +_$ss5ClockPsE3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtF +_$ss5ClockPsE7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lF _$ss5ClockPsE7measurey8DurationQzyyKXEKF _$ss5ClockPsE7measurey8DurationQzyyYaKXEYaKF _$ss5ClockPsE7measurey8DurationQzyyYaKXEYaKFTu _$ss5ClockPss010ContinuousA0VRszrlE10continuousADvgZ _$ss5ClockPss010SuspendingA0VRszrlE10suspendingADvgZ -_$ss5ClockPss8DurationVACRtzrlE7convert4fromADSgAD_tF _$ss5ClockTL _$ss6_first_5where7ElementQzSgx_SbADYaKXEtYaKSciRzlF _$ss6_first_5where7ElementQzSgx_SbADYaKXEtYaKSciRzlFTu diff --git a/test/abi/Inputs/macOS/arm64/concurrency/baseline-asserts b/test/abi/Inputs/macOS/arm64/concurrency/baseline-asserts index 62c6c49652893..9f91995fd1839 100644 --- a/test/abi/Inputs/macOS/arm64/concurrency/baseline-asserts +++ b/test/abi/Inputs/macOS/arm64/concurrency/baseline-asserts @@ -25,6 +25,8 @@ _$sScEN _$sScEs5ErrorsMc _$sScF14isMainExecutorSbvgTj _$sScF14isMainExecutorSbvgTq +_$sScF20asSchedulingExecutors0bC0_pSgvgTj +_$sScF20asSchedulingExecutors0bC0_pSgvgTq _$sScF7enqueueyyScJFTj _$sScF7enqueueyyScJFTq _$sScF7enqueueyys11ExecutorJobVnFTj @@ -37,6 +39,8 @@ _$sScFsE14isMainExecutorSbvg _$sScFsE14isMainExecutorSbvpMV _$sScFsE18_isComplexEqualitySbvg _$sScFsE18_isComplexEqualitySbvpMV +_$sScFsE20asSchedulingExecutors0bC0_pSgvg +_$sScFsE20asSchedulingExecutors0bC0_pSgvpMV _$sScFsE7enqueueyyScJF _$sScFsE7enqueueyys11ExecutorJobVnF _$sScFsE7enqueueyys3JobVnF @@ -219,8 +223,8 @@ _$sScTss5NeverORszABRs_rlE15defaultExecutorSch_pvpZMV _$sScTss5NeverORszABRs_rlE17checkCancellationyyKFZ _$sScTss5NeverORszABRs_rlE17preferredExecutorSch_pSgvgZ _$sScTss5NeverORszABRs_rlE17preferredExecutorSch_pSgvpZMV -_$sScTss5NeverORszABRs_rlE26currentSchedulableExecutors0cD0_pSgvgZ -_$sScTss5NeverORszABRs_rlE26currentSchedulableExecutors0cD0_pSgvpZMV +_$sScTss5NeverORszABRs_rlE25currentSchedulingExecutors0cD0_pSgvgZ +_$sScTss5NeverORszABRs_rlE25currentSchedulingExecutors0cD0_pSgvpZMV _$sScTss5NeverORszABRs_rlE5sleep11nanosecondsys6UInt64V_tYaKFZ _$sScTss5NeverORszABRs_rlE5sleep11nanosecondsys6UInt64V_tYaKFZTu _$sScTss5NeverORszABRs_rlE5sleep5until9tolerance5clocky7InstantQyd___8DurationQyd__Sgqd__tYaKs5ClockRd__lFZ @@ -405,23 +409,6 @@ _$sSctN _$sSctSHsMc _$sSctSQsMc _$ss039_checkIllegalTaskLocalBindingWithinWithC5Group4file4lineySS_SutF -_$ss11ClockTraitsV10continuousABvgZ -_$ss11ClockTraitsV10continuousABvpZMV -_$ss11ClockTraitsV8rawValueABs6UInt32V_tcfC -_$ss11ClockTraitsV8rawValues6UInt32Vvg -_$ss11ClockTraitsV8rawValues6UInt32VvpMV -_$ss11ClockTraitsV8wallTimeABvgZ -_$ss11ClockTraitsV8wallTimeABvpZMV -_$ss11ClockTraitsV9monotonicABvgZ -_$ss11ClockTraitsV9monotonicABvpZMV -_$ss11ClockTraitsVMa -_$ss11ClockTraitsVMn -_$ss11ClockTraitsVN -_$ss11ClockTraitsVSQsMc -_$ss11ClockTraitsVSYsMc -_$ss11ClockTraitsVs10SetAlgebrasMc -_$ss11ClockTraitsVs25ExpressibleByArrayLiteralsMc -_$ss11ClockTraitsVs9OptionSetsMc _$ss11ExecutorJobV010withUnsafeA11PrivateData4bodyxxSwq_YKXE_tq_YKs5ErrorR_r0_lF _$ss11ExecutorJobV11descriptionSSvg _$ss11ExecutorJobV14LocalAllocatorV10deallocateyySpyxGlF @@ -433,6 +420,7 @@ _$ss11ExecutorJobV14LocalAllocatorV8allocate8capacitySwSi_tF _$ss11ExecutorJobV14LocalAllocatorVMa _$ss11ExecutorJobV14LocalAllocatorVMn _$ss11ExecutorJobV14LocalAllocatorVN +_$ss11ExecutorJobV16createTrampoline2toABx_tScFRzlF _$ss11ExecutorJobV4KindV13firstReservedADvgZ _$ss11ExecutorJobV4KindV13firstReservedADvpZMV _$ss11ExecutorJobV4KindV4taskADvgZ @@ -489,35 +477,14 @@ _$ss12MainExecutorTL _$ss13_runAsyncMainyyyyYaKcF _$ss13withTaskGroup2of9returning4bodyq_xm_q_mq_ScGyxGzYaXEtYar0_lF _$ss13withTaskGroup2of9returning4bodyq_xm_q_mq_ScGyxGzYaXEtYar0_lFTu -_$ss14CFMainExecutorC3runyyKF -_$ss14CFMainExecutorC4stopyyF -_$ss14CFMainExecutorCABycfC -_$ss14CFMainExecutorCABycfc -_$ss14CFMainExecutorCMa -_$ss14CFMainExecutorCMm -_$ss14CFMainExecutorCMn -_$ss14CFMainExecutorCMo -_$ss14CFMainExecutorCN -_$ss14CFMainExecutorCfD -_$ss14CFMainExecutorCfd -_$ss14CFTaskExecutorCABycfC -_$ss14CFTaskExecutorCABycfc -_$ss14CFTaskExecutorCMa -_$ss14CFTaskExecutorCMm -_$ss14CFTaskExecutorCMn -_$ss14CFTaskExecutorCMo -_$ss14CFTaskExecutorCN -_$ss14CFTaskExecutorCfD -_$ss14CFTaskExecutorCfd _$ss15ContinuousClockV17minimumResolutions8DurationVvg _$ss15ContinuousClockV17minimumResolutions8DurationVvpMV _$ss15ContinuousClockV3nowAB7InstantVvg _$ss15ContinuousClockV3nowAB7InstantVvgZ _$ss15ContinuousClockV3nowAB7InstantVvpMV +_$ss15ContinuousClockV3run_2at9toleranceys11ExecutorJobVn_AB7InstantVs8DurationVSgtF _$ss15ContinuousClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKF _$ss15ContinuousClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKFTu -_$ss15ContinuousClockV6traitss0B6TraitsVvg -_$ss15ContinuousClockV6traitss0B6TraitsVvpMV _$ss15ContinuousClockV7InstantV1loiySbAD_ADtFZ _$ss15ContinuousClockV7InstantV2eeoiySbAD_ADtFZ _$ss15ContinuousClockV7InstantV3nowADvgZ @@ -537,6 +504,7 @@ _$ss15ContinuousClockV7InstantVSLsMc _$ss15ContinuousClockV7InstantVSQsMc _$ss15ContinuousClockV7InstantVSesMc _$ss15ContinuousClockV7InstantVs0C8ProtocolsMc +_$ss15ContinuousClockV7enqueue_2on2at9toleranceys11ExecutorJobVn_xAB7InstantVs8DurationVSgtScFRzlF _$ss15ContinuousClockVABycfC _$ss15ContinuousClockVMa _$ss15ContinuousClockVMn @@ -564,10 +532,9 @@ _$ss15SuspendingClockV17minimumResolutions8DurationVvpMV _$ss15SuspendingClockV3nowAB7InstantVvg _$ss15SuspendingClockV3nowAB7InstantVvgZ _$ss15SuspendingClockV3nowAB7InstantVvpMV +_$ss15SuspendingClockV3run_2at9toleranceys11ExecutorJobVn_AB7InstantVs8DurationVSgtF _$ss15SuspendingClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKF _$ss15SuspendingClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKFTu -_$ss15SuspendingClockV6traitss0B6TraitsVvg -_$ss15SuspendingClockV6traitss0B6TraitsVvpMV _$ss15SuspendingClockV7InstantV1loiySbAD_ADtFZ _$ss15SuspendingClockV7InstantV1poiyA2D_s8DurationVtFZ _$ss15SuspendingClockV7InstantV1soiyA2D_s8DurationVtFZ @@ -592,6 +559,7 @@ _$ss15SuspendingClockV7InstantVSLsMc _$ss15SuspendingClockV7InstantVSQsMc _$ss15SuspendingClockV7InstantVSesMc _$ss15SuspendingClockV7InstantVs0C8ProtocolsMc +_$ss15SuspendingClockV7enqueue_2on2at9toleranceys11ExecutorJobVn_xAB7InstantVs8DurationVSgtScFRzlF _$ss15SuspendingClockVABycfC _$ss15SuspendingClockVMa _$ss15SuspendingClockVMn @@ -619,6 +587,15 @@ _$ss16AsyncMapSequenceVMa _$ss16AsyncMapSequenceVMn _$ss16AsyncMapSequenceV_9transformAByxq_Gx_q_7ElementQzYactcfC _$ss16AsyncMapSequenceVyxq_GScisMc +_$ss18SchedulingExecutorMp +_$ss18SchedulingExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTj +_$ss18SchedulingExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTq +_$ss18SchedulingExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTj +_$ss18SchedulingExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTq +_$ss18SchedulingExecutorPScFTb +_$ss18SchedulingExecutorPsE7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lF +_$ss18SchedulingExecutorPsE7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lF +_$ss18SchedulingExecutorTL _$ss19AsyncFilterSequenceV04makeA8IteratorAB0E0Vyx_GyF _$ss19AsyncFilterSequenceV10isIncludedySb7ElementQzYacvg _$ss19AsyncFilterSequenceV10isIncludedySb7ElementQzYacvpMV @@ -676,15 +653,6 @@ _$ss19DiscardingTaskGroupV9cancelAllyyF _$ss19DiscardingTaskGroupVMa _$ss19DiscardingTaskGroupVMn _$ss19DiscardingTaskGroupVN -_$ss19SchedulableExecutorMp -_$ss19SchedulableExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTj -_$ss19SchedulableExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTq -_$ss19SchedulableExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTj -_$ss19SchedulableExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTq -_$ss19SchedulableExecutorPScFTb -_$ss19SchedulableExecutorPsE7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lF -_$ss19SchedulableExecutorPsE7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lF -_$ss19SchedulableExecutorTL _$ss19UnownedTaskExecutorV02asbC0Sch_pSgyF _$ss19UnownedTaskExecutorVyABxhcSchRzlufC _$ss20AsyncFlatMapSequenceV04makeA8IteratorAB0F0Vyxq__GyF @@ -716,39 +684,6 @@ _$ss20AsyncFlatMapSequenceVMa _$ss20AsyncFlatMapSequenceVMn _$ss20AsyncFlatMapSequenceV_9transformAByxq_Gx_q_7ElementQzYactcfC _$ss20AsyncFlatMapSequenceVyxq_GScisMc -_$ss20DispatchMainExecutorC02isbC0Sbvg -_$ss20DispatchMainExecutorC02isbC0SbvpMV -_$ss20DispatchMainExecutorC13asSchedulables0eC0_pSgvg -_$ss20DispatchMainExecutorC13asSchedulables0eC0_pSgvpMV -_$ss20DispatchMainExecutorC13checkIsolatedyyF -_$ss20DispatchMainExecutorC3runyyKFTj -_$ss20DispatchMainExecutorC3runyyKFTq -_$ss20DispatchMainExecutorC4stopyyFTj -_$ss20DispatchMainExecutorC4stopyyFTq -_$ss20DispatchMainExecutorC7enqueue_2at9tolerance5clockys0C3JobVn_7InstantQz8DurationQzSgxts5ClockRzlF -_$ss20DispatchMainExecutorC7enqueueyys0C3JobVnF -_$ss20DispatchMainExecutorCABycfC -_$ss20DispatchMainExecutorCABycfCTj -_$ss20DispatchMainExecutorCABycfCTq -_$ss20DispatchMainExecutorCABycfc -_$ss20DispatchMainExecutorCMa -_$ss20DispatchMainExecutorCMm -_$ss20DispatchMainExecutorCMn -_$ss20DispatchMainExecutorCMo -_$ss20DispatchMainExecutorCMu -_$ss20DispatchMainExecutorCN -_$ss20DispatchMainExecutorCScFsMc -_$ss20DispatchMainExecutorCScFsWP -_$ss20DispatchMainExecutorCScfsMc -_$ss20DispatchMainExecutorCScfsWP -_$ss20DispatchMainExecutorCfD -_$ss20DispatchMainExecutorCfd -_$ss20DispatchMainExecutorCs011SchedulableC0sMc -_$ss20DispatchMainExecutorCs011SchedulableC0sWP -_$ss20DispatchMainExecutorCs07RunLoopC0sMc -_$ss20DispatchMainExecutorCs07RunLoopC0sWP -_$ss20DispatchMainExecutorCs0bC0sMc -_$ss20DispatchMainExecutorCs0bC0sWP _$ss21withThrowingTaskGroup2of9returning4bodyq_xm_q_mq_Scgyxs5Error_pGzYaKXEtYaKr0_lF _$ss21withThrowingTaskGroup2of9returning4bodyq_xm_q_mq_Scgyxs5Error_pGzYaKXEtYaKr0_lFTu _$ss21withUnsafeCurrentTask4bodyxxSctSgKXE_tKlF @@ -929,31 +864,6 @@ _$ss25UnimplementedTaskExecutorCSchsMc _$ss25UnimplementedTaskExecutorCSchsWP _$ss25UnimplementedTaskExecutorCfD _$ss25UnimplementedTaskExecutorCfd -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvgTj -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvgTq -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvpMV -_$ss26DispatchGlobalTaskExecutorC7enqueue_2at9tolerance5clockys0D3JobVn_7InstantQz8DurationQzSgxts5ClockRzlFTj -_$ss26DispatchGlobalTaskExecutorC7enqueue_2at9tolerance5clockys0D3JobVn_7InstantQz8DurationQzSgxts5ClockRzlFTq -_$ss26DispatchGlobalTaskExecutorC7enqueueyys0D3JobVnFTj -_$ss26DispatchGlobalTaskExecutorC7enqueueyys0D3JobVnFTq -_$ss26DispatchGlobalTaskExecutorCABycfC -_$ss26DispatchGlobalTaskExecutorCABycfCTj -_$ss26DispatchGlobalTaskExecutorCABycfCTq -_$ss26DispatchGlobalTaskExecutorCABycfc -_$ss26DispatchGlobalTaskExecutorCMa -_$ss26DispatchGlobalTaskExecutorCMm -_$ss26DispatchGlobalTaskExecutorCMn -_$ss26DispatchGlobalTaskExecutorCMo -_$ss26DispatchGlobalTaskExecutorCMu -_$ss26DispatchGlobalTaskExecutorCN -_$ss26DispatchGlobalTaskExecutorCScFsMc -_$ss26DispatchGlobalTaskExecutorCScFsWP -_$ss26DispatchGlobalTaskExecutorCSchsMc -_$ss26DispatchGlobalTaskExecutorCSchsWP -_$ss26DispatchGlobalTaskExecutorCfD -_$ss26DispatchGlobalTaskExecutorCfd -_$ss26DispatchGlobalTaskExecutorCs011SchedulableD0sMc -_$ss26DispatchGlobalTaskExecutorCs011SchedulableD0sWP _$ss27AsyncThrowingFilterSequenceV04makeA8IteratorAB0F0Vyx_GyF _$ss27AsyncThrowingFilterSequenceV10isIncludedySb7ElementQzYaKcvg _$ss27AsyncThrowingFilterSequenceV10isIncludedySb7ElementQzYaKcvpMV @@ -1118,29 +1028,21 @@ _$ss5ClockP17minimumResolution8DurationQzvgTj _$ss5ClockP17minimumResolution8DurationQzvgTq _$ss5ClockP3now7InstantQzvgTj _$ss5ClockP3now7InstantQzvgTq +_$ss5ClockP3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtFTj +_$ss5ClockP3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtFTq _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTj _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTjTu _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTq -_$ss5ClockP6traitss0A6TraitsVvgTj -_$ss5ClockP6traitss0A6TraitsVvgTq _$ss5ClockP7InstantAB_s0B8ProtocolTn -_$ss5ClockP7convert4from8DurationQzSgsAEV_tFTj -_$ss5ClockP7convert4from8DurationQzSgsAEV_tFTq -_$ss5ClockP7convert4froms8DurationVSgAEQz_tFTj -_$ss5ClockP7convert4froms8DurationVSgAEQz_tFTq -_$ss5ClockP7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lFTj -_$ss5ClockP7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lFTq -_$ss5ClockPsE6traitss0A6TraitsVvg -_$ss5ClockPsE6traitss0A6TraitsVvpMV -_$ss5ClockPsE7convert4from8DurationQzSgsAEV_tF -_$ss5ClockPsE7convert4froms8DurationVSgAEQz_tF -_$ss5ClockPsE7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lF +_$ss5ClockP7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lFTj +_$ss5ClockP7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lFTq +_$ss5ClockPsE3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtF +_$ss5ClockPsE7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lF _$ss5ClockPsE7measurey8DurationQzyyKXEKF _$ss5ClockPsE7measurey8DurationQzyyYaKXEYaKF _$ss5ClockPsE7measurey8DurationQzyyYaKXEYaKFTu _$ss5ClockPss010ContinuousA0VRszrlE10continuousADvgZ _$ss5ClockPss010SuspendingA0VRszrlE10suspendingADvgZ -_$ss5ClockPss8DurationVACRtzrlE7convert4fromADSgAD_tF _$ss5ClockTL _$ss6_first_5where7ElementQzSgx_SbADYaKXEtYaKSciRzlF _$ss6_first_5where7ElementQzSgx_SbADYaKXEtYaKSciRzlFTu diff --git a/test/abi/Inputs/macOS/x86_64/concurrency/baseline b/test/abi/Inputs/macOS/x86_64/concurrency/baseline index 62c6c49652893..9f91995fd1839 100644 --- a/test/abi/Inputs/macOS/x86_64/concurrency/baseline +++ b/test/abi/Inputs/macOS/x86_64/concurrency/baseline @@ -25,6 +25,8 @@ _$sScEN _$sScEs5ErrorsMc _$sScF14isMainExecutorSbvgTj _$sScF14isMainExecutorSbvgTq +_$sScF20asSchedulingExecutors0bC0_pSgvgTj +_$sScF20asSchedulingExecutors0bC0_pSgvgTq _$sScF7enqueueyyScJFTj _$sScF7enqueueyyScJFTq _$sScF7enqueueyys11ExecutorJobVnFTj @@ -37,6 +39,8 @@ _$sScFsE14isMainExecutorSbvg _$sScFsE14isMainExecutorSbvpMV _$sScFsE18_isComplexEqualitySbvg _$sScFsE18_isComplexEqualitySbvpMV +_$sScFsE20asSchedulingExecutors0bC0_pSgvg +_$sScFsE20asSchedulingExecutors0bC0_pSgvpMV _$sScFsE7enqueueyyScJF _$sScFsE7enqueueyys11ExecutorJobVnF _$sScFsE7enqueueyys3JobVnF @@ -219,8 +223,8 @@ _$sScTss5NeverORszABRs_rlE15defaultExecutorSch_pvpZMV _$sScTss5NeverORszABRs_rlE17checkCancellationyyKFZ _$sScTss5NeverORszABRs_rlE17preferredExecutorSch_pSgvgZ _$sScTss5NeverORszABRs_rlE17preferredExecutorSch_pSgvpZMV -_$sScTss5NeverORszABRs_rlE26currentSchedulableExecutors0cD0_pSgvgZ -_$sScTss5NeverORszABRs_rlE26currentSchedulableExecutors0cD0_pSgvpZMV +_$sScTss5NeverORszABRs_rlE25currentSchedulingExecutors0cD0_pSgvgZ +_$sScTss5NeverORszABRs_rlE25currentSchedulingExecutors0cD0_pSgvpZMV _$sScTss5NeverORszABRs_rlE5sleep11nanosecondsys6UInt64V_tYaKFZ _$sScTss5NeverORszABRs_rlE5sleep11nanosecondsys6UInt64V_tYaKFZTu _$sScTss5NeverORszABRs_rlE5sleep5until9tolerance5clocky7InstantQyd___8DurationQyd__Sgqd__tYaKs5ClockRd__lFZ @@ -405,23 +409,6 @@ _$sSctN _$sSctSHsMc _$sSctSQsMc _$ss039_checkIllegalTaskLocalBindingWithinWithC5Group4file4lineySS_SutF -_$ss11ClockTraitsV10continuousABvgZ -_$ss11ClockTraitsV10continuousABvpZMV -_$ss11ClockTraitsV8rawValueABs6UInt32V_tcfC -_$ss11ClockTraitsV8rawValues6UInt32Vvg -_$ss11ClockTraitsV8rawValues6UInt32VvpMV -_$ss11ClockTraitsV8wallTimeABvgZ -_$ss11ClockTraitsV8wallTimeABvpZMV -_$ss11ClockTraitsV9monotonicABvgZ -_$ss11ClockTraitsV9monotonicABvpZMV -_$ss11ClockTraitsVMa -_$ss11ClockTraitsVMn -_$ss11ClockTraitsVN -_$ss11ClockTraitsVSQsMc -_$ss11ClockTraitsVSYsMc -_$ss11ClockTraitsVs10SetAlgebrasMc -_$ss11ClockTraitsVs25ExpressibleByArrayLiteralsMc -_$ss11ClockTraitsVs9OptionSetsMc _$ss11ExecutorJobV010withUnsafeA11PrivateData4bodyxxSwq_YKXE_tq_YKs5ErrorR_r0_lF _$ss11ExecutorJobV11descriptionSSvg _$ss11ExecutorJobV14LocalAllocatorV10deallocateyySpyxGlF @@ -433,6 +420,7 @@ _$ss11ExecutorJobV14LocalAllocatorV8allocate8capacitySwSi_tF _$ss11ExecutorJobV14LocalAllocatorVMa _$ss11ExecutorJobV14LocalAllocatorVMn _$ss11ExecutorJobV14LocalAllocatorVN +_$ss11ExecutorJobV16createTrampoline2toABx_tScFRzlF _$ss11ExecutorJobV4KindV13firstReservedADvgZ _$ss11ExecutorJobV4KindV13firstReservedADvpZMV _$ss11ExecutorJobV4KindV4taskADvgZ @@ -489,35 +477,14 @@ _$ss12MainExecutorTL _$ss13_runAsyncMainyyyyYaKcF _$ss13withTaskGroup2of9returning4bodyq_xm_q_mq_ScGyxGzYaXEtYar0_lF _$ss13withTaskGroup2of9returning4bodyq_xm_q_mq_ScGyxGzYaXEtYar0_lFTu -_$ss14CFMainExecutorC3runyyKF -_$ss14CFMainExecutorC4stopyyF -_$ss14CFMainExecutorCABycfC -_$ss14CFMainExecutorCABycfc -_$ss14CFMainExecutorCMa -_$ss14CFMainExecutorCMm -_$ss14CFMainExecutorCMn -_$ss14CFMainExecutorCMo -_$ss14CFMainExecutorCN -_$ss14CFMainExecutorCfD -_$ss14CFMainExecutorCfd -_$ss14CFTaskExecutorCABycfC -_$ss14CFTaskExecutorCABycfc -_$ss14CFTaskExecutorCMa -_$ss14CFTaskExecutorCMm -_$ss14CFTaskExecutorCMn -_$ss14CFTaskExecutorCMo -_$ss14CFTaskExecutorCN -_$ss14CFTaskExecutorCfD -_$ss14CFTaskExecutorCfd _$ss15ContinuousClockV17minimumResolutions8DurationVvg _$ss15ContinuousClockV17minimumResolutions8DurationVvpMV _$ss15ContinuousClockV3nowAB7InstantVvg _$ss15ContinuousClockV3nowAB7InstantVvgZ _$ss15ContinuousClockV3nowAB7InstantVvpMV +_$ss15ContinuousClockV3run_2at9toleranceys11ExecutorJobVn_AB7InstantVs8DurationVSgtF _$ss15ContinuousClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKF _$ss15ContinuousClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKFTu -_$ss15ContinuousClockV6traitss0B6TraitsVvg -_$ss15ContinuousClockV6traitss0B6TraitsVvpMV _$ss15ContinuousClockV7InstantV1loiySbAD_ADtFZ _$ss15ContinuousClockV7InstantV2eeoiySbAD_ADtFZ _$ss15ContinuousClockV7InstantV3nowADvgZ @@ -537,6 +504,7 @@ _$ss15ContinuousClockV7InstantVSLsMc _$ss15ContinuousClockV7InstantVSQsMc _$ss15ContinuousClockV7InstantVSesMc _$ss15ContinuousClockV7InstantVs0C8ProtocolsMc +_$ss15ContinuousClockV7enqueue_2on2at9toleranceys11ExecutorJobVn_xAB7InstantVs8DurationVSgtScFRzlF _$ss15ContinuousClockVABycfC _$ss15ContinuousClockVMa _$ss15ContinuousClockVMn @@ -564,10 +532,9 @@ _$ss15SuspendingClockV17minimumResolutions8DurationVvpMV _$ss15SuspendingClockV3nowAB7InstantVvg _$ss15SuspendingClockV3nowAB7InstantVvgZ _$ss15SuspendingClockV3nowAB7InstantVvpMV +_$ss15SuspendingClockV3run_2at9toleranceys11ExecutorJobVn_AB7InstantVs8DurationVSgtF _$ss15SuspendingClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKF _$ss15SuspendingClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKFTu -_$ss15SuspendingClockV6traitss0B6TraitsVvg -_$ss15SuspendingClockV6traitss0B6TraitsVvpMV _$ss15SuspendingClockV7InstantV1loiySbAD_ADtFZ _$ss15SuspendingClockV7InstantV1poiyA2D_s8DurationVtFZ _$ss15SuspendingClockV7InstantV1soiyA2D_s8DurationVtFZ @@ -592,6 +559,7 @@ _$ss15SuspendingClockV7InstantVSLsMc _$ss15SuspendingClockV7InstantVSQsMc _$ss15SuspendingClockV7InstantVSesMc _$ss15SuspendingClockV7InstantVs0C8ProtocolsMc +_$ss15SuspendingClockV7enqueue_2on2at9toleranceys11ExecutorJobVn_xAB7InstantVs8DurationVSgtScFRzlF _$ss15SuspendingClockVABycfC _$ss15SuspendingClockVMa _$ss15SuspendingClockVMn @@ -619,6 +587,15 @@ _$ss16AsyncMapSequenceVMa _$ss16AsyncMapSequenceVMn _$ss16AsyncMapSequenceV_9transformAByxq_Gx_q_7ElementQzYactcfC _$ss16AsyncMapSequenceVyxq_GScisMc +_$ss18SchedulingExecutorMp +_$ss18SchedulingExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTj +_$ss18SchedulingExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTq +_$ss18SchedulingExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTj +_$ss18SchedulingExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTq +_$ss18SchedulingExecutorPScFTb +_$ss18SchedulingExecutorPsE7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lF +_$ss18SchedulingExecutorPsE7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lF +_$ss18SchedulingExecutorTL _$ss19AsyncFilterSequenceV04makeA8IteratorAB0E0Vyx_GyF _$ss19AsyncFilterSequenceV10isIncludedySb7ElementQzYacvg _$ss19AsyncFilterSequenceV10isIncludedySb7ElementQzYacvpMV @@ -676,15 +653,6 @@ _$ss19DiscardingTaskGroupV9cancelAllyyF _$ss19DiscardingTaskGroupVMa _$ss19DiscardingTaskGroupVMn _$ss19DiscardingTaskGroupVN -_$ss19SchedulableExecutorMp -_$ss19SchedulableExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTj -_$ss19SchedulableExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTq -_$ss19SchedulableExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTj -_$ss19SchedulableExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTq -_$ss19SchedulableExecutorPScFTb -_$ss19SchedulableExecutorPsE7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lF -_$ss19SchedulableExecutorPsE7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lF -_$ss19SchedulableExecutorTL _$ss19UnownedTaskExecutorV02asbC0Sch_pSgyF _$ss19UnownedTaskExecutorVyABxhcSchRzlufC _$ss20AsyncFlatMapSequenceV04makeA8IteratorAB0F0Vyxq__GyF @@ -716,39 +684,6 @@ _$ss20AsyncFlatMapSequenceVMa _$ss20AsyncFlatMapSequenceVMn _$ss20AsyncFlatMapSequenceV_9transformAByxq_Gx_q_7ElementQzYactcfC _$ss20AsyncFlatMapSequenceVyxq_GScisMc -_$ss20DispatchMainExecutorC02isbC0Sbvg -_$ss20DispatchMainExecutorC02isbC0SbvpMV -_$ss20DispatchMainExecutorC13asSchedulables0eC0_pSgvg -_$ss20DispatchMainExecutorC13asSchedulables0eC0_pSgvpMV -_$ss20DispatchMainExecutorC13checkIsolatedyyF -_$ss20DispatchMainExecutorC3runyyKFTj -_$ss20DispatchMainExecutorC3runyyKFTq -_$ss20DispatchMainExecutorC4stopyyFTj -_$ss20DispatchMainExecutorC4stopyyFTq -_$ss20DispatchMainExecutorC7enqueue_2at9tolerance5clockys0C3JobVn_7InstantQz8DurationQzSgxts5ClockRzlF -_$ss20DispatchMainExecutorC7enqueueyys0C3JobVnF -_$ss20DispatchMainExecutorCABycfC -_$ss20DispatchMainExecutorCABycfCTj -_$ss20DispatchMainExecutorCABycfCTq -_$ss20DispatchMainExecutorCABycfc -_$ss20DispatchMainExecutorCMa -_$ss20DispatchMainExecutorCMm -_$ss20DispatchMainExecutorCMn -_$ss20DispatchMainExecutorCMo -_$ss20DispatchMainExecutorCMu -_$ss20DispatchMainExecutorCN -_$ss20DispatchMainExecutorCScFsMc -_$ss20DispatchMainExecutorCScFsWP -_$ss20DispatchMainExecutorCScfsMc -_$ss20DispatchMainExecutorCScfsWP -_$ss20DispatchMainExecutorCfD -_$ss20DispatchMainExecutorCfd -_$ss20DispatchMainExecutorCs011SchedulableC0sMc -_$ss20DispatchMainExecutorCs011SchedulableC0sWP -_$ss20DispatchMainExecutorCs07RunLoopC0sMc -_$ss20DispatchMainExecutorCs07RunLoopC0sWP -_$ss20DispatchMainExecutorCs0bC0sMc -_$ss20DispatchMainExecutorCs0bC0sWP _$ss21withThrowingTaskGroup2of9returning4bodyq_xm_q_mq_Scgyxs5Error_pGzYaKXEtYaKr0_lF _$ss21withThrowingTaskGroup2of9returning4bodyq_xm_q_mq_Scgyxs5Error_pGzYaKXEtYaKr0_lFTu _$ss21withUnsafeCurrentTask4bodyxxSctSgKXE_tKlF @@ -929,31 +864,6 @@ _$ss25UnimplementedTaskExecutorCSchsMc _$ss25UnimplementedTaskExecutorCSchsWP _$ss25UnimplementedTaskExecutorCfD _$ss25UnimplementedTaskExecutorCfd -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvgTj -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvgTq -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvpMV -_$ss26DispatchGlobalTaskExecutorC7enqueue_2at9tolerance5clockys0D3JobVn_7InstantQz8DurationQzSgxts5ClockRzlFTj -_$ss26DispatchGlobalTaskExecutorC7enqueue_2at9tolerance5clockys0D3JobVn_7InstantQz8DurationQzSgxts5ClockRzlFTq -_$ss26DispatchGlobalTaskExecutorC7enqueueyys0D3JobVnFTj -_$ss26DispatchGlobalTaskExecutorC7enqueueyys0D3JobVnFTq -_$ss26DispatchGlobalTaskExecutorCABycfC -_$ss26DispatchGlobalTaskExecutorCABycfCTj -_$ss26DispatchGlobalTaskExecutorCABycfCTq -_$ss26DispatchGlobalTaskExecutorCABycfc -_$ss26DispatchGlobalTaskExecutorCMa -_$ss26DispatchGlobalTaskExecutorCMm -_$ss26DispatchGlobalTaskExecutorCMn -_$ss26DispatchGlobalTaskExecutorCMo -_$ss26DispatchGlobalTaskExecutorCMu -_$ss26DispatchGlobalTaskExecutorCN -_$ss26DispatchGlobalTaskExecutorCScFsMc -_$ss26DispatchGlobalTaskExecutorCScFsWP -_$ss26DispatchGlobalTaskExecutorCSchsMc -_$ss26DispatchGlobalTaskExecutorCSchsWP -_$ss26DispatchGlobalTaskExecutorCfD -_$ss26DispatchGlobalTaskExecutorCfd -_$ss26DispatchGlobalTaskExecutorCs011SchedulableD0sMc -_$ss26DispatchGlobalTaskExecutorCs011SchedulableD0sWP _$ss27AsyncThrowingFilterSequenceV04makeA8IteratorAB0F0Vyx_GyF _$ss27AsyncThrowingFilterSequenceV10isIncludedySb7ElementQzYaKcvg _$ss27AsyncThrowingFilterSequenceV10isIncludedySb7ElementQzYaKcvpMV @@ -1118,29 +1028,21 @@ _$ss5ClockP17minimumResolution8DurationQzvgTj _$ss5ClockP17minimumResolution8DurationQzvgTq _$ss5ClockP3now7InstantQzvgTj _$ss5ClockP3now7InstantQzvgTq +_$ss5ClockP3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtFTj +_$ss5ClockP3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtFTq _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTj _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTjTu _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTq -_$ss5ClockP6traitss0A6TraitsVvgTj -_$ss5ClockP6traitss0A6TraitsVvgTq _$ss5ClockP7InstantAB_s0B8ProtocolTn -_$ss5ClockP7convert4from8DurationQzSgsAEV_tFTj -_$ss5ClockP7convert4from8DurationQzSgsAEV_tFTq -_$ss5ClockP7convert4froms8DurationVSgAEQz_tFTj -_$ss5ClockP7convert4froms8DurationVSgAEQz_tFTq -_$ss5ClockP7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lFTj -_$ss5ClockP7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lFTq -_$ss5ClockPsE6traitss0A6TraitsVvg -_$ss5ClockPsE6traitss0A6TraitsVvpMV -_$ss5ClockPsE7convert4from8DurationQzSgsAEV_tF -_$ss5ClockPsE7convert4froms8DurationVSgAEQz_tF -_$ss5ClockPsE7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lF +_$ss5ClockP7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lFTj +_$ss5ClockP7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lFTq +_$ss5ClockPsE3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtF +_$ss5ClockPsE7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lF _$ss5ClockPsE7measurey8DurationQzyyKXEKF _$ss5ClockPsE7measurey8DurationQzyyYaKXEYaKF _$ss5ClockPsE7measurey8DurationQzyyYaKXEYaKFTu _$ss5ClockPss010ContinuousA0VRszrlE10continuousADvgZ _$ss5ClockPss010SuspendingA0VRszrlE10suspendingADvgZ -_$ss5ClockPss8DurationVACRtzrlE7convert4fromADSgAD_tF _$ss5ClockTL _$ss6_first_5where7ElementQzSgx_SbADYaKXEtYaKSciRzlF _$ss6_first_5where7ElementQzSgx_SbADYaKXEtYaKSciRzlFTu diff --git a/test/abi/Inputs/macOS/x86_64/concurrency/baseline-asserts b/test/abi/Inputs/macOS/x86_64/concurrency/baseline-asserts index 62c6c49652893..9f91995fd1839 100644 --- a/test/abi/Inputs/macOS/x86_64/concurrency/baseline-asserts +++ b/test/abi/Inputs/macOS/x86_64/concurrency/baseline-asserts @@ -25,6 +25,8 @@ _$sScEN _$sScEs5ErrorsMc _$sScF14isMainExecutorSbvgTj _$sScF14isMainExecutorSbvgTq +_$sScF20asSchedulingExecutors0bC0_pSgvgTj +_$sScF20asSchedulingExecutors0bC0_pSgvgTq _$sScF7enqueueyyScJFTj _$sScF7enqueueyyScJFTq _$sScF7enqueueyys11ExecutorJobVnFTj @@ -37,6 +39,8 @@ _$sScFsE14isMainExecutorSbvg _$sScFsE14isMainExecutorSbvpMV _$sScFsE18_isComplexEqualitySbvg _$sScFsE18_isComplexEqualitySbvpMV +_$sScFsE20asSchedulingExecutors0bC0_pSgvg +_$sScFsE20asSchedulingExecutors0bC0_pSgvpMV _$sScFsE7enqueueyyScJF _$sScFsE7enqueueyys11ExecutorJobVnF _$sScFsE7enqueueyys3JobVnF @@ -219,8 +223,8 @@ _$sScTss5NeverORszABRs_rlE15defaultExecutorSch_pvpZMV _$sScTss5NeverORszABRs_rlE17checkCancellationyyKFZ _$sScTss5NeverORszABRs_rlE17preferredExecutorSch_pSgvgZ _$sScTss5NeverORszABRs_rlE17preferredExecutorSch_pSgvpZMV -_$sScTss5NeverORszABRs_rlE26currentSchedulableExecutors0cD0_pSgvgZ -_$sScTss5NeverORszABRs_rlE26currentSchedulableExecutors0cD0_pSgvpZMV +_$sScTss5NeverORszABRs_rlE25currentSchedulingExecutors0cD0_pSgvgZ +_$sScTss5NeverORszABRs_rlE25currentSchedulingExecutors0cD0_pSgvpZMV _$sScTss5NeverORszABRs_rlE5sleep11nanosecondsys6UInt64V_tYaKFZ _$sScTss5NeverORszABRs_rlE5sleep11nanosecondsys6UInt64V_tYaKFZTu _$sScTss5NeverORszABRs_rlE5sleep5until9tolerance5clocky7InstantQyd___8DurationQyd__Sgqd__tYaKs5ClockRd__lFZ @@ -405,23 +409,6 @@ _$sSctN _$sSctSHsMc _$sSctSQsMc _$ss039_checkIllegalTaskLocalBindingWithinWithC5Group4file4lineySS_SutF -_$ss11ClockTraitsV10continuousABvgZ -_$ss11ClockTraitsV10continuousABvpZMV -_$ss11ClockTraitsV8rawValueABs6UInt32V_tcfC -_$ss11ClockTraitsV8rawValues6UInt32Vvg -_$ss11ClockTraitsV8rawValues6UInt32VvpMV -_$ss11ClockTraitsV8wallTimeABvgZ -_$ss11ClockTraitsV8wallTimeABvpZMV -_$ss11ClockTraitsV9monotonicABvgZ -_$ss11ClockTraitsV9monotonicABvpZMV -_$ss11ClockTraitsVMa -_$ss11ClockTraitsVMn -_$ss11ClockTraitsVN -_$ss11ClockTraitsVSQsMc -_$ss11ClockTraitsVSYsMc -_$ss11ClockTraitsVs10SetAlgebrasMc -_$ss11ClockTraitsVs25ExpressibleByArrayLiteralsMc -_$ss11ClockTraitsVs9OptionSetsMc _$ss11ExecutorJobV010withUnsafeA11PrivateData4bodyxxSwq_YKXE_tq_YKs5ErrorR_r0_lF _$ss11ExecutorJobV11descriptionSSvg _$ss11ExecutorJobV14LocalAllocatorV10deallocateyySpyxGlF @@ -433,6 +420,7 @@ _$ss11ExecutorJobV14LocalAllocatorV8allocate8capacitySwSi_tF _$ss11ExecutorJobV14LocalAllocatorVMa _$ss11ExecutorJobV14LocalAllocatorVMn _$ss11ExecutorJobV14LocalAllocatorVN +_$ss11ExecutorJobV16createTrampoline2toABx_tScFRzlF _$ss11ExecutorJobV4KindV13firstReservedADvgZ _$ss11ExecutorJobV4KindV13firstReservedADvpZMV _$ss11ExecutorJobV4KindV4taskADvgZ @@ -489,35 +477,14 @@ _$ss12MainExecutorTL _$ss13_runAsyncMainyyyyYaKcF _$ss13withTaskGroup2of9returning4bodyq_xm_q_mq_ScGyxGzYaXEtYar0_lF _$ss13withTaskGroup2of9returning4bodyq_xm_q_mq_ScGyxGzYaXEtYar0_lFTu -_$ss14CFMainExecutorC3runyyKF -_$ss14CFMainExecutorC4stopyyF -_$ss14CFMainExecutorCABycfC -_$ss14CFMainExecutorCABycfc -_$ss14CFMainExecutorCMa -_$ss14CFMainExecutorCMm -_$ss14CFMainExecutorCMn -_$ss14CFMainExecutorCMo -_$ss14CFMainExecutorCN -_$ss14CFMainExecutorCfD -_$ss14CFMainExecutorCfd -_$ss14CFTaskExecutorCABycfC -_$ss14CFTaskExecutorCABycfc -_$ss14CFTaskExecutorCMa -_$ss14CFTaskExecutorCMm -_$ss14CFTaskExecutorCMn -_$ss14CFTaskExecutorCMo -_$ss14CFTaskExecutorCN -_$ss14CFTaskExecutorCfD -_$ss14CFTaskExecutorCfd _$ss15ContinuousClockV17minimumResolutions8DurationVvg _$ss15ContinuousClockV17minimumResolutions8DurationVvpMV _$ss15ContinuousClockV3nowAB7InstantVvg _$ss15ContinuousClockV3nowAB7InstantVvgZ _$ss15ContinuousClockV3nowAB7InstantVvpMV +_$ss15ContinuousClockV3run_2at9toleranceys11ExecutorJobVn_AB7InstantVs8DurationVSgtF _$ss15ContinuousClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKF _$ss15ContinuousClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKFTu -_$ss15ContinuousClockV6traitss0B6TraitsVvg -_$ss15ContinuousClockV6traitss0B6TraitsVvpMV _$ss15ContinuousClockV7InstantV1loiySbAD_ADtFZ _$ss15ContinuousClockV7InstantV2eeoiySbAD_ADtFZ _$ss15ContinuousClockV7InstantV3nowADvgZ @@ -537,6 +504,7 @@ _$ss15ContinuousClockV7InstantVSLsMc _$ss15ContinuousClockV7InstantVSQsMc _$ss15ContinuousClockV7InstantVSesMc _$ss15ContinuousClockV7InstantVs0C8ProtocolsMc +_$ss15ContinuousClockV7enqueue_2on2at9toleranceys11ExecutorJobVn_xAB7InstantVs8DurationVSgtScFRzlF _$ss15ContinuousClockVABycfC _$ss15ContinuousClockVMa _$ss15ContinuousClockVMn @@ -564,10 +532,9 @@ _$ss15SuspendingClockV17minimumResolutions8DurationVvpMV _$ss15SuspendingClockV3nowAB7InstantVvg _$ss15SuspendingClockV3nowAB7InstantVvgZ _$ss15SuspendingClockV3nowAB7InstantVvpMV +_$ss15SuspendingClockV3run_2at9toleranceys11ExecutorJobVn_AB7InstantVs8DurationVSgtF _$ss15SuspendingClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKF _$ss15SuspendingClockV5sleep5until9toleranceyAB7InstantV_s8DurationVSgtYaKFTu -_$ss15SuspendingClockV6traitss0B6TraitsVvg -_$ss15SuspendingClockV6traitss0B6TraitsVvpMV _$ss15SuspendingClockV7InstantV1loiySbAD_ADtFZ _$ss15SuspendingClockV7InstantV1poiyA2D_s8DurationVtFZ _$ss15SuspendingClockV7InstantV1soiyA2D_s8DurationVtFZ @@ -592,6 +559,7 @@ _$ss15SuspendingClockV7InstantVSLsMc _$ss15SuspendingClockV7InstantVSQsMc _$ss15SuspendingClockV7InstantVSesMc _$ss15SuspendingClockV7InstantVs0C8ProtocolsMc +_$ss15SuspendingClockV7enqueue_2on2at9toleranceys11ExecutorJobVn_xAB7InstantVs8DurationVSgtScFRzlF _$ss15SuspendingClockVABycfC _$ss15SuspendingClockVMa _$ss15SuspendingClockVMn @@ -619,6 +587,15 @@ _$ss16AsyncMapSequenceVMa _$ss16AsyncMapSequenceVMn _$ss16AsyncMapSequenceV_9transformAByxq_Gx_q_7ElementQzYactcfC _$ss16AsyncMapSequenceVyxq_GScisMc +_$ss18SchedulingExecutorMp +_$ss18SchedulingExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTj +_$ss18SchedulingExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTq +_$ss18SchedulingExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTj +_$ss18SchedulingExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTq +_$ss18SchedulingExecutorPScFTb +_$ss18SchedulingExecutorPsE7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lF +_$ss18SchedulingExecutorPsE7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lF +_$ss18SchedulingExecutorTL _$ss19AsyncFilterSequenceV04makeA8IteratorAB0E0Vyx_GyF _$ss19AsyncFilterSequenceV10isIncludedySb7ElementQzYacvg _$ss19AsyncFilterSequenceV10isIncludedySb7ElementQzYacvpMV @@ -676,15 +653,6 @@ _$ss19DiscardingTaskGroupV9cancelAllyyF _$ss19DiscardingTaskGroupVMa _$ss19DiscardingTaskGroupVMn _$ss19DiscardingTaskGroupVN -_$ss19SchedulableExecutorMp -_$ss19SchedulableExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTj -_$ss19SchedulableExecutorP7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lFTq -_$ss19SchedulableExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTj -_$ss19SchedulableExecutorP7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lFTq -_$ss19SchedulableExecutorPScFTb -_$ss19SchedulableExecutorPsE7enqueue_2at9tolerance5clockys0B3JobVn_7InstantQyd__8DurationQyd__Sgqd__ts5ClockRd__lF -_$ss19SchedulableExecutorPsE7enqueue_5after9tolerance5clockys0B3JobVn_8DurationQyd__AJSgqd__ts5ClockRd__lF -_$ss19SchedulableExecutorTL _$ss19UnownedTaskExecutorV02asbC0Sch_pSgyF _$ss19UnownedTaskExecutorVyABxhcSchRzlufC _$ss20AsyncFlatMapSequenceV04makeA8IteratorAB0F0Vyxq__GyF @@ -716,39 +684,6 @@ _$ss20AsyncFlatMapSequenceVMa _$ss20AsyncFlatMapSequenceVMn _$ss20AsyncFlatMapSequenceV_9transformAByxq_Gx_q_7ElementQzYactcfC _$ss20AsyncFlatMapSequenceVyxq_GScisMc -_$ss20DispatchMainExecutorC02isbC0Sbvg -_$ss20DispatchMainExecutorC02isbC0SbvpMV -_$ss20DispatchMainExecutorC13asSchedulables0eC0_pSgvg -_$ss20DispatchMainExecutorC13asSchedulables0eC0_pSgvpMV -_$ss20DispatchMainExecutorC13checkIsolatedyyF -_$ss20DispatchMainExecutorC3runyyKFTj -_$ss20DispatchMainExecutorC3runyyKFTq -_$ss20DispatchMainExecutorC4stopyyFTj -_$ss20DispatchMainExecutorC4stopyyFTq -_$ss20DispatchMainExecutorC7enqueue_2at9tolerance5clockys0C3JobVn_7InstantQz8DurationQzSgxts5ClockRzlF -_$ss20DispatchMainExecutorC7enqueueyys0C3JobVnF -_$ss20DispatchMainExecutorCABycfC -_$ss20DispatchMainExecutorCABycfCTj -_$ss20DispatchMainExecutorCABycfCTq -_$ss20DispatchMainExecutorCABycfc -_$ss20DispatchMainExecutorCMa -_$ss20DispatchMainExecutorCMm -_$ss20DispatchMainExecutorCMn -_$ss20DispatchMainExecutorCMo -_$ss20DispatchMainExecutorCMu -_$ss20DispatchMainExecutorCN -_$ss20DispatchMainExecutorCScFsMc -_$ss20DispatchMainExecutorCScFsWP -_$ss20DispatchMainExecutorCScfsMc -_$ss20DispatchMainExecutorCScfsWP -_$ss20DispatchMainExecutorCfD -_$ss20DispatchMainExecutorCfd -_$ss20DispatchMainExecutorCs011SchedulableC0sMc -_$ss20DispatchMainExecutorCs011SchedulableC0sWP -_$ss20DispatchMainExecutorCs07RunLoopC0sMc -_$ss20DispatchMainExecutorCs07RunLoopC0sWP -_$ss20DispatchMainExecutorCs0bC0sMc -_$ss20DispatchMainExecutorCs0bC0sWP _$ss21withThrowingTaskGroup2of9returning4bodyq_xm_q_mq_Scgyxs5Error_pGzYaKXEtYaKr0_lF _$ss21withThrowingTaskGroup2of9returning4bodyq_xm_q_mq_Scgyxs5Error_pGzYaKXEtYaKr0_lFTu _$ss21withUnsafeCurrentTask4bodyxxSctSgKXE_tKlF @@ -929,31 +864,6 @@ _$ss25UnimplementedTaskExecutorCSchsMc _$ss25UnimplementedTaskExecutorCSchsWP _$ss25UnimplementedTaskExecutorCfD _$ss25UnimplementedTaskExecutorCfd -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvgTj -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvgTq -_$ss26DispatchGlobalTaskExecutorC06isMainD0SbvpMV -_$ss26DispatchGlobalTaskExecutorC7enqueue_2at9tolerance5clockys0D3JobVn_7InstantQz8DurationQzSgxts5ClockRzlFTj -_$ss26DispatchGlobalTaskExecutorC7enqueue_2at9tolerance5clockys0D3JobVn_7InstantQz8DurationQzSgxts5ClockRzlFTq -_$ss26DispatchGlobalTaskExecutorC7enqueueyys0D3JobVnFTj -_$ss26DispatchGlobalTaskExecutorC7enqueueyys0D3JobVnFTq -_$ss26DispatchGlobalTaskExecutorCABycfC -_$ss26DispatchGlobalTaskExecutorCABycfCTj -_$ss26DispatchGlobalTaskExecutorCABycfCTq -_$ss26DispatchGlobalTaskExecutorCABycfc -_$ss26DispatchGlobalTaskExecutorCMa -_$ss26DispatchGlobalTaskExecutorCMm -_$ss26DispatchGlobalTaskExecutorCMn -_$ss26DispatchGlobalTaskExecutorCMo -_$ss26DispatchGlobalTaskExecutorCMu -_$ss26DispatchGlobalTaskExecutorCN -_$ss26DispatchGlobalTaskExecutorCScFsMc -_$ss26DispatchGlobalTaskExecutorCScFsWP -_$ss26DispatchGlobalTaskExecutorCSchsMc -_$ss26DispatchGlobalTaskExecutorCSchsWP -_$ss26DispatchGlobalTaskExecutorCfD -_$ss26DispatchGlobalTaskExecutorCfd -_$ss26DispatchGlobalTaskExecutorCs011SchedulableD0sMc -_$ss26DispatchGlobalTaskExecutorCs011SchedulableD0sWP _$ss27AsyncThrowingFilterSequenceV04makeA8IteratorAB0F0Vyx_GyF _$ss27AsyncThrowingFilterSequenceV10isIncludedySb7ElementQzYaKcvg _$ss27AsyncThrowingFilterSequenceV10isIncludedySb7ElementQzYaKcvpMV @@ -1118,29 +1028,21 @@ _$ss5ClockP17minimumResolution8DurationQzvgTj _$ss5ClockP17minimumResolution8DurationQzvgTq _$ss5ClockP3now7InstantQzvgTj _$ss5ClockP3now7InstantQzvgTq +_$ss5ClockP3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtFTj +_$ss5ClockP3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtFTq _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTj _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTjTu _$ss5ClockP5sleep5until9tolerancey7InstantQz_8DurationQzSgtYaKFTq -_$ss5ClockP6traitss0A6TraitsVvgTj -_$ss5ClockP6traitss0A6TraitsVvgTq _$ss5ClockP7InstantAB_s0B8ProtocolTn -_$ss5ClockP7convert4from8DurationQzSgsAEV_tFTj -_$ss5ClockP7convert4from8DurationQzSgsAEV_tFTq -_$ss5ClockP7convert4froms8DurationVSgAEQz_tFTj -_$ss5ClockP7convert4froms8DurationVSgAEQz_tFTq -_$ss5ClockP7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lFTj -_$ss5ClockP7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lFTq -_$ss5ClockPsE6traitss0A6TraitsVvg -_$ss5ClockPsE6traitss0A6TraitsVvpMV -_$ss5ClockPsE7convert4from8DurationQzSgsAEV_tF -_$ss5ClockPsE7convert4froms8DurationVSgAEQz_tF -_$ss5ClockPsE7convert7instant4from7InstantQzSgAFQyd___qd__tsAARd__lF +_$ss5ClockP7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lFTj +_$ss5ClockP7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lFTq +_$ss5ClockPsE3run_2at9toleranceys11ExecutorJobVn_7InstantQz8DurationQzSgtF +_$ss5ClockPsE7enqueue_2on2at9toleranceys11ExecutorJobVn_qd__7InstantQz8DurationQzSgtScFRd__lF _$ss5ClockPsE7measurey8DurationQzyyKXEKF _$ss5ClockPsE7measurey8DurationQzyyYaKXEYaKF _$ss5ClockPsE7measurey8DurationQzyyYaKXEYaKFTu _$ss5ClockPss010ContinuousA0VRszrlE10continuousADvgZ _$ss5ClockPss010SuspendingA0VRszrlE10suspendingADvgZ -_$ss5ClockPss8DurationVACRtzrlE7convert4fromADSgAD_tF _$ss5ClockTL _$ss6_first_5where7ElementQzSgx_SbADYaKXEtYaKSciRzlF _$ss6_first_5where7ElementQzSgx_SbADYaKXEtYaKSciRzlFTu