+2008-04-03 John (J5) Palmieri <johnp@redhat.com>
+
+ Patch from Kimmo Hämäläinen <kimmo.hamalainen at nokia.com>
+
+ * 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 <thoenig@suse.de>
Patch from Frederic Crozat <fcrozat@mandriva.com>
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)
}
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;
}
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
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
{
_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*
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