mirror of
https://github.com/apple/container.git
synced 2026-09-12 02:35:42 +00:00
ContainerizationExtras: Timeout adjustments (#254)
Three things: 1. Timeout.run today didn't allow a throwing closure. 2. Add a new constructor for Timeout that takes in a Duration directly so we can be more granular than seconds. 3. Add unit tests because we all love those :)
This commit is contained in:
@@ -23,11 +23,11 @@ public struct Timeout {
|
||||
/// doesn't finish in the provided `seconds` amount.
|
||||
public static func run<T: Sendable>(
|
||||
seconds: UInt32,
|
||||
operation: @escaping @Sendable () async -> T
|
||||
operation: @escaping @Sendable () async throws -> T
|
||||
) async throws -> T {
|
||||
try await withThrowingTaskGroup(of: T.self) { group in
|
||||
group.addTask {
|
||||
await operation()
|
||||
try await operation()
|
||||
}
|
||||
|
||||
group.addTask {
|
||||
@@ -43,4 +43,27 @@ public struct Timeout {
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
public static func run<T: Sendable>(
|
||||
for duration: Duration,
|
||||
operation: @escaping @Sendable () async throws -> T
|
||||
) async throws -> T {
|
||||
try await withThrowingTaskGroup(of: T.self) { group in
|
||||
group.addTask {
|
||||
try await operation()
|
||||
}
|
||||
|
||||
group.addTask {
|
||||
try await Task.sleep(for: duration)
|
||||
throw CancellationError()
|
||||
}
|
||||
|
||||
guard let result = try await group.next() else {
|
||||
fatalError()
|
||||
}
|
||||
|
||||
group.cancelAll()
|
||||
return result
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user