about summary refs log tree commit diff
path: root/shared/c-list/src
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2018-10-21 03:00:34 +0200
committerMichael Biebl <biebl@debian.org>2018-10-21 03:00:34 +0200
commit1f85f9683a41ca116af20fd19940576040303080 (patch)
tree54c4ac337fe0b0091772b7ef6a22c715dd985fab /shared/c-list/src
parenteca0cfe89a2a7ec88abe9c03075160f46b338137 (diff)
parent5554398639fa9e344bd12205a64874e6436b936e (diff)
Merge branch 'experimental'
Diffstat (limited to 'shared/c-list/src')
-rw-r--r--shared/c-list/src/c-list.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/shared/c-list/src/c-list.h b/shared/c-list/src/c-list.h
index ff434d8d..3d44e330 100644
--- a/shared/c-list/src/c-list.h
+++ b/shared/c-list/src/c-list.h
@@ -367,6 +367,25 @@ static inline CList *c_list_last(CList *list) {
              _safe = c_list_entry((_safe)->_m.next, __typeof__(*_iter), _m))    \
 
 /**
+ * c_list_flush() - flush all entries from a list
+ * @list:               list to flush
+ *
+ * This unlinks all entries from the given list @list and reinitializes their
+ * link-nodes via C_LIST_INIT().
+ *
+ * Note that the entries are not modified in any other way, nor is their memory
+ * released. This function just unlinks them and resets all the list nodes. It
+ * is particularly useful with temporary lists on the stack in combination with
+ * the GCC-extension __attribute__((__cleanup__(arg))).
+ */
+static inline void c_list_flush(CList *list) {
+        CList *iter, *safe;
+
+        c_list_for_each_safe_unlink(iter, safe, list)
+                /* empty */ ;
+}
+
+/**
  * c_list_length() - return number of linked entries, excluding the head
  * @list:               list to operate on
  *