diff options
author | 2023-10-17 14:10:25 -0700 | |
---|---|---|
committer | 2023-10-17 14:10:25 -0700 | |
commit | 7458b969c5d9971e89d187b687e1924e78da427e (patch) | |
tree | ee3dbf95c728cf407bf49a27826b541e9264a8bd /packages/bun-usockets/src/eventing | |
parent | d4a2c29131ec154f5e4db897d4deedab2002cbc4 (diff) | |
parent | e91436e5248d947b50f90b4a7402690be8a41f39 (diff) | |
download | bun-7458b969c5d9971e89d187b687e1924e78da427e.tar.gz bun-7458b969c5d9971e89d187b687e1924e78da427e.tar.zst bun-7458b969c5d9971e89d187b687e1924e78da427e.zip |
Merge branch 'main' into postinstall_3
Diffstat (limited to 'packages/bun-usockets/src/eventing')
-rw-r--r-- | packages/bun-usockets/src/eventing/epoll_kqueue.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/packages/bun-usockets/src/eventing/epoll_kqueue.c b/packages/bun-usockets/src/eventing/epoll_kqueue.c index 7ab2be826..d051f5b5a 100644 --- a/packages/bun-usockets/src/eventing/epoll_kqueue.c +++ b/packages/bun-usockets/src/eventing/epoll_kqueue.c @@ -30,13 +30,13 @@ void Bun__internal_dispatch_ready_poll(void* loop, void* poll); #include <stdint.h> #endif -void us_loop_run_bun_tick(struct us_loop_t *loop, int64_t timeoutMs); +void us_loop_run_bun_tick(struct us_loop_t *loop, int64_t timeoutMs, void*); /* Pointer tags are used to indicate a Bun pointer versus a uSockets pointer */ #define UNSET_BITS_49_UNTIL_64 0x0000FFFFFFFFFFFF #define CLEAR_POINTER_TAG(p) ((void *) ((uintptr_t) (p) & UNSET_BITS_49_UNTIL_64)) -#define LIKELY(cond) __builtin_expect((uint64_t)(void*)cond, 1) -#define UNLIKELY(cond) __builtin_expect((uint64_t)(void*)cond, 0) +#define LIKELY(cond) __builtin_expect((uint64_t)(void*)(cond), 1) +#define UNLIKELY(cond) __builtin_expect((uint64_t)(void*)(cond), 0) #ifdef LIBUS_USE_EPOLL #define GET_READY_POLL(loop, index) (struct us_poll_t *) loop->ready_polls[index].data.ptr @@ -174,13 +174,20 @@ void us_loop_run(struct us_loop_t *loop) { } } +void bun_on_tick_before(void* ctx); +void bun_on_tick_after(void* ctx); -void us_loop_run_bun_tick(struct us_loop_t *loop, int64_t timeoutMs) { + +void us_loop_run_bun_tick(struct us_loop_t *loop, int64_t timeoutMs, void* tickCallbackContext) { us_loop_integrate(loop); if (loop->num_polls == 0) return; + if (tickCallbackContext) { + bun_on_tick_before(tickCallbackContext); + } + /* Emit pre callback */ us_internal_loop_pre(loop); @@ -202,6 +209,10 @@ void us_loop_run_bun_tick(struct us_loop_t *loop, int64_t timeoutMs) { } #endif + if (tickCallbackContext) { + bun_on_tick_after(tickCallbackContext); + } + /* Iterate ready polls, dispatching them by type */ for (loop->current_ready_poll = 0; loop->current_ready_poll < loop->num_ready_polls; loop->current_ready_poll++) { struct us_poll_t *poll = GET_READY_POLL(loop, loop->current_ready_poll); @@ -403,14 +414,18 @@ struct us_timer_t *us_create_timer(struct us_loop_t *loop, int fallthrough, unsi #endif #ifdef LIBUS_USE_EPOLL -void us_timer_close(struct us_timer_t *timer) { +void us_timer_close(struct us_timer_t *timer, int fallthrough) { struct us_internal_callback_t *cb = (struct us_internal_callback_t *) timer; us_poll_stop(&cb->p, cb->loop); close(us_poll_fd(&cb->p)); - /* (regular) sockets are the only polls which are not freed immediately */ - us_poll_free((struct us_poll_t *) timer, cb->loop); + /* (regular) sockets are the only polls which are not freed immediately */ + if(fallthrough){ + us_free(timer); + }else { + us_poll_free((struct us_poll_t *) timer, cb->loop); + } } void us_timer_set(struct us_timer_t *t, void (*cb)(struct us_timer_t *t), int ms, int repeat_ms) { @@ -427,7 +442,7 @@ void us_timer_set(struct us_timer_t *t, void (*cb)(struct us_timer_t *t), int ms us_poll_start((struct us_poll_t *) t, internal_cb->loop, LIBUS_SOCKET_READABLE); } #else -void us_timer_close(struct us_timer_t *timer) { +void us_timer_close(struct us_timer_t *timer, int fallthrough) { struct us_internal_callback_t *internal_cb = (struct us_internal_callback_t *) timer; struct kevent64_s event; @@ -435,7 +450,11 @@ void us_timer_close(struct us_timer_t *timer) { kevent64(internal_cb->loop->fd, &event, 1, NULL, 0, 0, NULL); /* (regular) sockets are the only polls which are not freed immediately */ - us_poll_free((struct us_poll_t *) timer, internal_cb->loop); + if(fallthrough){ + us_free(timer); + }else { + us_poll_free((struct us_poll_t *) timer, internal_cb->loop); + } } void us_timer_set(struct us_timer_t *t, void (*cb)(struct us_timer_t *t), int ms, int repeat_ms) { |