aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2016-06-05 04:01:50 -0400
committerJesse Luehrs <doy@tozt.net>2016-06-05 04:01:50 -0400
commitd5b759b9170b84d4257568da236b6057f268b12d (patch)
tree7e1161efb51748485bfd74e8624acb5d8f7f825b
parent827846b76373196c1d6f746c305f487bc29a0177 (diff)
downloadrunes-d5b759b9170b84d4257568da236b6057f268b12d.tar.gz
runes-d5b759b9170b84d4257568da236b6057f268b12d.zip
allow canceling timers before they expire
-rw-r--r--src/loop.c20
-rw-r--r--src/loop.h3
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