1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ 2c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington/* expirelist.c List of items that expire 3c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * 4c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * Copyright (C) 2003 Red Hat, Inc. 5c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * 643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1 7c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * 8c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * This program is free software; you can redistribute it and/or modify 9c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * it under the terms of the GNU General Public License as published by 10c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * the Free Software Foundation; either version 2 of the License, or 11c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * (at your option) any later version. 12c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * 13c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * This program is distributed in the hope that it will be useful, 14c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 15c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * GNU General Public License for more details. 17c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * 18c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * You should have received a copy of the GNU General Public License 19c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * along with this program; if not, write to the Free Software 205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington * 22c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington */ 23c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 24dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h> 25c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington#include "expirelist.h" 26c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington#include "test.h" 27c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington#include <dbus/dbus-internals.h> 28c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington#include <dbus/dbus-mainloop.h> 29c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington#include <dbus/dbus-timeout.h> 30c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 31a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonstruct BusExpireList 32a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington{ 33a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington DBusList *items; /**< List of BusExpireItem */ 34a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington DBusTimeout *timeout; 35a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington DBusLoop *loop; 36a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington BusExpireFunc expire_func; 37a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington void *data; 38a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington int expire_after; /**< Expire after milliseconds (thousandths) */ 39a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington}; 40a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 41c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonstatic dbus_bool_t expire_timeout_handler (void *data); 42c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 43c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonstatic void 44c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtoncall_timeout_callback (DBusTimeout *timeout, 45c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington void *data) 46c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington{ 47c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington /* can return FALSE on OOM but we just let it fire again later */ 48c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington dbus_timeout_handle (timeout); 49c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington} 50c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 51c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc PenningtonBusExpireList* 52c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonbus_expire_list_new (DBusLoop *loop, 53c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington int expire_after, 54c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington BusExpireFunc expire_func, 55c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington void *data) 56c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington{ 57c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington BusExpireList *list; 58c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 59c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington list = dbus_new0 (BusExpireList, 1); 60c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington if (list == NULL) 61c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington return NULL; 62c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 63c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington list->expire_func = expire_func; 64c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington list->data = data; 65c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington list->loop = loop; 66c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington list->expire_after = expire_after; 67c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 68c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington list->timeout = _dbus_timeout_new (100, /* irrelevant */ 69c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington expire_timeout_handler, 70c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington list, NULL); 71c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington if (list->timeout == NULL) 72c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington goto failed; 73c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 74c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_timeout_set_enabled (list->timeout, FALSE); 75c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 76c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington if (!_dbus_loop_add_timeout (list->loop, 77c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington list->timeout, 78c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington call_timeout_callback, NULL, NULL)) 79c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington goto failed; 80c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 81c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington return list; 82c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 83c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington failed: 84c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington if (list->timeout) 85c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_timeout_unref (list->timeout); 86c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 87c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington dbus_free (list); 88c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 89c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington return NULL; 90c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington} 91c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 92c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonvoid 93c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonbus_expire_list_free (BusExpireList *list) 94c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington{ 95c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_assert (list->items == NULL); 96c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 97c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_loop_remove_timeout (list->loop, list->timeout, 98c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington call_timeout_callback, NULL); 99c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 100c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_timeout_unref (list->timeout); 101c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 102c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington dbus_free (list); 103c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington} 104c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 105c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonvoid 106a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonbus_expire_timeout_set_interval (DBusTimeout *timeout, 107a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington int next_interval) 108c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington{ 109c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington if (next_interval >= 0) 110c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington { 111c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_timeout_set_interval (timeout, 112c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington next_interval); 113c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_timeout_set_enabled (timeout, TRUE); 114c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 115a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington _dbus_verbose ("Enabled an expire timeout with interval %d\n", 116c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington next_interval); 117c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington } 118c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington else if (dbus_timeout_get_enabled (timeout)) 119c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington { 120c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_timeout_set_enabled (timeout, FALSE); 121c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 122a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington _dbus_verbose ("Disabled an expire timeout\n"); 123c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington } 124c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington else 125a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington _dbus_verbose ("No need to disable this expire timeout\n"); 126a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington} 127a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 128a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonvoid 129a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonbus_expire_list_recheck_immediately (BusExpireList *list) 130a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington{ 131a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington _dbus_verbose ("setting interval on expire list to 0 for immediate recheck\n"); 132a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 133a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_timeout_set_interval (list->timeout, 0); 134c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington} 135c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 136c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonstatic int 137c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtondo_expiration_with_current_time (BusExpireList *list, 138c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington long tv_sec, 139c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington long tv_usec) 140c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington{ 141c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington DBusList *link; 1427c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen int next_interval, min_wait_time, items_to_expire; 143c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 144c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington next_interval = -1; 1457c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen min_wait_time = 3600 * 1000; /* this is reset anyway if used */ 1467c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen items_to_expire = 0; 147c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 148c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington link = _dbus_list_get_first_link (&list->items); 149c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington while (link != NULL) 150c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington { 151c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington DBusList *next = _dbus_list_get_next_link (&list->items, link); 152c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington double elapsed; 153c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington BusExpireItem *item; 154c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 155c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington item = link->data; 156c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 157c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington elapsed = ELAPSED_MILLISECONDS_SINCE (item->added_tv_sec, 158c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington item->added_tv_usec, 159c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington tv_sec, tv_usec); 160c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 161d33cfec625bf769384cc370ad0ea660c9993aa15Scott James Remnant if (((item->added_tv_sec == 0) && (item->added_tv_usec == 0)) || 162d672d0320628e93a247eeff89945c81926a42163Scott James Remnant ((list->expire_after > 0) && (elapsed >= (double) list->expire_after))) 163c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington { 164c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_verbose ("Expiring an item %p\n", item); 16564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington 16664f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington /* If the expire function fails, we just end up expiring 167bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington * this item next time we walk through the list. This would 168bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington * be an indeterminate time normally, so we set up the 169bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington * next_interval to be "shortly" (just enough to avoid 170bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington * a busy loop) 17164f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington */ 172bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington if (!(* list->expire_func) (list, link, list->data)) 173bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington { 174bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington next_interval = _dbus_get_oom_wait (); 175bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington break; 176bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington } 177c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington } 178d672d0320628e93a247eeff89945c81926a42163Scott James Remnant else if (list->expire_after > 0) 179c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington { 1807c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen double to_wait; 181c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 1827c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen items_to_expire = 1; 1837c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen to_wait = (double) list->expire_after - elapsed; 1847c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen if (min_wait_time > to_wait) 1857c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen min_wait_time = to_wait; 186c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington } 187c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 188c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington link = next; 189c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington } 190c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 1917c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen if (next_interval < 0 && items_to_expire) 1927c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen next_interval = min_wait_time; 1937c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen 194c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington return next_interval; 195c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington} 196c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 197c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonstatic void 198c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonbus_expirelist_expire (BusExpireList *list) 199c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington{ 200c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington int next_interval; 201c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 202c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington next_interval = -1; 203c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 204c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington if (list->items != NULL) 205c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington { 206c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington long tv_sec, tv_usec; 207c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 208c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_get_current_time (&tv_sec, &tv_usec); 209c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 210c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington next_interval = do_expiration_with_current_time (list, tv_sec, tv_usec); 211c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington } 212c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 213c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington bus_expire_timeout_set_interval (list->timeout, next_interval); 214c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington} 215c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 216c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonstatic dbus_bool_t 217c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonexpire_timeout_handler (void *data) 218c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington{ 219c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington BusExpireList *list = data; 220c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 221d5217348517e6b00a04e500ca460daf6cc928cd9Ralf Habacker _dbus_verbose ("Running\n"); 222c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 223c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington /* note that this may remove the timeout */ 224c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington bus_expirelist_expire (list); 225c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 226c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington return TRUE; 227c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington} 228c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 229a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonvoid 230a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonbus_expire_list_remove_link (BusExpireList *list, 231a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington DBusList *link) 232a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington{ 2337c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen _dbus_list_remove_link (&list->items, link); 234a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington} 235a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 236a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtondbus_bool_t 237a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonbus_expire_list_remove (BusExpireList *list, 238a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington BusExpireItem *item) 239a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington{ 2407c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen return _dbus_list_remove (&list->items, item); 241a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington} 242a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 243a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonvoid 244a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonbus_expire_list_unlink (BusExpireList *list, 245a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington DBusList *link) 246a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington{ 247a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington _dbus_list_unlink (&list->items, link); 248a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington} 249a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 250a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtondbus_bool_t 251a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonbus_expire_list_add (BusExpireList *list, 252a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington BusExpireItem *item) 253a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington{ 2547c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen dbus_bool_t ret; 2557c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen 2567c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen ret = _dbus_list_prepend (&list->items, item); 2577c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen if (ret && !dbus_timeout_get_enabled (list->timeout)) 2587c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen bus_expire_timeout_set_interval (list->timeout, 0); 2597c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen 2607c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen return ret; 261a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington} 262a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 263a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonvoid 264a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonbus_expire_list_add_link (BusExpireList *list, 265a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington DBusList *link) 266a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington{ 267a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington _dbus_assert (link->data != NULL); 268a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 2697c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen _dbus_list_prepend_link (&list->items, link); 2707c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen 2717c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen if (!dbus_timeout_get_enabled (list->timeout)) 2727c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen bus_expire_timeout_set_interval (list->timeout, 0); 273a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington} 274a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 275a37404111be4912cd8b51080bcbe219edded35f5Havoc PenningtonDBusList* 276a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonbus_expire_list_get_first_link (BusExpireList *list) 277a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington{ 278a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington return _dbus_list_get_first_link (&list->items); 279a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington} 280a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 281a37404111be4912cd8b51080bcbe219edded35f5Havoc PenningtonDBusList* 282a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonbus_expire_list_get_next_link (BusExpireList *list, 283a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington DBusList *link) 284a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington{ 2857c4b34580290046fe7c136fab97b0be5642ee163Kimmo Hämäläinen return _dbus_list_get_next_link (&list->items, link); 286a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington} 287a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 288a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtondbus_bool_t 289a37404111be4912cd8b51080bcbe219edded35f5Havoc Penningtonbus_expire_list_contains_item (BusExpireList *list, 290a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington BusExpireItem *item) 291a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington{ 292a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington return _dbus_list_find_last (&list->items, item) != NULL; 293a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington} 294a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington 295c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington#ifdef DBUS_BUILD_TESTS 296c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 297c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtontypedef struct 298c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington{ 299c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington BusExpireItem item; 300c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington int expire_count; 301c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington} TestExpireItem; 302c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 303bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Penningtonstatic dbus_bool_t 304c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtontest_expire_func (BusExpireList *list, 30564f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington DBusList *link, 306c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington void *data) 307c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington{ 308c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington TestExpireItem *t; 309c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 31064f5ae1a79a8cd86a3aae55e485729da438d84d0Havoc Pennington t = (TestExpireItem*) link->data; 311c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 312c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington t->expire_count += 1; 313bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington 314bebc830fc47cbf191f7518dfd0cd88c4938c2dbfHavoc Pennington return TRUE; 315c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington} 316c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 317c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonstatic void 318c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtontime_add_milliseconds (long *tv_sec, 319c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington long *tv_usec, 320c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington int milliseconds) 321c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington{ 322c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington *tv_sec = *tv_sec + milliseconds / 1000; 323c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington *tv_usec = *tv_usec + milliseconds * 1000; 324c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington if (*tv_usec >= 1000000) 325c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington { 326c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington *tv_usec -= 1000000; 327c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington *tv_sec += 1; 328c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington } 329c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington} 330c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 331c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtondbus_bool_t 332c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Penningtonbus_expire_list_test (const DBusString *test_data_dir) 333c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington{ 334c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington DBusLoop *loop; 335c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington BusExpireList *list; 336c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington long tv_sec, tv_usec; 337c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington long tv_sec_not_expired, tv_usec_not_expired; 338c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington long tv_sec_expired, tv_usec_expired; 339c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington long tv_sec_past, tv_usec_past; 340c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington TestExpireItem *item; 341c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington int next_interval; 3429a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J dbus_bool_t result = FALSE; 3439a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 3449a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 345c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington loop = _dbus_loop_new (); 346c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_assert (loop != NULL); 347c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 348c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington#define EXPIRE_AFTER 100 349c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 350c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington list = bus_expire_list_new (loop, EXPIRE_AFTER, 351c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington test_expire_func, NULL); 352c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_assert (list != NULL); 353c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 354c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_get_current_time (&tv_sec, &tv_usec); 355c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 356c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington tv_sec_not_expired = tv_sec; 357c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington tv_usec_not_expired = tv_usec; 358c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington time_add_milliseconds (&tv_sec_not_expired, 359c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington &tv_usec_not_expired, EXPIRE_AFTER - 1); 360c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 361c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington tv_sec_expired = tv_sec; 362c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington tv_usec_expired = tv_usec; 363c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington time_add_milliseconds (&tv_sec_expired, 364c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington &tv_usec_expired, EXPIRE_AFTER); 365c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 366c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 367c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington tv_sec_past = tv_sec - 1; 368c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington tv_usec_past = tv_usec; 369c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 370c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington item = dbus_new0 (TestExpireItem, 1); 371c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 3729a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J if (item == NULL) 3739a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J goto oom; 3749a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 375c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington item->item.added_tv_sec = tv_sec; 376c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington item->item.added_tv_usec = tv_usec; 377a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington if (!bus_expire_list_add (list, &item->item)) 378c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_assert_not_reached ("out of memory"); 379c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 380c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington next_interval = 381c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington do_expiration_with_current_time (list, tv_sec_not_expired, 382c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington tv_usec_not_expired); 383c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_assert (item->expire_count == 0); 384c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_verbose ("next_interval = %d\n", next_interval); 385c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_assert (next_interval == 1); 386c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 387c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington next_interval = 388c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington do_expiration_with_current_time (list, tv_sec_expired, 389c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington tv_usec_expired); 390c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_assert (item->expire_count == 1); 391c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_verbose ("next_interval = %d\n", next_interval); 392c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_assert (next_interval == -1); 393c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 394c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington next_interval = 395c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington do_expiration_with_current_time (list, tv_sec_past, 396c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington tv_usec_past); 397c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_assert (item->expire_count == 1); 398c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_verbose ("next_interval = %d\n", next_interval); 399c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_assert (next_interval == 1000 + EXPIRE_AFTER); 400c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 401a37404111be4912cd8b51080bcbe219edded35f5Havoc Pennington bus_expire_list_remove (list, &item->item); 402c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington dbus_free (item); 403c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 404c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington bus_expire_list_free (list); 405c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington _dbus_loop_unref (loop); 406c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 4079a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J result = TRUE; 4089a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J 4099a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J oom: 4109a3145b9f3cb0d7d570230aaa6193f87e3bea604John (J return result; 411c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington} 412c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington 413c9c84cd9a1108d4a701ded6b62971c4f52e3089fHavoc Pennington#endif /* DBUS_BUILD_TESTS */ 414