[libvirt] [PATCH 2/4] util: alloc: Introduce macro for self-freeing NULL-terminated lists

Peter Krempa pkrempa at redhat.com
Fri Feb 22 16:04:38 UTC 2019


VIR_AUTOLISTPTR allows you to define a pointer to a NULL-terminated list
of elements which will be auto-freed when destroying the scope.

This is done so that we can avoid using VIR_AUTOPTR in those cases as it
worked only for virStringList-related stuff.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/util/viralloc.h | 61 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 61 insertions(+)

diff --git a/src/util/viralloc.h b/src/util/viralloc.h
index 50a07d4fa3..983a6e83d1 100644
--- a/src/util/viralloc.h
+++ b/src/util/viralloc.h
@@ -631,6 +631,54 @@ void virAllocTestHook(void (*func)(int, void*), void *data);
         (func)(_ptr); \
     }

+
+# define VIR_AUTOLISTPTR_FUNC_NAME(type) type##AutoListPtrFree
+
+/**
+ * VIR_DEFINE_AUTOLISTPTR_FUNC:
+ * @type: type of the element of the list
+ * @func: freeing function for a single element of the list
+ *
+ * This macro defines the freeing function used by VIR_AUTOLISTPTR for @type.
+ * @func must free one of the elements of @type.
+ *
+ * Note that the function is not inline due to size and thus
+ * VIR_DECLARE_AUTOLISTPTR_FUNC needs to be used in the appropriate header file.
+ *
+ * VIR_DEFINE_AUTOLISTPTR_FUNC is mutually exclusive with
+ * VIR_DEFINE_AUTOLISTPTR_FUNC_DIRECT.
+ */
+# define VIR_DECLARE_AUTOLISTPTR_FUNC(type) \
+    void VIR_AUTOLISTPTR_FUNC_NAME(type)(type **_ptr);
+# define VIR_DEFINE_AUTOLISTPTR_FUNC(type, func) \
+    void VIR_AUTOLISTPTR_FUNC_NAME(type)(type **_ptr) \
+    { \
+        type *n;\
+        for (n = *_ptr; n && *n; n++) \
+            (func)(n); \
+        VIR_FREE(*_ptr);\
+    }
+
+/**
+ * VIR_DEFINE_AUTOLISTPTR_FUNC_DIRECT:
+ * @type: type of the element of the list
+ * @func: freeing function for the whole NULL-terminated list of @type
+ *
+ * This macro defines the freeing function used by VIR_AUTOLISTPTR for @type.
+ * @func must free a NULL terminated dense list of @type and also the list
+ * itself. This is a convenience option if @type has already such function.
+ *
+ * VIR_DEFINE_AUTOLISTPTR_FUNC_DIRECT is mutually exclusive with
+ * VIR_DEFINE_AUTOLISTPTR_FUNC.
+ */
+# define VIR_DEFINE_AUTOLISTPTR_FUNC_DIRECT(type, func) \
+    static inline void VIR_AUTOLISTPTR_FUNC_NAME(type)(type **_ptr) \
+    { \
+        if (*_ptr) \
+            (func)(*_ptr); \
+    }
+
+
 /**
  * VIR_AUTOFREE:
  * @type: type of the variable to be freed automatically
@@ -665,6 +713,19 @@ void virAllocTestHook(void (*func)(int, void*), void *data);
 # define VIR_AUTOCLEAN(type) \
     __attribute__((cleanup(VIR_AUTOCLEAN_FUNC_NAME(type)))) type

+/**
+ * VIR_AUTOLISTPTR:
+ * @type: type of the members of the self-freeing NULL-terminated list to be defined
+ *
+ * This macro defines a pointer to a NULL-terminated list of @type members. The
+ * list is automatically freed when it goes out of scope including elements
+ * themselves.
+ *
+ * The freeing function is registered by VIR_DEFINE_AUTOLISTPTR_FUNC or
+ * VIR_DEFINE_AUTOLISTPTR_FUNC_DIRECT macro for the given type.
+ */
+# define VIR_AUTOLISTPTR(type) \
+    __attribute__((cleanup(VIR_AUTOLISTPTR_FUNC_NAME(type)))) type *

 /**
  * VIR_AUTOUNREF:
-- 
2.20.1




More information about the libvir-list mailing list