@@ -53,10 +53,15 @@ typealias ThreadInitializer = (NIOThread) -> Void
53
53
/// test. A good place to start a `MultiThreadedEventLoopGroup` is the `setUp` method of your `XCTestCase`
54
54
/// subclass, a good place to shut it down is the `tearDown` method.
55
55
public final class MultiThreadedEventLoopGroup : EventLoopGroup {
56
-
56
+ #if swift(>=5.7)
57
+ private typealias ShutdownGracefullyCallback = @Sendable ( Error ? ) -> Void
58
+ #else
59
+ private typealias ShutdownGracefullyCallback = ( Error ? ) -> Void
60
+ #endif
61
+
57
62
private enum RunState {
58
63
case running
59
- case closing( [ ( DispatchQueue , ( Error ? ) -> Void ) ] )
64
+ case closing( [ ( DispatchQueue , ShutdownGracefullyCallback ) ] )
60
65
case closed( Error ? )
61
66
}
62
67
@@ -238,7 +243,7 @@ public final class MultiThreadedEventLoopGroup: EventLoopGroup {
238
243
}
239
244
#endif
240
245
241
- private func _shutdownGracefully( queue: DispatchQueue , _ handler: @escaping ( Error ? ) -> Void ) {
246
+ private func _shutdownGracefully( queue: DispatchQueue , _ handler: @escaping ShutdownGracefullyCallback ) {
242
247
// This method cannot perform its final cleanup using EventLoopFutures, because it requires that all
243
248
// our event loops still be alive, and they may not be. Instead, we use Dispatch to manage
244
249
// our shutdown signaling, and then do our cleanup once the DispatchQueue is empty.
@@ -293,28 +298,28 @@ public final class MultiThreadedEventLoopGroup: EventLoopGroup {
293
298
for loop in self . eventLoops {
294
299
loop. syncFinaliseClose ( joinThread: true )
295
300
}
296
- var overallError : Error ?
297
- var queueCallbackPairs : [ ( DispatchQueue , ( Error ? ) -> Void ) ] ? = nil
298
- self . shutdownLock. withLock {
301
+ let ( overallError, queueCallbackPairs) : ( Error ? , [ ( DispatchQueue , ShutdownGracefullyCallback ) ] ) = self . shutdownLock. withLock {
299
302
switch self . runState {
300
303
case . closed, . running:
301
304
preconditionFailure ( " MultiThreadedEventLoopGroup in illegal state when closing: \( self . runState) " )
302
305
case . closing( let callbacks) :
303
- queueCallbackPairs = callbacks
304
- switch result {
305
- case . success:
306
- overallError = nil
307
- case . failure( let error) :
308
- overallError = error
309
- }
306
+ let overallError : Error ? = {
307
+ switch result {
308
+ case . success:
309
+ return nil
310
+ case . failure( let error) :
311
+ return error
312
+ }
313
+ } ( )
310
314
self . runState = . closed( overallError)
315
+ return ( overallError, callbacks)
311
316
}
312
317
}
313
318
314
319
queue. async {
315
320
handler ( overallError)
316
321
}
317
- for queueCallbackPair in queueCallbackPairs! {
322
+ for queueCallbackPair in queueCallbackPairs {
318
323
queueCallbackPair. 0 . async {
319
324
queueCallbackPair. 1 ( overallError)
320
325
}
0 commit comments