@@ -122,7 +122,9 @@ fileprivate extension URLSession._MultiHandle {
122122 } else if socketSources != nil && action == . unregister {
123123 // We need to release the stored pointer:
124124 if let opaque = socketSourcePtr {
125- Unmanaged < _SocketSources > . fromOpaque ( opaque) . release ( )
125+ let s : Unmanaged < _SocketSources > = Unmanaged< _SocketSources> . fromOpaque( opaque)
126+ s. takeUnretainedValue ( ) . tearDown ( socket: socket, queue: queue)
127+ s. release ( )
126128 }
127129 socketSources = nil
128130 }
@@ -407,6 +409,7 @@ fileprivate extension URLSession._MultiHandle._Timeout {
407409fileprivate class _SocketSources {
408410 var readSource : DispatchSource ?
409411 var writeSource : DispatchSource ?
412+ let activeSockets = DispatchGroup ( )
410413
411414 func createReadSource( socket: CFURLSession_socket_t , queue: DispatchQueue , handler: DispatchWorkItem ) {
412415 guard readSource == nil else { return }
@@ -415,7 +418,13 @@ fileprivate class _SocketSources {
415418#else
416419 let s = DispatchSource . makeReadSource ( fileDescriptor: socket, queue: queue)
417420#endif
421+ activeSockets. enter ( )
418422 s. setEventHandler ( handler: handler)
423+ s. setCancelHandler ( handler: DispatchWorkItem { [ weak self] in
424+ guard let self = self else { return }
425+ self . activeSockets. leave ( )
426+ } )
427+
419428 readSource = s as? DispatchSource
420429 s. resume ( )
421430 }
@@ -427,12 +436,26 @@ fileprivate class _SocketSources {
427436#else
428437 let s = DispatchSource . makeWriteSource ( fileDescriptor: socket, queue: queue)
429438#endif
439+ activeSockets. enter ( )
440+ s. setCancelHandler ( handler: DispatchWorkItem { [ weak self] in
441+ guard let self = self else { return }
442+ self . activeSockets. leave ( )
443+ } )
430444 s. setEventHandler ( handler: handler)
431445 writeSource = s as? DispatchSource
432446 s. resume ( )
433447 }
434448
435- func tearDown( ) {
449+ func tearDown( socket: CFURLSession_socket_t , queue: DispatchQueue ) {
450+ activeSockets. notify ( queue: queue) {
451+ withExtendedLifetime ( self ) {
452+ #if os(Windows)
453+ closesocket ( socket)
454+ #else
455+ close ( socket)
456+ #endif
457+ }
458+ }
436459 if let s = readSource {
437460 s. cancel ( )
438461 }
0 commit comments