mirror of
https://github.com/realm/SwiftLint.git
synced 2026-05-07 20:12:49 +00:00
6e3bfc1a45
These aren't enough to enable `-strict-concurrency=complete` for more modules, but they address some warnings with that flag on and reduces the scope of what remains to be migrated.
60 lines
1.3 KiB
Swift
60 lines
1.3 KiB
Swift
import Dispatch
|
|
import Foundation
|
|
|
|
private let outputQueue: DispatchQueue = {
|
|
let queue = DispatchQueue(
|
|
label: "io.realm.swiftlint.outputQueue",
|
|
qos: .userInteractive,
|
|
target: .global(qos: .userInteractive)
|
|
)
|
|
|
|
defer {
|
|
setupAtExitHandler()
|
|
}
|
|
|
|
return queue
|
|
}()
|
|
|
|
private func setupAtExitHandler() {
|
|
atexit {
|
|
outputQueue.sync(flags: .barrier) {}
|
|
}
|
|
}
|
|
|
|
/**
|
|
A thread-safe version of Swift's standard `print()`.
|
|
|
|
- parameter object: Object to print.
|
|
*/
|
|
public func queuedPrint<T: Sendable>(_ object: T) {
|
|
outputQueue.async {
|
|
print(object)
|
|
}
|
|
}
|
|
|
|
/**
|
|
A thread-safe, newline-terminated version of `fputs(..., stderr)`.
|
|
|
|
- parameter string: String to print.
|
|
*/
|
|
public func queuedPrintError(_ string: String) {
|
|
outputQueue.async {
|
|
fflush(stdout)
|
|
fputs(string + "\n", stderr)
|
|
}
|
|
}
|
|
|
|
/**
|
|
A thread-safe, newline-terminated version of `fatalError(...)` that doesn't leak
|
|
the source path from the compiled binary.
|
|
*/
|
|
public func queuedFatalError(_ string: String, file: StaticString = #file, line: UInt = #line) -> Never {
|
|
outputQueue.sync {
|
|
fflush(stdout)
|
|
let file = "\(file)".bridge().lastPathComponent
|
|
fputs("\(string): file \(file), line \(line)\n", stderr)
|
|
}
|
|
|
|
abort()
|
|
}
|