@@ -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,22 @@ _dispatch_kevent_merge_muxed(dispatch_kevent_t ke)
532
534
}
533
535
}
534
536
537
+ /*
538
+ * If the kevent implementation doesn't support EVFILT_USER for
539
+ * signaling, then we use EVFILT_TIMER with EV_ONESHOT with this ident
540
+ * to make do.
541
+ */
542
+ #define DISPATCH_KEVENT_ERSATZ_EVFILT_USER_IDENT (~0ull << 9)
543
+
535
544
DISPATCH_NOINLINE
536
545
static void
537
546
_dispatch_kevent_drain (dispatch_kevent_t ke )
538
547
{
548
+ #ifdef EVFILT_USER
539
549
if (ke -> filter == EVFILT_USER ) {
550
+ #else
551
+ if (ke -> filter == EVFILT_TIMER && ke -> ident == DISPATCH_KEVENT_ERSATZ_EVFILT_USER_IDENT ) {
552
+ #endif
540
553
_dispatch_kevent_mgr_debug ("received" , ke );
541
554
return ;
542
555
}
@@ -583,10 +596,17 @@ static void
583
596
_dispatch_kq_create (intptr_t * fd_ptr )
584
597
{
585
598
static const dispatch_kevent_s kev = {
599
+ #ifdef EVFILT_USER
586
600
.ident = 1 ,
587
601
.filter = EVFILT_USER ,
588
602
.flags = EV_ADD |EV_CLEAR ,
589
603
.udata = (dispatch_kevent_udata_t )DISPATCH_WLH_MANAGER ,
604
+ #else
605
+ .ident = DISPATCH_KEVENT_ERSATZ_EVFILT_USER_IDENT ,
606
+ .filter = EVFILT_TIMER ,
607
+ .flags = EV_ADD |EV_DISABLE |EV_ONESHOT ,
608
+ .data = 1 ,
609
+ #endif
590
610
};
591
611
int kqfd ;
592
612
@@ -789,9 +809,15 @@ _dispatch_kq_drain(dispatch_wlh_t wlh, dispatch_kevent_t ke, int n,
789
809
790
810
#if DISPATCH_DEBUG
791
811
for (r = 0 ; r < n ; r ++ ) {
812
+ #ifdef EVFILT_USER
792
813
if (ke [r ].filter != EVFILT_USER || DISPATCH_MGR_QUEUE_DEBUG ) {
793
814
_dispatch_kevent_debug_n (NULL , ke + r , r , n );
794
815
}
816
+ #else
817
+ if (DISPATCH_MGR_QUEUE_DEBUG ) {
818
+ _dispatch_kevent_debug_n (NULL , ke + r , r , n );
819
+ }
820
+ #endif
795
821
}
796
822
#endif
797
823
@@ -923,9 +949,13 @@ _dispatch_kq_deferred_update(dispatch_wlh_t wlh, dispatch_kevent_t ke)
923
949
ke -> udata );
924
950
dispatch_kevent_t dk = _dispatch_kq_deferred_reuse_slot (wlh , ddi , slot );
925
951
* dk = * ke ;
952
+ #ifdef EVFILT_USER
926
953
if (ke -> filter != EVFILT_USER ) {
927
954
_dispatch_kevent_mgr_debug ("deferred" , ke );
928
955
}
956
+ #else
957
+ _dispatch_kevent_mgr_debug ("deferred" , ke );
958
+ #endif
929
959
} else {
930
960
_dispatch_kq_update_one (wlh , ke );
931
961
}
@@ -1887,10 +1917,17 @@ _dispatch_event_loop_poke(dispatch_wlh_t wlh, uint64_t dq_state, uint32_t flags)
1887
1917
{
1888
1918
if (wlh == DISPATCH_WLH_MANAGER ) {
1889
1919
dispatch_kevent_s ke = (dispatch_kevent_s ){
1920
+ #ifdef EVFILT_USER
1890
1921
.ident = 1 ,
1891
1922
.filter = EVFILT_USER ,
1892
1923
.fflags = NOTE_TRIGGER ,
1893
1924
.udata = (dispatch_kevent_udata_t )DISPATCH_WLH_MANAGER ,
1925
+ #else
1926
+ .ident = DISPATCH_KEVENT_ERSATZ_EVFILT_USER_IDENT ,
1927
+ .filter = EVFILT_TIMER ,
1928
+ .flags = EV_ADD |EV_ENABLE |EV_ONESHOT ,
1929
+ .data = 1
1930
+ #endif
1894
1931
};
1895
1932
return _dispatch_kq_deferred_update (DISPATCH_WLH_ANON , & ke );
1896
1933
} else if (wlh && wlh != DISPATCH_WLH_ANON ) {
0 commit comments