#include "controlled_time.h" #include "lightningd.h" #include "timeout.h" void init_timeout_(struct timeout *t, unsigned int interval, void (*cb)(void *), void *arg) { timer_init(&t->timer); t->interval = time_from_sec(interval); t->cb = cb; t->arg = arg; } void refresh_timeout(struct lightningd_state *dstate, struct timeout *t) { timer_del(&dstate->timers, &t->timer); timer_add(&dstate->timers, &t->timer, timeabs_add(controlled_time(), 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; }