diff options
author | Kimmo Hämäläinen <kimmo.hamalainen@nokia.com> | 2008-04-03 11:12:27 -0400 |
---|---|---|
committer | John (J5) Palmieri <johnp@redhat.com> | 2008-04-03 11:12:27 -0400 |
commit | 7c4b34580290046fe7c136fab97b0be5642ee163 (patch) | |
tree | 618afe545eae567ece7e119b49a8138d6108b857 /bus/expirelist.c | |
parent | 960fef844bdb0054c082a31e43f9631b1d5eb69b (diff) |
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
Diffstat (limited to 'bus/expirelist.c')
-rw-r--r-- | bus/expirelist.c | 41 |
1 files changed, 25 insertions, 16 deletions
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 |