Files
swift-mirror/stdlib/public/Concurrency/CFExecutor.swift
Alastair Houghton 28f96e64ab [Concurrency][Stdlib] Add SwiftStdlibCurrentOS availability, use it.
If you use SwiftStdlibCurrentOS availability, you will be able to
use new types and functions from within the implementation. This
works by, when appropriate, building with the CurrentOS availability
set to the current deployment target.

rdar://150944675
2025-05-12 12:07:24 +01:00

68 lines
2.1 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2020 - 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
//
//===----------------------------------------------------------------------===//
#if !$Embedded && (os(macOS) || os(iOS) || os(tvOS) || os(watchOS) || os(visionOS))
import Swift
internal import Darwin
// .. Dynamic binding ..........................................................
enum CoreFoundation {
static let path =
"/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation"
static let handle = unsafe dlopen(path, RTLD_NOLOAD)
static var isPresent: Bool { return unsafe handle != nil }
static func symbol<T>(_ name: String) -> T {
guard let result = unsafe dlsym(handle, name) else {
fatalError("Unable to look up \(name) in CoreFoundation")
}
return unsafe unsafeBitCast(result, to: T.self)
}
static let CFRunLoopRun: @convention(c) () -> () =
symbol("CFRunLoopRun")
static let CFRunLoopGetMain: @convention(c) () -> OpaquePointer =
unsafe symbol("CFRunLoopGetMain")
static let CFRunLoopStop: @convention(c) (OpaquePointer) -> () =
unsafe symbol("CFRunLoopStop")
}
// .. Main Executor ............................................................
@available(SwiftStdlibCurrentOS 6.2, *)
public final class CFMainExecutor: DispatchMainExecutor, @unchecked Sendable {
override public func run() throws {
CoreFoundation.CFRunLoopRun()
}
override public func stop() {
unsafe CoreFoundation.CFRunLoopStop(CoreFoundation.CFRunLoopGetMain())
}
}
// .. Task Executor ............................................................
@available(SwiftStdlibCurrentOS 6.2, *)
public final class CFTaskExecutor: DispatchGlobalTaskExecutor,
@unchecked Sendable {
}
#endif