Blob Blame History Raw
From 4727de9e9048ffa25784eb0cd536a13ac9644529 Mon Sep 17 00:00:00 2001
Message-Id: <4727de9e9048ffa25784eb0cd536a13ac9644529@dist-git>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Fri, 19 Jun 2020 11:43:12 +0200
Subject: [PATCH] util: Rework virStringListAdd
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

So every caller does the same: they use virStringListAdd() to add
new item into the list and then free the old copy to replace it
with new list. It's not very memory effective, nor environmental
friendly.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Erik Skultety <eskultet@redhat.com>
(cherry picked from commit 71a390e0fdb4e6cbeaef4c9045a501a6c8de5412)

https://bugzilla.redhat.com/show_bug.cgi?id=1839992

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Message-Id: <75aadf9f9464504bd1feec27d082b28c9fec0cbe.1592559697.git.mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
---
 src/util/virmacmap.c  |  8 ++------
 src/util/virstring.c  | 33 ++++++++++++---------------------
 src/util/virstring.h  |  4 ++--
 tests/virstringtest.c |  6 +-----
 4 files changed, 17 insertions(+), 34 deletions(-)

diff --git a/src/util/virmacmap.c b/src/util/virmacmap.c
index 88ca9b3f36..c7b700fa05 100644
--- a/src/util/virmacmap.c
+++ b/src/util/virmacmap.c
@@ -90,7 +90,6 @@ virMacMapAddLocked(virMacMapPtr mgr,
 {
     int ret = -1;
     char **macsList = NULL;
-    char **newMacsList = NULL;
 
     if ((macsList = virHashLookup(mgr->macs, domain)) &&
         virStringListHasString((const char**) macsList, mac)) {
@@ -98,15 +97,12 @@ virMacMapAddLocked(virMacMapPtr mgr,
         goto cleanup;
     }
 
-    if (!(newMacsList = virStringListAdd((const char **) macsList, mac)) ||
-        virHashUpdateEntry(mgr->macs, domain, newMacsList) < 0)
+    if (virStringListAdd(&macsList, mac) < 0 ||
+        virHashUpdateEntry(mgr->macs, domain, macsList) < 0)
         goto cleanup;
-    newMacsList = NULL;
-    virStringListFree(macsList);
 
     ret = 0;
  cleanup:
-    virStringListFree(newMacsList);
     return ret;
 }
 
diff --git a/src/util/virstring.c b/src/util/virstring.c
index 0f13b6c664..74fa2f6a94 100644
--- a/src/util/virstring.c
+++ b/src/util/virstring.c
@@ -175,32 +175,23 @@ char *virStringListJoin(const char **strings,
  * @strings: a NULL-terminated array of strings
  * @item: string to add
  *
- * Creates new strings list with all strings duplicated and @item
- * at the end of the list. Callers is responsible for freeing
- * both @strings and returned list.
+ * Appends @item into string list @strings. If *@strings is not
+ * allocated yet new string list is created.
+ *
+ * Returns: 0 on success,
+ *         -1 otherwise
  */
-char **
-virStringListAdd(const char **strings,
+int
+virStringListAdd(char ***strings,
                  const char *item)
 {
-    char **ret = NULL;
-    size_t i = virStringListLength(strings);
-
-    if (VIR_ALLOC_N(ret, i + 2) < 0)
-        goto error;
-
-    for (i = 0; strings && strings[i]; i++) {
-        if (VIR_STRDUP(ret[i], strings[i]) < 0)
-            goto error;
-    }
+    size_t i = virStringListLength((const char **) *strings);
 
-    if (VIR_STRDUP(ret[i], item) < 0)
-        goto error;
+    if (VIR_EXPAND_N(*strings, i, 2) < 0 ||
+        VIR_STRDUP((*strings)[i - 2], item) < 0)
+        return -1;
 
-    return ret;
- error:
-    virStringListFree(ret);
-    return NULL;
+    return 0;
 }
 
 
diff --git a/src/util/virstring.h b/src/util/virstring.h
index e68b9eec79..a3db08ce58 100644
--- a/src/util/virstring.h
+++ b/src/util/virstring.h
@@ -41,8 +41,8 @@ char *virStringListJoin(const char **strings,
                         const char *delim)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
-char **virStringListAdd(const char **strings,
-                        const char *item);
+int virStringListAdd(char ***strings,
+                     const char *item);
 void virStringListRemove(char ***strings,
                          const char *item);
 
diff --git a/tests/virstringtest.c b/tests/virstringtest.c
index 1230aba5b7..1a1e6364d1 100644
--- a/tests/virstringtest.c
+++ b/tests/virstringtest.c
@@ -179,12 +179,8 @@ static int testAdd(const void *args)
     size_t i;
 
     for (i = 0; data->tokens[i]; i++) {
-        char **tmp = virStringListAdd((const char **)list, data->tokens[i]);
-        if (!tmp)
+        if (virStringListAdd(&list, data->tokens[i]) < 0)
             goto cleanup;
-        virStringListFree(list);
-        list = tmp;
-        tmp = NULL;
     }
 
     if (!list &&
-- 
2.27.0