@@ -80,7 +80,6 @@ extension Selector: _SelectorBackendProtocol {
8080 // Add the read end to pollFDs so WSAPoll will wake up when data is written to the write end
8181 let wakeupPollFD = pollfd ( fd: UInt64 ( readSocket) , events: Int16 ( WinSDK . POLLRDNORM) , revents: 0 )
8282 self . pollFDs. append ( wakeupPollFD)
83- self . deregisteredFDs. append ( false )
8483
8584 self . lifecycleState = . open
8685 }
@@ -254,18 +253,14 @@ extension Selector: _SelectorBackendProtocol {
254253 try body ( ( SelectorEvent ( io: selectorEvent, registration: registration) ) )
255254 }
256255
257- // now clean up any deregistered fds
258- // In reverse order so we don't have to copy elements out of the array
259- // If we do in in normal order, we'll have to shift all elements after the removed one
260- for i in self . deregisteredFDs. indices. reversed ( ) {
261- if self . deregisteredFDs [ i] {
262- // remove this one
263- let fd = self . pollFDs [ i] . fd
264- self . pollFDs. remove ( at: i)
265- self . deregisteredFDs. remove ( at: i)
266- self . registrations. removeValue ( forKey: Int ( fd) )
267- }
256+ // Clean up any deregistered fds. Process in descending order so that removing
257+ // elements doesn't invalidate the indexes of elements we still need to remove.
258+ for i in self . deregisteredFDs. sorted ( by: > ) {
259+ let fd = self . pollFDs [ i] . fd
260+ self . pollFDs. remove ( at: i)
261+ self . registrations. removeValue ( forKey: Int ( fd) )
268262 }
263+ self . deregisteredFDs. removeAll ( keepingCapacity: true )
269264 } else if result == 0 {
270265 // nothing has happened
271266 } else if result == WinSDK . SOCKET_ERROR {
@@ -283,7 +278,6 @@ extension Selector: _SelectorBackendProtocol {
283278 // that will allow O(1) access here.
284279 let poll = pollfd ( fd: UInt64 ( fileDescriptor) , events: interested. wsaPollEvent, revents: 0 )
285280 self . pollFDs. append ( poll)
286- self . deregisteredFDs. append ( false )
287281 }
288282
289283 func reregister0(
@@ -305,7 +299,7 @@ extension Selector: _SelectorBackendProtocol {
305299 registrationID: SelectorRegistrationID
306300 ) throws {
307301 if let index = self . pollFDs. firstIndex ( where: { $0. fd == UInt64 ( fileDescriptor) } ) {
308- self . deregisteredFDs [ index] = true
302+ self . deregisteredFDs. insert ( index)
309303 }
310304 }
311305
0 commit comments