@@ -104,7 +104,9 @@ _evfiltstr(short filt)
104
104
#ifdef EVFILT_FS
105
105
_evfilt2 (EVFILT_FS );
106
106
#endif
107
+ #ifdef EVFILT_USER
107
108
_evfilt2 (EVFILT_USER );
109
+ #endif
108
110
#ifdef EVFILT_SOCK
109
111
_evfilt2 (EVFILT_SOCK );
110
112
#endif
@@ -532,11 +534,17 @@ _dispatch_kevent_merge_muxed(dispatch_kevent_t ke)
532
534
}
533
535
}
534
536
537
+ #define DISPATCH_KEVENT_ERSATZ_EVFILT_USER_MASK 0xfffffe00
538
+
535
539
DISPATCH_NOINLINE
536
540
static void
537
541
_dispatch_kevent_drain (dispatch_kevent_t ke )
538
542
{
543
+ #ifdef EVFILT_USER
539
544
if (ke -> filter == EVFILT_USER ) {
545
+ #else
546
+ if (ke -> filter == EVFILT_TIMER && ke -> ident == DISPATCH_KEVENT_ERSATZ_EVFILT_USER_MASK ) {
547
+ #endif
540
548
_dispatch_kevent_mgr_debug ("received" , ke );
541
549
return ;
542
550
}
@@ -583,10 +591,17 @@ static void
583
591
_dispatch_kq_create (intptr_t * fd_ptr )
584
592
{
585
593
static const dispatch_kevent_s kev = {
594
+ #ifdef EVFILT_USER
586
595
.ident = 1 ,
587
596
.filter = EVFILT_USER ,
588
597
.flags = EV_ADD |EV_CLEAR ,
589
598
.udata = (dispatch_kevent_udata_t )DISPATCH_WLH_MANAGER ,
599
+ #else
600
+ .ident = DISPATCH_KEVENT_ERSATZ_EVFILT_USER_MASK ,
601
+ .filter = EVFILT_TIMER ,
602
+ .flags = EV_ADD |EV_DISABLE ,
603
+ .data = 1 ,
604
+ #endif
590
605
};
591
606
int kqfd ;
592
607
@@ -730,6 +745,10 @@ _dispatch_kq_poll(dispatch_wlh_t wlh, dispatch_kevent_t ke, int n,
730
745
(void )avail ;
731
746
const struct timespec timeout_immediately = {}, * timeout = NULL ;
732
747
if (flags & KEVENT_FLAG_IMMEDIATE ) timeout = & timeout_immediately ;
748
+ #ifdef EVFILT_USER
749
+ const struct timespec timeout_1ms = {.tv_sec = 0 , .tv_nsec = 1000000 }
750
+ if (ke .ident == DISPATCH_KEVENT_ERSATZ_EVFILT_USER_MASK ) timeout = & timeout_1ms ;
751
+ #endif
733
752
r = kevent (kqfd , ke , n , ke_out , n_out , timeout );
734
753
#endif
735
754
#if DISPATCH_USE_KEVENT_WORKLOOP
@@ -789,9 +808,15 @@ _dispatch_kq_drain(dispatch_wlh_t wlh, dispatch_kevent_t ke, int n,
789
808
790
809
#if DISPATCH_DEBUG
791
810
for (r = 0 ; r < n ; r ++ ) {
811
+ #ifdef EVFILT_USER
792
812
if (ke [r ].filter != EVFILT_USER || DISPATCH_MGR_QUEUE_DEBUG ) {
793
813
_dispatch_kevent_debug_n (NULL , ke + r , r , n );
794
814
}
815
+ #else
816
+ if (DISPATCH_MGR_QUEUE_DEBUG ) {
817
+ _dispatch_kevent_debug_n (NULL , ke + r , r , n );
818
+ }
819
+ #endif
795
820
}
796
821
#endif
797
822
@@ -923,9 +948,13 @@ _dispatch_kq_deferred_update(dispatch_wlh_t wlh, dispatch_kevent_t ke)
923
948
ke -> udata );
924
949
dispatch_kevent_t dk = _dispatch_kq_deferred_reuse_slot (wlh , ddi , slot );
925
950
* dk = * ke ;
951
+ #ifdef EVFILT_USER
926
952
if (ke -> filter != EVFILT_USER ) {
927
953
_dispatch_kevent_mgr_debug ("deferred" , ke );
928
954
}
955
+ #else
956
+ _dispatch_kevent_mgr_debug ("deferred" , ke );
957
+ #endif
929
958
} else {
930
959
_dispatch_kq_update_one (wlh , ke );
931
960
}
@@ -1887,10 +1916,17 @@ _dispatch_event_loop_poke(dispatch_wlh_t wlh, uint64_t dq_state, uint32_t flags)
1887
1916
{
1888
1917
if (wlh == DISPATCH_WLH_MANAGER ) {
1889
1918
dispatch_kevent_s ke = (dispatch_kevent_s ){
1919
+ #ifdef EVFILT_USER
1890
1920
.ident = 1 ,
1891
1921
.filter = EVFILT_USER ,
1892
1922
.fflags = NOTE_TRIGGER ,
1893
1923
.udata = (dispatch_kevent_udata_t )DISPATCH_WLH_MANAGER ,
1924
+ #else
1925
+ .ident = DISPATCH_KEVENT_ERSATZ_EVFILT_USER_MASK ,
1926
+ .filter = EVFILT_TIMER ,
1927
+ .flags = EV_ADD |EV_ENABLE ,
1928
+ .data = 1
1929
+ #endif
1894
1930
};
1895
1931
return _dispatch_kq_deferred_update (DISPATCH_WLH_ANON , & ke );
1896
1932
} else if (wlh && wlh != DISPATCH_WLH_ANON ) {
0 commit comments