From 7c4b34580290046fe7c136fab97b0be5642ee163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kimmo=20H=C3=A4m=C3=A4l=C3=A4inen?= 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 --- bus/expirelist.c | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) (limited to 'bus/expirelist.c') 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 v1.2.1