summaryrefslogtreecommitdiffstats
path: root/bus
diff options
context:
space:
mode:
authorKimmo Hämäläinen <kimmo.hamalainen@nokia.com>2008-04-03 11:12:27 -0400
committerJohn (J5) Palmieri <johnp@redhat.com>2008-04-03 11:12:27 -0400
commit7c4b34580290046fe7c136fab97b0be5642ee163 (patch)
tree618afe545eae567ece7e119b49a8138d6108b857 /bus
parent960fef844bdb0054c082a31e43f9631b1d5eb69b (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')
-rw-r--r--bus/expirelist.c41
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