diff options
Diffstat (limited to 'dbus/dbus-list.c')
-rw-r--r-- | dbus/dbus-list.c | 56 |
1 files changed, 43 insertions, 13 deletions
diff --git a/dbus/dbus-list.c b/dbus/dbus-list.c index d0ca8dfa..4c530dc7 100644 --- a/dbus/dbus-list.c +++ b/dbus/dbus-list.c @@ -94,7 +94,11 @@ static void free_link (DBusList *link) { dbus_mutex_lock (list_pool_lock); - _dbus_mem_pool_dealloc (list_pool, link); + if (_dbus_mem_pool_dealloc (list_pool, link)) + { + _dbus_mem_pool_free (list_pool); + list_pool = NULL; + } dbus_mutex_unlock (list_pool_lock); } @@ -429,21 +433,14 @@ _dbus_list_remove_last (DBusList **list, return FALSE; } -/** - * Removes a link from the list. This is a constant-time operation. - * - * @param list address of the list head. - * @param link the list link to remove. - */ -void -_dbus_list_remove_link (DBusList **list, - DBusList *link) +static void +_dbus_list_unlink (DBusList **list, + DBusList *link) { if (link->next == link) { /* one-element list */ *list = NULL; - free_link (link); } else { @@ -452,12 +449,24 @@ _dbus_list_remove_link (DBusList **list, if (*list == link) *list = link->next; - - free_link (link); } } /** + * Removes a link from the list. This is a constant-time operation. + * + * @param list address of the list head. + * @param link the list link to remove. + */ +void +_dbus_list_remove_link (DBusList **list, + DBusList *link) +{ + _dbus_list_unlink (list, link); + free_link (link); +} + +/** * Frees all links in the list and sets the list head to #NULL. Does * not free the data in each link, for obvious reasons. This is a * linear-time operation. @@ -544,6 +553,27 @@ _dbus_list_get_first (DBusList **list) } /** + * Removes the first link in the list and returns it. This is a + * constant-time operation. + * + * @param list address of the list head. + * @returns the first link in the list, or #NULL for an empty list. + */ +DBusList* +_dbus_list_pop_first_link (DBusList **list) +{ + DBusList *link; + + link = _dbus_list_get_first_link (list); + if (link == NULL) + return NULL; + + _dbus_list_unlink (list, link); + + return link; +} + +/** * Removes the first value in the list and returns it. This is a * constant-time operation. * |