summaryrefslogtreecommitdiffstats
path: root/dbus/dbus-list.c
diff options
context:
space:
mode:
Diffstat (limited to 'dbus/dbus-list.c')
-rw-r--r--dbus/dbus-list.c56
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.
*