X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-core%2Ftimeeventq.c;h=e8782c90d8cd0762edb250f9de7d6d3453d4f230;hb=263515cd1d7b52ce2ad3dc55a93b9d6f730133f1;hp=b069ffd14cb2ea23a0441ffd5a5a2b6b2ad1167f;hpb=4f0a5e7572a4257894b4bfede42c26d65152609e;p=catta diff --git a/avahi-core/timeeventq.c b/avahi-core/timeeventq.c index b069ffd..e8782c9 100644 --- a/avahi-core/timeeventq.c +++ b/avahi-core/timeeventq.c @@ -42,8 +42,9 @@ struct AvahiTimeEvent { }; struct AvahiTimeEventQueue { - AvahiPoll *poll_api; + const AvahiPoll *poll_api; AvahiPrioQueue *prioq; + AvahiTimeout *timeout; }; static int compare(const void* _a, const void* _b) { @@ -58,27 +59,31 @@ static int compare(const void* _a, const void* _b) { return avahi_timeval_compare(&a->last_run, &b->last_run); } -static void expiration_event(AvahiPoll *poll_api, void *userdata); +static AvahiTimeEvent* time_event_queue_root(AvahiTimeEventQueue *q) { + assert(q); + + return q->prioq->root ? q->prioq->root->data : NULL; +} -static void update_wakeup(AvahiTimeEventQueue *q) { +static void update_timeout(AvahiTimeEventQueue *q) { + AvahiTimeEvent *e; assert(q); - if (q->prioq->root) { - AvahiTimeEvent *e = q->prioq->root->data; - q->poll_api->set_wakeup(q->poll_api, &e->expiry, expiration_event, q); - } else - q->poll_api->set_wakeup(q->poll_api, NULL, NULL, NULL); + if ((e = time_event_queue_root(q))) + q->poll_api->timeout_update(q->timeout, &e->expiry); + else + q->poll_api->timeout_update(q->timeout, NULL); } -void expiration_event(AvahiPoll *poll_api, void *userdata) { - struct timeval now; +static void expiration_event(AvahiTimeout *timeout, void *userdata) { AvahiTimeEventQueue *q = userdata; AvahiTimeEvent *e; - gettimeofday(&now, NULL); - - if ((e = avahi_time_event_queue_root(q))) { + if ((e = time_event_queue_root(q))) { + struct timeval now; + gettimeofday(&now, NULL); + /* Check if expired */ if (avahi_timeval_compare(&now, &e->expiry) >= 0) { @@ -89,23 +94,29 @@ void expiration_event(AvahiPoll *poll_api, void *userdata) { /* Run it */ assert(e->callback); e->callback(e, e->userdata); - } + + update_timeout(q); + return; + } } - update_wakeup(q); + avahi_log_debug(__FILE__": Strange, expiration_event() called, but nothing really happened."); + update_timeout(q); } static void fix_expiry_time(AvahiTimeEvent *e) { struct timeval now; assert(e); + return; /*** DO WE REALLY NEED THIS? ***/ + gettimeofday(&now, NULL); if (avahi_timeval_compare(&now, &e->expiry) > 0) e->expiry = now; } -AvahiTimeEventQueue* avahi_time_event_queue_new(AvahiPoll *poll_api) { +AvahiTimeEventQueue* avahi_time_event_queue_new(const AvahiPoll *poll_api) { AvahiTimeEventQueue *q; if (!(q = avahi_new(AvahiTimeEventQueue, 1))) { @@ -113,27 +124,39 @@ AvahiTimeEventQueue* avahi_time_event_queue_new(AvahiPoll *poll_api) { goto oom; } + q->poll_api = poll_api; + if (!(q->prioq = avahi_prio_queue_new(compare))) goto oom; - q->poll_api = poll_api; + if (!(q->timeout = poll_api->timeout_new(poll_api, NULL, expiration_event, q))) + goto oom; + return q; oom: - if (q) + if (q) { avahi_free(q); + + if (q->prioq) + avahi_prio_queue_free(q->prioq); + } return NULL; } void avahi_time_event_queue_free(AvahiTimeEventQueue *q) { + AvahiTimeEvent *e; + assert(q); - while (q->prioq->root) - avahi_time_event_free(q->prioq->root->data); + while ((e = time_event_queue_root(q))) + avahi_time_event_free(e); avahi_prio_queue_free(q->prioq); + q->poll_api->timeout_free(q->timeout); + avahi_free(q); } @@ -175,7 +198,7 @@ AvahiTimeEvent* avahi_time_event_new( return NULL; } - update_wakeup(q); + update_timeout(q); return e; } @@ -188,7 +211,7 @@ void avahi_time_event_free(AvahiTimeEvent *e) { avahi_prio_queue_remove(q->prioq, e->node); avahi_free(e); - update_wakeup(q); + update_timeout(q); } void avahi_time_event_update(AvahiTimeEvent *e, const struct timeval *timeval) { @@ -199,19 +222,6 @@ void avahi_time_event_update(AvahiTimeEvent *e, const struct timeval *timeval) { fix_expiry_time(e); avahi_prio_queue_shuffle(e->queue->prioq, e->node); - update_wakeup(e->queue); + update_timeout(e->queue); } -AvahiTimeEvent* avahi_time_event_queue_root(AvahiTimeEventQueue *q) { - assert(q); - - return q->prioq->root ? q->prioq->root->data : NULL; -} - -AvahiTimeEvent* avahi_time_event_next(AvahiTimeEvent *e) { - assert(e); - - return e->node->next->data; -} - -