From 6ba5c3cc3b5f5373d7a8662155229263fb26a392 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 22 Jan 2016 06:45:27 +1030 Subject: [PATCH] timeout: oneshot timer support. Signed-off-by: Rusty Russell --- daemon/timeout.c | 36 ++++++++++++++++++++++++++++++++++++ daemon/timeout.h | 9 +++++++++ 2 files changed, 45 insertions(+) diff --git a/daemon/timeout.c b/daemon/timeout.c index 7977f68b5..fcc408e8e 100644 --- a/daemon/timeout.c +++ b/daemon/timeout.c @@ -16,3 +16,39 @@ void refresh_timeout(struct lightningd_state *dstate, struct timeout *t) timer_add(&dstate->timers, &t->timer, timeabs_add(time_now(), t->interval)); } + +/* FIXME: Make all timers one-shot! */ +struct oneshot { + struct timeout timeout; + struct lightningd_state *dstate; + void (*cb)(void *); + void *arg; +}; + +static void remove_timer(struct oneshot *o) +{ + timer_del(&o->dstate->timers, &o->timeout.timer); +} + +static void oneshot_done(struct oneshot *o) +{ + o->cb(o->arg); + tal_free(o); +} + +struct oneshot *oneshot_timeout_(struct lightningd_state *dstate, + const tal_t *ctx, unsigned int seconds, + void (*cb)(void *), void *arg) +{ + struct oneshot *o = tal(ctx, struct oneshot); + + o->dstate = dstate; + o->cb = cb; + o->arg = arg; + + init_timeout(&o->timeout, seconds, oneshot_done, o); + refresh_timeout(dstate, &o->timeout); + tal_add_destructor(o, remove_timer); + + return o; +} diff --git a/daemon/timeout.h b/daemon/timeout.h index d0256a4ee..90ffee45f 100644 --- a/daemon/timeout.h +++ b/daemon/timeout.h @@ -24,4 +24,13 @@ void refresh_timeout(struct lightningd_state *dstate, struct timeout *t); init_timeout_((t), (interval), \ typesafe_cb(void, void *, (func), (arg)), (arg)) +/* tal_free this to disable timer. */ +struct oneshot *oneshot_timeout_(struct lightningd_state *dstate, + const tal_t *ctx, unsigned int seconds, + void (*cb)(void *), void *arg); + +#define oneshot_timeout(dstate, ctx, interval, func, arg) \ + oneshot_timeout_((dstate), (ctx), (interval), \ + typesafe_cb(void, void *, (func), (arg)), (arg)) + #endif /* LIGHTNING_DAEMON_TIMEOUT_H */