Files
swift-mirror/stdlib/public/Concurrency/TaskGroup+Embedded.swift

284 lines
7.5 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2025 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import Swift
// FIXME: This is a workaround for trouble including gyb-generated sources
#if SWIFT_CONCURRENCY_EMBEDDED
@available(SwiftStdlib 5.1, *)
extension TaskGroup {
@available(SwiftStdlib 5.1, *)
@_alwaysEmitIntoClient
public mutating func addTask(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async -> ChildTaskResult
) {
let flags = taskCreateFlags(
priority: priority,
isChildTask: true,
copyTaskLocals: false,
inheritContext: false,
enqueueJob: true,
addPendingGroupTaskUnconditionally: true,
isDiscardingTask: false,
isSynchronousStart: false
)
let builtinSerialExecutor =
unsafe Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
_ = Builtin.createTask(
flags: flags,
initialSerialExecutor: builtinSerialExecutor,
taskGroup: _group,
operation: operation).0
}
@available(SwiftStdlib 5.1, *)
@_alwaysEmitIntoClient
public mutating func addTaskUnlessCancelled(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async -> ChildTaskResult
) -> Bool {
let canAdd = _taskGroupAddPendingTask(group: _group, unconditionally: false)
guard canAdd else {
return false
}
let flags = taskCreateFlags(
priority: priority,
isChildTask: true,
copyTaskLocals: false,
inheritContext: false,
enqueueJob: true,
addPendingGroupTaskUnconditionally: false,
isDiscardingTask: true,
isSynchronousStart: false
)
let builtinSerialExecutor =
unsafe Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
_ = Builtin.createTask(
flags: flags,
initialSerialExecutor: builtinSerialExecutor,
taskGroup: _group,
operation: operation).0
return true
}
}
@available(SwiftStdlib 5.1, *)
extension ThrowingTaskGroup {
@available(SwiftStdlib 5.1, *)
@_alwaysEmitIntoClient
public mutating func addTask(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async throws -> ChildTaskResult
) {
let flags = taskCreateFlags(
priority: priority,
isChildTask: true,
copyTaskLocals: false,
inheritContext: false,
enqueueJob: true,
addPendingGroupTaskUnconditionally: true,
isDiscardingTask: false,
isSynchronousStart: false
)
let builtinSerialExecutor =
unsafe Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
_ = Builtin.createTask(
flags: flags,
initialSerialExecutor: builtinSerialExecutor,
taskGroup: _group,
operation: operation).0
}
@available(SwiftStdlib 5.1, *)
@_alwaysEmitIntoClient
public mutating func addTaskUnlessCancelled(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async throws -> ChildTaskResult
) -> Bool {
let canAdd = _taskGroupAddPendingTask(group: _group, unconditionally: false)
guard canAdd else {
return false
}
let flags = taskCreateFlags(
priority: priority,
isChildTask: true,
copyTaskLocals: false,
inheritContext: false,
enqueueJob: true,
addPendingGroupTaskUnconditionally: false,
isDiscardingTask: true,
isSynchronousStart: false
)
let builtinSerialExecutor =
unsafe Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
_ = Builtin.createTask(
flags: flags,
initialSerialExecutor: builtinSerialExecutor,
taskGroup: _group,
operation: operation).0
return true
}
}
@available(SwiftStdlib 5.9, *)
extension DiscardingTaskGroup {
@available(SwiftStdlib 5.9, *)
@_alwaysEmitIntoClient
public mutating func addTask(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async -> Void
) {
let flags = taskCreateFlags(
priority: priority,
isChildTask: true,
copyTaskLocals: false,
inheritContext: false,
enqueueJob: true,
addPendingGroupTaskUnconditionally: true,
isDiscardingTask: true,
isSynchronousStart: false
)
let builtinSerialExecutor =
unsafe Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
_ = Builtin.createTask(
flags: flags,
initialSerialExecutor: builtinSerialExecutor,
taskGroup: _group,
operation: operation).0
}
@available(SwiftStdlib 5.9, *)
@_alwaysEmitIntoClient
public mutating func addTaskUnlessCancelled(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async -> Void
) -> Bool {
let canAdd = _taskGroupAddPendingTask(group: _group, unconditionally: false)
guard canAdd else {
return false
}
let flags = taskCreateFlags(
priority: priority,
isChildTask: true,
copyTaskLocals: false,
inheritContext: false,
enqueueJob: true,
addPendingGroupTaskUnconditionally: false,
isDiscardingTask: true,
isSynchronousStart: false
)
let builtinSerialExecutor =
unsafe Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
_ = Builtin.createTask(
flags: flags,
initialSerialExecutor: builtinSerialExecutor,
taskGroup: _group,
operation: operation).0
return true
}
}
@available(SwiftStdlib 5.9, *)
extension ThrowingDiscardingTaskGroup {
@available(SwiftStdlib 5.9, *)
@_alwaysEmitIntoClient
public mutating func addTask(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async throws -> Void
) {
let flags = taskCreateFlags(
priority: priority,
isChildTask: true,
copyTaskLocals: false,
inheritContext: false,
enqueueJob: true,
addPendingGroupTaskUnconditionally: true,
isDiscardingTask: true,
isSynchronousStart: false
)
let builtinSerialExecutor =
unsafe Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
_ = Builtin.createTask(
flags: flags,
initialSerialExecutor: builtinSerialExecutor,
taskGroup: _group,
operation: operation).0
}
@available(SwiftStdlib 5.9, *)
@_alwaysEmitIntoClient
public mutating func addTaskUnlessCancelled(
priority: TaskPriority? = nil,
operation: sending @escaping @isolated(any) () async throws -> Void
) -> Bool {
let canAdd = _taskGroupAddPendingTask(group: _group, unconditionally: false)
guard canAdd else {
return false
}
let flags = taskCreateFlags(
priority: priority,
isChildTask: true,
copyTaskLocals: false,
inheritContext: false,
enqueueJob: true,
addPendingGroupTaskUnconditionally: false,
isDiscardingTask: true,
isSynchronousStart: false
)
let builtinSerialExecutor =
unsafe Builtin.extractFunctionIsolation(operation)?.unownedExecutor.executor
_ = Builtin.createTask(
flags: flags,
initialSerialExecutor: builtinSerialExecutor,
taskGroup: _group,
operation: operation).0
return true
}
}
#endif