diff options
Diffstat (limited to 'src/os/event.c')
-rw-r--r-- | src/os/event.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/src/os/event.c b/src/os/event.c index 0a7d2c096c..ce630d5318 100644 --- a/src/os/event.c +++ b/src/os/event.c @@ -6,8 +6,10 @@ #include "os/event.h" #include "os/input.h" -static uv_timer_t timer_req; +static uv_timer_t timer; +static uv_prepare_t timer_prepare; static void timer_cb(uv_timer_t *handle, int); +static void timer_prepare_cb(uv_prepare_t *, int); void event_init() { @@ -15,7 +17,9 @@ void event_init() input_init(); /* Timer to wake the event loop if a timeout argument is passed to * `event_poll` */ - uv_timer_init(uv_default_loop(), &timer_req); + uv_timer_init(uv_default_loop(), &timer); + /* This prepare handle that actually starts the timer */ + uv_prepare_init(uv_default_loop(), &timer_prepare); } /* Wait for some event */ @@ -33,10 +37,12 @@ bool event_poll(int32_t ms) timed_out = false; if (ms > 0) { - /* Timeout passed as argument, start the libuv timer to wake us up and - * set our local flag */ - timer_req.data = &timed_out; - uv_timer_start(&timer_req, timer_cb, ms, 0); + /* Timeout passed as argument to the timer */ + timer.data = &timed_out; + /* We only start the timer after the loop is running, for that we + * use an prepare handle(pass the interval as data to it) */ + timer_prepare.data = &ms; + uv_prepare_start(&timer_prepare, timer_prepare_cb); } else if (ms == 0) { /* * For ms == 0, we need to do a non-blocking event poll by @@ -58,10 +64,11 @@ bool event_poll(int32_t ms) input_stop(); - if (!timed_out && ms > 0) { + if (ms > 0) { /* Timer event did not trigger, stop the watcher since we no longer * care about it */ - uv_timer_stop(&timer_req); + uv_timer_stop(&timer); + uv_prepare_stop(&timer_prepare); } return input_ready(); @@ -72,3 +79,8 @@ static void timer_cb(uv_timer_t *handle, int status) { *((bool *)handle->data) = true; } + +static void timer_prepare_cb(uv_prepare_t *handle, int status) +{ + uv_timer_start(&timer, timer_cb, *(uint32_t *)handle->data, 0); +} |