[libvirt] [PATCH v2 1/4] util: string: Introduce macro for automatic string lists

Peter Krempa pkrempa at redhat.com
Tue Feb 26 15:48:23 UTC 2019


Similar to VIR_AUTOPTR, VIR_AUTOSTRINGLIST defines a list of strings
which will be freed if the pointer is leaving scope.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/libvirt_private.syms |  1 +
 src/util/virstring.c     | 10 ++++++++++
 src/util/virstring.h     | 10 ++++++++++
 3 files changed, 21 insertions(+)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 038a744981..e68e3f3a3b 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2958,6 +2958,7 @@ virStringHasControlChars;
 virStringIsEmpty;
 virStringIsPrintable;
 virStringListAdd;
+virStringListAutoFree;
 virStringListFree;
 virStringListFreeCount;
 virStringListGetFirstWithPrefix;
diff --git a/src/util/virstring.c b/src/util/virstring.c
index e890dde546..8a791f96d4 100644
--- a/src/util/virstring.c
+++ b/src/util/virstring.c
@@ -318,6 +318,16 @@ void virStringListFree(char **strings)
 }


+void virStringListAutoFree(char ***strings)
+{
+    if (!*strings)
+        return;
+
+    virStringListFree(*strings);
+    *strings = NULL;
+}
+
+
 /**
  * virStringListFreeCount:
  * @strings: array of strings to free
diff --git a/src/util/virstring.h b/src/util/virstring.h
index aef82471c2..d14b7f4f49 100644
--- a/src/util/virstring.h
+++ b/src/util/virstring.h
@@ -53,6 +53,7 @@ int virStringListCopy(char ***dst,
                       const char **src);

 void virStringListFree(char **strings);
+void virStringListAutoFree(char ***strings);
 void virStringListFreeCount(char **strings,
                             size_t count);

@@ -307,6 +308,15 @@ int virStringParsePort(const char *str,
                        unsigned int *port)
     ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;

+/**
+ * VIR_AUTOSTRINGLIST:
+ *
+ * Declares a NULL-terminated list of strings which will be automatically freed
+ * when the pointer goes out of scope.
+ */
+# define VIR_AUTOSTRINGLIST \
+        __attribute__((cleanup(virStringListAutoFree))) char **
+
 VIR_DEFINE_AUTOPTR_FUNC(virString, virStringListFree);

 #endif /* LIBVIRT_VIRSTRING_H */
-- 
2.20.1




More information about the libvir-list mailing list