35
35
#error unsupported configuration
36
36
#endif
37
37
38
+ #define DISPATCH_EPOLL_MAX_EVENT_COUNT 16
39
+
38
40
enum {
39
41
DISPATCH_EPOLL_EVENTFD = 0x0001 ,
40
42
DISPATCH_EPOLL_CLOCK_WALL = 0x0002 ,
@@ -47,8 +49,8 @@ typedef struct dispatch_muxnote_s {
47
49
TAILQ_HEAD (, dispatch_unote_linkage_s ) dmn_writers_head ;
48
50
int dmn_fd ;
49
51
int dmn_ident ;
52
+ uint32_t dmn_events ;
50
53
int16_t dmn_filter ;
51
- int16_t dmn_events ;
52
54
bool dmn_socket_listener ;
53
55
} * dispatch_muxnote_t ;
54
56
@@ -60,6 +62,10 @@ typedef struct dispatch_epoll_timeout_s {
60
62
} * dispatch_epoll_timeout_t ;
61
63
62
64
static int _dispatch_epfd , _dispatch_eventfd ;
65
+
66
+ static dispatch_once_t epoll_init_pred ;
67
+ static void _dispatch_epoll_init (void * );
68
+
63
69
DISPATCH_CACHELINE_ALIGN
64
70
static TAILQ_HEAD (dispatch_muxnote_bucket_s , dispatch_muxnote_s )
65
71
_dispatch_sources [DSL_HASH_SIZE ];
@@ -112,7 +118,7 @@ _dispatch_muxnote_dispose(dispatch_muxnote_t dmn)
112
118
}
113
119
114
120
static dispatch_muxnote_t
115
- _dispatch_muxnote_create (dispatch_unote_t du , int16_t events )
121
+ _dispatch_muxnote_create (dispatch_unote_t du , uint32_t events )
116
122
{
117
123
dispatch_muxnote_t dmn ;
118
124
struct stat sb ;
@@ -173,6 +179,7 @@ _dispatch_muxnote_create(dispatch_unote_t du, int16_t events)
173
179
static int
174
180
_dispatch_epoll_update (dispatch_muxnote_t dmn , int op )
175
181
{
182
+ dispatch_once_f (& epoll_init_pred , NULL , _dispatch_epoll_init );
176
183
struct epoll_event ev = {
177
184
.events = dmn -> dmn_events ,
178
185
.data = { .ptr = dmn },
@@ -181,11 +188,12 @@ _dispatch_epoll_update(dispatch_muxnote_t dmn, int op)
181
188
}
182
189
183
190
bool
184
- _dispatch_unote_register (dispatch_unote_t du , dispatch_priority_t pri )
191
+ _dispatch_unote_register (dispatch_unote_t du , dispatch_wlh_t wlh ,
192
+ dispatch_priority_t pri )
185
193
{
186
194
struct dispatch_muxnote_bucket_s * dmb ;
187
195
dispatch_muxnote_t dmn ;
188
- int16_t events = EPOLLFREE ;
196
+ uint32_t events = EPOLLFREE ;
189
197
190
198
dispatch_assert (!_dispatch_unote_registered (du ));
191
199
du ._du -> du_priority = pri ;
@@ -194,7 +202,7 @@ _dispatch_unote_register(dispatch_unote_t du, dispatch_priority_t pri)
194
202
case DISPATCH_EVFILT_CUSTOM_ADD :
195
203
case DISPATCH_EVFILT_CUSTOM_OR :
196
204
case DISPATCH_EVFILT_CUSTOM_REPLACE :
197
- du ._du -> du_wlh = DISPATCH_WLH_GLOBAL ;
205
+ du ._du -> du_wlh = wlh ;
198
206
return true;
199
207
case EVFILT_WRITE :
200
208
events |= EPOLLOUT ;
@@ -264,7 +272,7 @@ _dispatch_unote_unregister(dispatch_unote_t du, uint32_t flags)
264
272
if (_dispatch_unote_registered (du )) {
265
273
dispatch_unote_linkage_t dul = _dispatch_unote_get_linkage (du );
266
274
dispatch_muxnote_t dmn = dul -> du_muxnote ;
267
- int16_t events = dmn -> dmn_events ;
275
+ uint32_t events = dmn -> dmn_events ;
268
276
269
277
if (du ._du -> du_filter == EVFILT_WRITE ) {
270
278
TAILQ_REMOVE (& dmn -> dmn_writers_head , dul , du_link );
@@ -300,8 +308,6 @@ _dispatch_unote_unregister(dispatch_unote_t du, uint32_t flags)
300
308
static void
301
309
_dispatch_event_merge_timer (dispatch_clock_t clock )
302
310
{
303
- int qos ;
304
-
305
311
_dispatch_timers_expired = true;
306
312
_dispatch_timers_processing_mask |= 1 << DISPATCH_TIMER_INDEX (clock , 0 );
307
313
#if DISPATCH_USE_DTRACE
@@ -314,7 +320,6 @@ _dispatch_event_merge_timer(dispatch_clock_t clock)
314
320
static void
315
321
_dispatch_timeout_program (uint32_t tidx , uint64_t target , uint64_t leeway )
316
322
{
317
- uint32_t qos = DISPATCH_TIMER_QOS (tidx );
318
323
dispatch_clock_t clock = DISPATCH_TIMER_CLOCK (tidx );
319
324
dispatch_epoll_timeout_t timer = & _dispatch_epoll_timeout [clock ];
320
325
struct epoll_event ev = {
@@ -371,7 +376,7 @@ _dispatch_event_loop_timer_arm(uint32_t tidx, dispatch_timer_delay_s range,
371
376
dispatch_clock_now_cache_t nows )
372
377
{
373
378
uint64_t target = range .delay ;
374
- target += _dispatch_time_cached_now ( nows , DISPATCH_TIMER_CLOCK (tidx ));
379
+ target += _dispatch_time_now_cached ( DISPATCH_TIMER_CLOCK (tidx ), nows );
375
380
_dispatch_timers_heap [tidx ].dth_flags |= DTH_ARMED ;
376
381
_dispatch_timeout_program (tidx , target , range .leeway );
377
382
}
@@ -393,6 +398,13 @@ _dispatch_event_loop_atfork_child(void)
393
398
void
394
399
_dispatch_event_loop_init (void )
395
400
{
401
+ }
402
+
403
+ static void
404
+ _dispatch_epoll_init (void * context DISPATCH_UNUSED )
405
+ {
406
+ _dispatch_fork_becomes_unsafe ();
407
+
396
408
unsigned int i ;
397
409
for (i = 0 ; i < DSL_HASH_SIZE ; i ++ ) {
398
410
TAILQ_INIT (& _dispatch_sources [i ]);
@@ -413,15 +425,20 @@ _dispatch_event_loop_init(void)
413
425
.data = { .u32 = DISPATCH_EPOLL_EVENTFD , },
414
426
};
415
427
unsigned long op = EPOLL_CTL_ADD ;
416
- if (epoll_ctl (_dispatch_eventfd , op , _dispatch_eventfd , & ev ) < 0 ) {
428
+ if (epoll_ctl (_dispatch_epfd , op , _dispatch_eventfd , & ev ) < 0 ) {
417
429
DISPATCH_INTERNAL_CRASH (errno , "epoll_ctl() failed" );
418
430
}
431
+
432
+ #if DISPATCH_USE_MGR_THREAD
433
+ dx_push (_dispatch_mgr_q .do_targetq , & _dispatch_mgr_q , 0 );
434
+ #endif
419
435
}
420
436
421
437
void
422
438
_dispatch_event_loop_poke (dispatch_wlh_t wlh DISPATCH_UNUSED ,
423
439
dispatch_priority_t pri DISPATCH_UNUSED , uint32_t flags DISPATCH_UNUSED )
424
440
{
441
+ dispatch_once_f (& epoll_init_pred , NULL , _dispatch_epoll_init );
425
442
dispatch_assume_zero (eventfd_write (_dispatch_eventfd , 1 ));
426
443
}
427
444
@@ -435,7 +452,7 @@ _dispatch_event_merge_signal(dispatch_muxnote_t dmn)
435
452
436
453
TAILQ_FOREACH_SAFE (dul , & dmn -> dmn_readers_head , du_link , dul_next ) {
437
454
dispatch_unote_t du = _dispatch_unote_linkage_get_unote (dul );
438
- dux_merge_evt (du ._du , EV_ADD |EV_ENABLE |EV_CLEAR , 1 , 0 );
455
+ dux_merge_evt (du ._du , EV_ADD |EV_ENABLE |EV_CLEAR , 1 , 0 , 0 );
439
456
}
440
457
}
441
458
@@ -458,7 +475,7 @@ _dispatch_get_buffer_size(dispatch_muxnote_t dmn, bool writer)
458
475
}
459
476
460
477
static void
461
- _dispatch_event_merge_fd (dispatch_muxnote_t dmn , int16_t events )
478
+ _dispatch_event_merge_fd (dispatch_muxnote_t dmn , uint32_t events )
462
479
{
463
480
dispatch_unote_linkage_t dul , dul_next ;
464
481
uintptr_t data ;
@@ -467,15 +484,15 @@ _dispatch_event_merge_fd(dispatch_muxnote_t dmn, int16_t events)
467
484
data = _dispatch_get_buffer_size (dmn , false);
468
485
TAILQ_FOREACH_SAFE (dul , & dmn -> dmn_readers_head , du_link , dul_next ) {
469
486
dispatch_unote_t du = _dispatch_unote_linkage_get_unote (dul );
470
- dux_merge_evt (du ._du , EV_ADD |EV_ENABLE |EV_DISPATCH , ~data , 0 );
487
+ dux_merge_evt (du ._du , EV_ADD |EV_ENABLE |EV_DISPATCH , ~data , 0 , 0 );
471
488
}
472
489
}
473
490
474
491
if (events & EPOLLOUT ) {
475
492
data = _dispatch_get_buffer_size (dmn , true);
476
493
TAILQ_FOREACH_SAFE (dul , & dmn -> dmn_writers_head , du_link , dul_next ) {
477
494
dispatch_unote_t du = _dispatch_unote_linkage_get_unote (dul );
478
- dux_merge_evt (du ._du , EV_ADD |EV_ENABLE |EV_DISPATCH , ~data , 0 );
495
+ dux_merge_evt (du ._du , EV_ADD |EV_ENABLE |EV_DISPATCH , ~data , 0 , 0 );
479
496
}
480
497
}
481
498
}
@@ -484,7 +501,7 @@ DISPATCH_NOINLINE
484
501
void
485
502
_dispatch_event_loop_drain (uint32_t flags )
486
503
{
487
- struct epoll_event ev [DISPATCH_DEFERRED_ITEMS_EVENT_COUNT ];
504
+ struct epoll_event ev [DISPATCH_EPOLL_MAX_EVENT_COUNT ];
488
505
int i , r ;
489
506
int timeout = (flags & KEVENT_FLAG_IMMEDIATE ) ? 0 : -1 ;
490
507
0 commit comments