diff --git a/include/lighttpd/waitqueue.h b/include/lighttpd/waitqueue.h index de2cad1..e8c5770 100644 --- a/include/lighttpd/waitqueue.h +++ b/include/lighttpd/waitqueue.h @@ -29,12 +29,15 @@ struct liWaitQueue { * li_waitqueue_push, li_waitqueue_pop and li_waitqueue_remove have O(1) complexity */ -/* initializes a waitqueue by creating and starting the ev_timer. precision is sub-seconds */ +/* initializes a waitqueue by creating the ev_timer and initializing the queue. precision is sub-seconds */ LI_API void li_waitqueue_init(liWaitQueue *queue, struct ev_loop *loop, liWaitQueueCB callback, gdouble delay, gpointer data); /* stops the waitqueue. to restart it, simply call li_waitqueue_update */ LI_API void li_waitqueue_stop(liWaitQueue *queue); +/* updates the delay of the timer. if timer is active, it is stopped and restarted */ +LI_API void li_waitqueue_set_delay(liWaitQueue *queue, gdouble delay); + /* updates the timeout of the waitqueue, you should allways call this at the end of your callback */ LI_API void li_waitqueue_update(liWaitQueue *queue); diff --git a/src/common/waitqueue.c b/src/common/waitqueue.c index 002f270..5d3113a 100644 --- a/src/common/waitqueue.c +++ b/src/common/waitqueue.c @@ -14,6 +14,16 @@ void li_waitqueue_stop(liWaitQueue *queue) { ev_timer_stop(queue->loop, &queue->timer); } +void li_waitqueue_set_delay(liWaitQueue *queue, gdouble delay) { + if (ev_is_active(&queue->timer)) { + ev_timer_stop(queue->loop, &queue->timer); + ev_timer_set(&queue->timer, delay, delay); + ev_timer_start(queue->loop, &queue->timer); + } else { + ev_timer_set(&queue->timer, delay, delay); + } +} + void li_waitqueue_update(liWaitQueue *queue) { ev_tstamp repeat; ev_tstamp now = ev_now(queue->loop);