@@ -84,9 +84,6 @@ typedef struct dispatch_muxnote_s {
8484static LIST_HEAD (dispatch_muxnote_bucket_s , dispatch_muxnote_s )
8585 _dispatch_sources [DSL_HASH_SIZE ];
8686
87- static SRWLOCK _dispatch_file_handles_lock = SRWLOCK_INIT ;
88- static LIST_HEAD (, dispatch_unote_linkage_s ) _dispatch_file_handles ;
89-
9087DISPATCH_ALWAYS_INLINE
9188static inline struct dispatch_muxnote_bucket_s *
9289_dispatch_unote_muxnote_bucket (uint32_t ident )
@@ -366,8 +363,9 @@ _dispatch_io_trigger(dispatch_muxnote_t dmn)
366363 DISPATCH_INTERNAL_CRASH (0 , "invalid handle" );
367364
368365 case DISPATCH_MUXNOTE_HANDLE_TYPE_FILE :
366+ _dispatch_muxnote_retain (dmn );
369367 bSuccess = PostQueuedCompletionStatus (hPort , 0 ,
370- (ULONG_PTR )DISPATCH_PORT_FILE_HANDLE , NULL );
368+ (ULONG_PTR )DISPATCH_PORT_FILE_HANDLE , ( LPOVERLAPPED ) dmn );
371369 if (bSuccess == FALSE) {
372370 DISPATCH_INTERNAL_CRASH (GetLastError (),
373371 "PostQueuedCompletionStatus" );
@@ -509,11 +507,6 @@ _dispatch_unote_register_muxed(dispatch_unote_t du)
509507 DISPATCH_INTERNAL_CRASH (0 , "invalid handle" );
510508
511509 case DISPATCH_MUXNOTE_HANDLE_TYPE_FILE :
512- AcquireSRWLockExclusive (& _dispatch_file_handles_lock );
513- LIST_INSERT_HEAD (& _dispatch_file_handles , dul , du_link );
514- ReleaseSRWLockExclusive (& _dispatch_file_handles_lock );
515- break ;
516-
517510 case DISPATCH_MUXNOTE_HANDLE_TYPE_PIPE :
518511 case DISPATCH_MUXNOTE_HANDLE_TYPE_SOCKET :
519512 if (events & DISPATCH_MUXNOTE_EVENT_READ ) {
@@ -550,12 +543,6 @@ _dispatch_unote_unregister_muxed(dispatch_unote_t du)
550543 DISPATCH_INTERNAL_CRASH (0 , "invalid handle" );
551544
552545 case DISPATCH_MUXNOTE_HANDLE_TYPE_FILE :
553- AcquireSRWLockExclusive (& _dispatch_file_handles_lock );
554- LIST_REMOVE (dul , du_link );
555- _LIST_TRASH_ENTRY (dul , du_link );
556- ReleaseSRWLockExclusive (& _dispatch_file_handles_lock );
557- break ;
558-
559546 case DISPATCH_MUXNOTE_HANDLE_TYPE_PIPE :
560547 case DISPATCH_MUXNOTE_HANDLE_TYPE_SOCKET :
561548 LIST_REMOVE (dul , du_link );
@@ -573,22 +560,29 @@ _dispatch_unote_unregister_muxed(dispatch_unote_t du)
573560}
574561
575562static void
576- _dispatch_event_merge_file_handle (void )
563+ _dispatch_event_merge_file_handle (dispatch_muxnote_t dmn )
577564{
578565 dispatch_unote_linkage_t dul , dul_next ;
579-
580- AcquireSRWLockExclusive (& _dispatch_file_handles_lock );
581- LIST_FOREACH_SAFE (dul , & _dispatch_file_handles , du_link , dul_next ) {
566+ LIST_FOREACH_SAFE (dul , & dmn -> dmn_readers_head , du_link , dul_next ) {
582567 dispatch_unote_t du = _dispatch_unote_linkage_get_unote (dul );
583-
584568 // consumed by dux_merge_evt()
585569 _dispatch_retain_unote_owner (du );
586570 dispatch_assert (dux_needs_rearm (du ._du ));
587571 _dispatch_unote_state_clear_bit (du , DU_STATE_ARMED );
588572 os_atomic_store2o (du ._dr , ds_pending_data , ~1 , relaxed );
589573 dux_merge_evt (du ._du , EV_ADD | EV_ENABLE | EV_DISPATCH , 1 , 0 );
590574 }
591- ReleaseSRWLockExclusive (& _dispatch_file_handles_lock );
575+ LIST_FOREACH_SAFE (dul , & dmn -> dmn_writers_head , du_link , dul_next ) {
576+ dispatch_unote_t du = _dispatch_unote_linkage_get_unote (dul );
577+ // consumed by dux_merge_evt()
578+ _dispatch_retain_unote_owner (du );
579+ dispatch_assert (dux_needs_rearm (du ._du ));
580+ _dispatch_unote_state_clear_bit (du , DU_STATE_ARMED );
581+ os_atomic_store2o (du ._dr , ds_pending_data , ~1 , relaxed );
582+ dux_merge_evt (du ._du , EV_ADD | EV_ENABLE | EV_DISPATCH , 1 , 0 );
583+ }
584+ // Retained when posting the completion packet
585+ _dispatch_muxnote_release (dmn );
592586}
593587
594588static void
@@ -858,7 +852,7 @@ _dispatch_event_loop_drain(uint32_t flags)
858852 break ;
859853
860854 case DISPATCH_PORT_FILE_HANDLE :
861- _dispatch_event_merge_file_handle ();
855+ _dispatch_event_merge_file_handle (( dispatch_muxnote_t ) pOV );
862856 break ;
863857
864858 case DISPATCH_PORT_PIPE_HANDLE_READ :
0 commit comments