From 7c4b34580290046fe7c136fab97b0be5642ee163 Mon Sep 17 00:00:00 2001 From: Kimmo Hämäläinen Date: Thu, 3 Apr 2008 11:12:27 -0400 Subject: fix expiration of pending replies * bus/expirelist.c (do_expiration_with_current_time): calculate correct min wait time and next interval (bus_expire_list_add, bus_expire_list_add_link): if the timeout is disabled when we add an item to the expire list, enable the timeout (do_expiration_with_current_time): only set timeout if there are items to expire --- ChangeLog | 12 ++++++++++++ bus/expirelist.c | 41 +++++++++++++++++++++++++---------------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 96a0aeb7..1f91cc89 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-04-03 John (J5) Palmieri + + Patch from Kimmo Hämäläinen + + * bus/expirelist.c + (do_expiration_with_current_time): calculate correct min wait time + and next interval + (bus_expire_list_add, bus_expire_list_add_link): if the timeout is + disabled when we add an item to the expire list, enable the timeout + (do_expiration_with_current_time): only set timeout if there are + items to expire + 2008-04-01 Timo Hoenig Patch from Frederic Crozat diff --git a/bus/expirelist.c b/bus/expirelist.c index ee7d0d56..d718d9ff 100644 --- a/bus/expirelist.c +++ b/bus/expirelist.c @@ -138,9 +138,11 @@ do_expiration_with_current_time (BusExpireList *list, long tv_usec) { DBusList *link; - int next_interval; + int next_interval, min_wait_time, items_to_expire; next_interval = -1; + min_wait_time = 3600 * 1000; /* this is reset anyway if used */ + items_to_expire = 0; link = _dbus_list_get_first_link (&list->items); while (link != NULL) @@ -173,17 +175,20 @@ do_expiration_with_current_time (BusExpireList *list, } else { - /* We can end the loop, since the connections are in oldest-first order */ - next_interval = ((double)list->expire_after) - elapsed; - _dbus_verbose ("Item %p expires in %d milliseconds\n", - item, next_interval); + double to_wait; - break; + items_to_expire = 1; + to_wait = (double) list->expire_after - elapsed; + if (min_wait_time > to_wait) + min_wait_time = to_wait; } link = next; } + if (next_interval < 0 && items_to_expire) + next_interval = min_wait_time; + return next_interval; } @@ -223,16 +228,14 @@ void bus_expire_list_remove_link (BusExpireList *list, DBusList *link) { - _dbus_list_remove_link (&list->items, - link); + _dbus_list_remove_link (&list->items, link); } dbus_bool_t bus_expire_list_remove (BusExpireList *list, BusExpireItem *item) { - return _dbus_list_remove (&list->items, - item); + return _dbus_list_remove (&list->items, item); } void @@ -246,8 +249,13 @@ dbus_bool_t bus_expire_list_add (BusExpireList *list, BusExpireItem *item) { - return _dbus_list_prepend (&list->items, - item); + dbus_bool_t ret; + + ret = _dbus_list_prepend (&list->items, item); + if (ret && !dbus_timeout_get_enabled (list->timeout)) + bus_expire_timeout_set_interval (list->timeout, 0); + + return ret; } void @@ -256,8 +264,10 @@ bus_expire_list_add_link (BusExpireList *list, { _dbus_assert (link->data != NULL); - _dbus_list_prepend_link (&list->items, - link); + _dbus_list_prepend_link (&list->items, link); + + if (!dbus_timeout_get_enabled (list->timeout)) + bus_expire_timeout_set_interval (list->timeout, 0); } DBusList* @@ -270,8 +280,7 @@ DBusList* bus_expire_list_get_next_link (BusExpireList *list, DBusList *link) { - return _dbus_list_get_next_link (&list->items, - link); + return _dbus_list_get_next_link (&list->items, link); } dbus_bool_t -- cgit