diff options
Diffstat (limited to 'src/os/event.c')
-rw-r--r-- | src/os/event.c | 94 |
1 files changed, 32 insertions, 62 deletions
diff --git a/src/os/event.c b/src/os/event.c index fb3fffc35a..7fc374e40e 100644 --- a/src/os/event.c +++ b/src/os/event.c @@ -20,8 +20,6 @@ KLIST_INIT(Event, Event, _destroy_event) static klist_t(Event) *event_queue; static uv_timer_t timer; static uv_prepare_t timer_prepare; -static bool poll_uv_loop(int ms); -static void process_all_events(void); static void timer_cb(uv_timer_t *handle, int); static void timer_prepare_cb(uv_prepare_t *, int); @@ -42,66 +40,8 @@ void event_init() uv_prepare_init(uv_default_loop(), &timer_prepare); } -bool event_poll(int32_t ms) -{ - int64_t remaining = ms; - uint64_t end; - bool result; - - if (ms > 0) { - // Calculate end time in nanoseconds - end = uv_hrtime() + ms * 1e6; - } - - for (;;) { - result = poll_uv_loop((int32_t)remaining); - // Process queued events - process_all_events(); - - if (ms > 0) { - // Calculate remaining time in milliseconds - remaining = (end - uv_hrtime()) / 1e6; - } - - if (input_ready() || got_int) { - // Bail out if we have pending input - return true; - } - - if (!result || (ms >= 0 && remaining <= 0)) { - // Or if we timed out - return false; - } - } -} - -// Push an event to the queue -void event_push(Event event) -{ - *kl_pushp(Event, event_queue) = event; -} - -// Runs the appropriate action for each queued event -static void process_all_events() -{ - Event event; - - while (kl_shift(Event, event_queue, &event) == 0) { - switch (event.type) { - case kEventSignal: - signal_handle(event); - break; - case kEventJobActivity: - job_handle(event); - break; - default: - abort(); - } - } -} - // Wait for some event -static bool poll_uv_loop(int32_t ms) +bool event_poll(int32_t ms) { bool timed_out; uv_run_mode run_mode = UV_RUN_ONCE; @@ -145,7 +85,37 @@ static bool poll_uv_loop(int32_t ms) uv_timer_stop(&timer); } - return input_ready() || !kl_empty(event_queue); + return input_ready() || event_is_pending(); +} + +bool event_is_pending() +{ + return !kl_empty(event_queue); +} + +// Push an event to the queue +void event_push(Event event) +{ + *kl_pushp(Event, event_queue) = event; +} + +// Runs the appropriate action for each queued event +void event_process() +{ + Event event; + + while (kl_shift(Event, event_queue, &event) == 0) { + switch (event.type) { + case kEventSignal: + signal_handle(event); + break; + case kEventJobActivity: + job_handle(event); + break; + default: + abort(); + } + } } // Set a flag in the `event_poll` loop for signaling of a timeout |