@@ -101,8 +101,12 @@ _evfiltstr(short filt)
101
101
_evfilt2 (EVFILT_MACHPORT );
102
102
_evfilt2 (DISPATCH_EVFILT_MACH_NOTIFICATION );
103
103
#endif
104
+ #ifdef EVFILT_FS
104
105
_evfilt2 (EVFILT_FS );
106
+ #endif
107
+ #ifdef EVFILT_USER
105
108
_evfilt2 (EVFILT_USER );
109
+ #endif
106
110
#ifdef EVFILT_SOCK
107
111
_evfilt2 (EVFILT_SOCK );
108
112
#endif
@@ -236,9 +240,9 @@ dispatch_kevent_debug(const char *verb, const dispatch_kevent_s *kev,
236
240
237
241
#define _dispatch_du_debug (what , du ) \
238
242
_dispatch_debug("kevent-source[%p]: %s kevent[%p] " \
239
- "{ filter = %s, ident = 0x%x }", \
243
+ "{ filter = %s, ident = 0x%llx }", \
240
244
_dispatch_wref2ptr((du)->du_owner_wref), what, \
241
- (du), _evfiltstr((du)->du_filter), (du)->du_ident)
245
+ (du), _evfiltstr((du)->du_filter), (unsigned long long)( du)->du_ident)
242
246
243
247
#if DISPATCH_MACHPORT_DEBUG
244
248
#ifndef MACH_PORT_TYPE_SPREQUEST
@@ -388,16 +392,18 @@ _dispatch_kevent_print_error(dispatch_kevent_t ke)
388
392
switch (ke -> data ) {
389
393
case 0 :
390
394
return ;
395
+ #if DISPATCH_USE_KEVENT_QOS
391
396
case ERANGE : /* A broken QoS was passed to kevent_id() */
392
397
DISPATCH_INTERNAL_CRASH (ke -> qos , "Invalid kevent priority" );
398
+ #endif
393
399
default :
394
400
// log the unexpected error
395
401
_dispatch_bug_kevent_client ("kevent" , _evfiltstr (ke -> filter ),
396
402
!ke -> udata ? NULL :
397
403
ke -> flags & EV_DELETE ? "delete" :
398
404
ke -> flags & EV_ADD ? "add" :
399
405
ke -> flags & EV_ENABLE ? "enable" : "monitor" ,
400
- (int )ke -> data , ke -> ident , ke -> udata , du );
406
+ (int )ke -> data , ke -> ident , ( uint64_t ) ke -> udata , du );
401
407
}
402
408
}
403
409
@@ -528,11 +534,22 @@ _dispatch_kevent_merge_muxed(dispatch_kevent_t ke)
528
534
}
529
535
}
530
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
+
531
544
DISPATCH_NOINLINE
532
545
static void
533
546
_dispatch_kevent_drain (dispatch_kevent_t ke )
534
547
{
548
+ #ifdef EVFILT_USER
535
549
if (ke -> filter == EVFILT_USER ) {
550
+ #else
551
+ if (ke -> filter == EVFILT_TIMER && ke -> ident == DISPATCH_KEVENT_ERSATZ_EVFILT_USER_IDENT ) {
552
+ #endif
536
553
_dispatch_kevent_mgr_debug ("received" , ke );
537
554
return ;
538
555
}
@@ -579,10 +596,17 @@ static void
579
596
_dispatch_kq_create (intptr_t * fd_ptr )
580
597
{
581
598
static const dispatch_kevent_s kev = {
599
+ #ifdef EVFILT_USER
582
600
.ident = 1 ,
583
601
.filter = EVFILT_USER ,
584
602
.flags = EV_ADD |EV_CLEAR ,
585
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
586
610
};
587
611
int kqfd ;
588
612
@@ -591,7 +615,6 @@ _dispatch_kq_create(intptr_t *fd_ptr)
591
615
guardid_t guard = (uintptr_t )fd_ptr ;
592
616
kqfd = guarded_kqueue_np (& guard , GUARD_CLOSE | GUARD_DUP );
593
617
#else
594
- (void )guard_ptr ;
595
618
kqfd = kqueue ();
596
619
#endif
597
620
if (kqfd == -1 ) {
@@ -743,7 +766,7 @@ _dispatch_kq_poll(dispatch_wlh_t wlh, dispatch_kevent_t ke, int n,
743
766
switch (err ) {
744
767
case ENOMEM :
745
768
_dispatch_temporary_resource_shortage ();
746
- /* FALLTHROUGH */
769
+ DISPATCH_FALLTHROUGH ;
747
770
case EINTR :
748
771
goto retry ;
749
772
case EBADF :
@@ -754,7 +777,7 @@ _dispatch_kq_poll(dispatch_wlh_t wlh, dispatch_kevent_t ke, int n,
754
777
(flags & KEVENT_FLAG_DYNAMIC_KQ_MUST_EXIST )) {
755
778
return 0 ;
756
779
}
757
- /* FALLTHROUGH */
780
+ DISPATCH_FALLTHROUGH ;
758
781
#endif // DISPATCH_USE_KEVENT_WORKLOOP
759
782
default :
760
783
DISPATCH_CLIENT_CRASH (err , "Unexpected error from kevent" );
@@ -786,9 +809,15 @@ _dispatch_kq_drain(dispatch_wlh_t wlh, dispatch_kevent_t ke, int n,
786
809
787
810
#if DISPATCH_DEBUG
788
811
for (r = 0 ; r < n ; r ++ ) {
812
+ #ifdef EVFILT_USER
789
813
if (ke [r ].filter != EVFILT_USER || DISPATCH_MGR_QUEUE_DEBUG ) {
790
814
_dispatch_kevent_debug_n (NULL , ke + r , r , n );
791
815
}
816
+ #else
817
+ if (DISPATCH_MGR_QUEUE_DEBUG ) {
818
+ _dispatch_kevent_debug_n (NULL , ke + r , r , n );
819
+ }
820
+ #endif
792
821
}
793
822
#endif
794
823
@@ -860,7 +889,6 @@ _dispatch_kq_unote_set_kevent(dispatch_unote_t _du, dispatch_kevent_t dk,
860
889
du -> du_priority ),
861
890
#endif
862
891
};
863
- (void )pp ; // if DISPATCH_USE_KEVENT_QOS == 0
864
892
}
865
893
866
894
DISPATCH_ALWAYS_INLINE
@@ -921,9 +949,13 @@ _dispatch_kq_deferred_update(dispatch_wlh_t wlh, dispatch_kevent_t ke)
921
949
ke -> udata );
922
950
dispatch_kevent_t dk = _dispatch_kq_deferred_reuse_slot (wlh , ddi , slot );
923
951
* dk = * ke ;
952
+ #ifdef EVFILT_USER
924
953
if (ke -> filter != EVFILT_USER ) {
925
954
_dispatch_kevent_mgr_debug ("deferred" , ke );
926
955
}
956
+ #else
957
+ _dispatch_kevent_mgr_debug ("deferred" , ke );
958
+ #endif
927
959
} else {
928
960
_dispatch_kq_update_one (wlh , ke );
929
961
}
@@ -985,6 +1017,7 @@ _dispatch_sync_ipc_handoff_end(dispatch_wlh_t wlh, mach_port_t port)
985
1017
}
986
1018
#endif
987
1019
1020
+ #if DISPATCH_HAVE_DIRECT_KNOTES
988
1021
DISPATCH_NOINLINE
989
1022
static bool
990
1023
_dispatch_kq_unote_update (dispatch_wlh_t wlh , dispatch_unote_t _du ,
@@ -1055,6 +1088,7 @@ _dispatch_kq_unote_update(dispatch_wlh_t wlh, dispatch_unote_t _du,
1055
1088
dispatch_assume_zero (r );
1056
1089
return true;
1057
1090
}
1091
+ #endif
1058
1092
1059
1093
#pragma mark dispatch_muxnote_t
1060
1094
@@ -1283,6 +1317,7 @@ _dispatch_unote_unregister_direct(dispatch_unote_t du, uint32_t flags)
1283
1317
#pragma mark -
1284
1318
#pragma mark dispatch_event_loop
1285
1319
1320
+ #if DISPATCH_USE_KEVENT_WORKLOOP
1286
1321
enum {
1287
1322
DISPATCH_WORKLOOP_ASYNC ,
1288
1323
DISPATCH_WORKLOOP_ASYNC_FROM_SYNC ,
@@ -1316,6 +1351,7 @@ static char const * const _dispatch_workloop_actions[] = {
1316
1351
[DISPATCH_WORKLOOP_SYNC_WAKE ] = "sync-wake" ,
1317
1352
[DISPATCH_WORKLOOP_SYNC_END ] = "sync-end" ,
1318
1353
};
1354
+ #endif
1319
1355
1320
1356
void
1321
1357
_dispatch_event_loop_atfork_child (void )
@@ -1410,7 +1446,7 @@ _dispatch_kq_fill_workloop_event(dispatch_kevent_t ke, int which,
1410
1446
switch (which ) {
1411
1447
case DISPATCH_WORKLOOP_ASYNC_FROM_SYNC :
1412
1448
fflags |= NOTE_WL_END_OWNERSHIP ;
1413
- /* FALLTHROUGH */
1449
+ DISPATCH_FALLTHROUGH ;
1414
1450
case DISPATCH_WORKLOOP_ASYNC :
1415
1451
case DISPATCH_WORKLOOP_ASYNC_DISCOVER_SYNC :
1416
1452
case DISPATCH_WORKLOOP_ASYNC_QOS_UPDATE :
@@ -1434,10 +1470,10 @@ _dispatch_kq_fill_workloop_event(dispatch_kevent_t ke, int which,
1434
1470
1435
1471
case DISPATCH_WORKLOOP_ASYNC_LEAVE_FROM_SYNC :
1436
1472
fflags |= NOTE_WL_END_OWNERSHIP ;
1437
- /* FALLTHROUGH */
1473
+ DISPATCH_FALLTHROUGH ;
1438
1474
case DISPATCH_WORKLOOP_ASYNC_LEAVE_FROM_TRANSFER :
1439
1475
fflags |= NOTE_WL_IGNORE_ESTALE ;
1440
- /* FALLTHROUGH */
1476
+ DISPATCH_FALLTHROUGH ;
1441
1477
case DISPATCH_WORKLOOP_ASYNC_LEAVE :
1442
1478
dispatch_assert (!_dq_state_is_enqueued_on_target (dq_state ));
1443
1479
action = EV_ADD | EV_DELETE | EV_ENABLE ;
@@ -1881,10 +1917,17 @@ _dispatch_event_loop_poke(dispatch_wlh_t wlh, uint64_t dq_state, uint32_t flags)
1881
1917
{
1882
1918
if (wlh == DISPATCH_WLH_MANAGER ) {
1883
1919
dispatch_kevent_s ke = (dispatch_kevent_s ){
1920
+ #ifdef EVFILT_USER
1884
1921
.ident = 1 ,
1885
1922
.filter = EVFILT_USER ,
1886
1923
.fflags = NOTE_TRIGGER ,
1887
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
1888
1931
};
1889
1932
return _dispatch_kq_deferred_update (DISPATCH_WLH_ANON , & ke );
1890
1933
} else if (wlh && wlh != DISPATCH_WLH_ANON ) {
@@ -2357,6 +2400,12 @@ _dispatch_event_loop_timer_arm(dispatch_timer_heap_t dth, uint32_t tidx,
2357
2400
target += range .leeway ;
2358
2401
range .leeway = 0 ;
2359
2402
}
2403
+ #if !NOTE_ABSOLUTE
2404
+ target = range .delay ;
2405
+ #if defined(__OpenBSD__ )
2406
+ target /= 1000000 ;
2407
+ #endif
2408
+ #endif
2360
2409
2361
2410
_dispatch_event_loop_timer_program (dth , tidx , target , range .leeway ,
2362
2411
EV_ADD | EV_ENABLE );
@@ -2445,6 +2494,7 @@ const dispatch_source_type_s _dispatch_source_type_vnode = {
2445
2494
.dst_merge_evt = _dispatch_source_merge_evt ,
2446
2495
};
2447
2496
2497
+ #ifdef EVFILT_FS
2448
2498
const dispatch_source_type_s _dispatch_source_type_vfs = {
2449
2499
.dst_kind = "vfs" ,
2450
2500
.dst_filter = EVFILT_FS ,
@@ -2477,6 +2527,7 @@ const dispatch_source_type_s _dispatch_source_type_vfs = {
2477
2527
.dst_create = _dispatch_unote_create_without_handle ,
2478
2528
.dst_merge_evt = _dispatch_source_merge_evt ,
2479
2529
};
2530
+ #endif
2480
2531
2481
2532
#ifdef EVFILT_SOCK
2482
2533
const dispatch_source_type_s _dispatch_source_type_sock = {
0 commit comments