From d5b759b9170b84d4257568da236b6057f268b12d Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 5 Jun 2016 04:01:50 -0400 Subject: allow canceling timers before they expire --- src/loop.c | 20 +++++++++++++++++++- src/loop.h | 3 ++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/loop.c b/src/loop.c index c40d52c..f37c431 100644 --- a/src/loop.c +++ b/src/loop.c @@ -19,6 +19,7 @@ struct runes_loop_timer_data { static void runes_loop_work_cb(evutil_socket_t fd, short what, void *arg); static void runes_loop_timer_cb(evutil_socket_t fd, short what, void *arg); +static void runes_loop_free_timer_data(struct runes_loop_timer_data *data); RunesLoop *runes_loop_new() { @@ -53,7 +54,7 @@ void runes_loop_start_work( event_add(data->event, NULL); } -void runes_loop_timer_set( +void *runes_loop_timer_set( RunesLoop *loop, int timeout, void *t, void (*cb)(void*)) { struct runes_loop_timer_data *data; @@ -71,6 +72,18 @@ void runes_loop_timer_set( data->timeout->tv_usec = timeout * 1000; event_add(data->event, data->timeout); + + return (void *)data; +} + +void runes_loop_timer_clear(RunesLoop *loop, void *arg) +{ + struct runes_loop_timer_data *data = arg; + + UNUSED(loop); + + event_del(data->event); + runes_loop_free_timer_data(data); } void runes_loop_delete(RunesLoop *loop) @@ -105,6 +118,11 @@ static void runes_loop_timer_cb(evutil_socket_t fd, short what, void *arg) data->cb(data->t); + runes_loop_free_timer_data(data); +} + +static void runes_loop_free_timer_data(struct runes_loop_timer_data *data) +{ event_free(data->event); free(data->timeout); free(data); diff --git a/src/loop.h b/src/loop.h index bc21a4d..92d6cf9 100644 --- a/src/loop.h +++ b/src/loop.h @@ -12,8 +12,9 @@ void runes_loop_run(RunesLoop *loop); void runes_loop_stop(RunesLoop *loop); void runes_loop_start_work( RunesLoop *loop, int fd, void *t, int (*cb)(void*)); -void runes_loop_timer_set( +void *runes_loop_timer_set( RunesLoop *loop, int timeout, void *t, void (*cb)(void*)); +void runes_loop_timer_clear(RunesLoop *loop, void *arg); void runes_loop_delete(RunesLoop *loop); #endif -- cgit v1.2.3