Skip to content

Commit 3cf1bf3

Browse files
Merge pull request #511 from adierking/file-cleanup
event: simplify the Windows file source implementation
2 parents fc73866 + c367297 commit 3cf1bf3

File tree

1 file changed

+16
-22
lines changed

1 file changed

+16
-22
lines changed

src/event/event_windows.c

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ typedef struct dispatch_muxnote_s {
8484
static 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-
9087
DISPATCH_ALWAYS_INLINE
9188
static 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

575562
static 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

594588
static 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

Comments
 (0)