@@ -84,9 +84,6 @@ typedef struct dispatch_muxnote_s {
84
84
static LIST_HEAD (dispatch_muxnote_bucket_s , dispatch_muxnote_s )
85
85
_dispatch_sources [DSL_HASH_SIZE ];
86
86
87
- static SRWLOCK _dispatch_file_handles_lock = SRWLOCK_INIT ;
88
- static LIST_HEAD (, dispatch_unote_linkage_s ) _dispatch_file_handles ;
89
-
90
87
DISPATCH_ALWAYS_INLINE
91
88
static inline struct dispatch_muxnote_bucket_s *
92
89
_dispatch_unote_muxnote_bucket (uint32_t ident )
@@ -366,8 +363,9 @@ _dispatch_io_trigger(dispatch_muxnote_t dmn)
366
363
DISPATCH_INTERNAL_CRASH (0 , "invalid handle" );
367
364
368
365
case DISPATCH_MUXNOTE_HANDLE_TYPE_FILE :
366
+ _dispatch_muxnote_retain (dmn );
369
367
bSuccess = PostQueuedCompletionStatus (hPort , 0 ,
370
- (ULONG_PTR )DISPATCH_PORT_FILE_HANDLE , NULL );
368
+ (ULONG_PTR )DISPATCH_PORT_FILE_HANDLE , ( LPOVERLAPPED ) dmn );
371
369
if (bSuccess == FALSE) {
372
370
DISPATCH_INTERNAL_CRASH (GetLastError (),
373
371
"PostQueuedCompletionStatus" );
@@ -509,11 +507,6 @@ _dispatch_unote_register_muxed(dispatch_unote_t du)
509
507
DISPATCH_INTERNAL_CRASH (0 , "invalid handle" );
510
508
511
509
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
-
517
510
case DISPATCH_MUXNOTE_HANDLE_TYPE_PIPE :
518
511
case DISPATCH_MUXNOTE_HANDLE_TYPE_SOCKET :
519
512
if (events & DISPATCH_MUXNOTE_EVENT_READ ) {
@@ -550,12 +543,6 @@ _dispatch_unote_unregister_muxed(dispatch_unote_t du)
550
543
DISPATCH_INTERNAL_CRASH (0 , "invalid handle" );
551
544
552
545
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
-
559
546
case DISPATCH_MUXNOTE_HANDLE_TYPE_PIPE :
560
547
case DISPATCH_MUXNOTE_HANDLE_TYPE_SOCKET :
561
548
LIST_REMOVE (dul , du_link );
@@ -573,22 +560,29 @@ _dispatch_unote_unregister_muxed(dispatch_unote_t du)
573
560
}
574
561
575
562
static void
576
- _dispatch_event_merge_file_handle (void )
563
+ _dispatch_event_merge_file_handle (dispatch_muxnote_t dmn )
577
564
{
578
565
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 ) {
582
567
dispatch_unote_t du = _dispatch_unote_linkage_get_unote (dul );
583
-
584
568
// consumed by dux_merge_evt()
585
569
_dispatch_retain_unote_owner (du );
586
570
dispatch_assert (dux_needs_rearm (du ._du ));
587
571
_dispatch_unote_state_clear_bit (du , DU_STATE_ARMED );
588
572
os_atomic_store2o (du ._dr , ds_pending_data , ~1 , relaxed );
589
573
dux_merge_evt (du ._du , EV_ADD | EV_ENABLE | EV_DISPATCH , 1 , 0 );
590
574
}
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 );
592
586
}
593
587
594
588
static void
@@ -858,7 +852,7 @@ _dispatch_event_loop_drain(uint32_t flags)
858
852
break ;
859
853
860
854
case DISPATCH_PORT_FILE_HANDLE :
861
- _dispatch_event_merge_file_handle ();
855
+ _dispatch_event_merge_file_handle (( dispatch_muxnote_t ) pOV );
862
856
break ;
863
857
864
858
case DISPATCH_PORT_PIPE_HANDLE_READ :
0 commit comments