render / rpms / libvirt

Forked from rpms/libvirt 5 months ago
Clone
Pablo Greco 40546a
From e7d53ee08ec9929974fb4159be8359c4ba88f5b2 Mon Sep 17 00:00:00 2001
Pablo Greco 40546a
Message-Id: <e7d53ee08ec9929974fb4159be8359c4ba88f5b2@dist-git>
Pablo Greco 40546a
From: Michal Privoznik <mprivozn@redhat.com>
Pablo Greco 40546a
Date: Fri, 21 Jun 2019 09:26:05 +0200
Pablo Greco 40546a
Subject: [PATCH] util: Rework virStringListAdd
Pablo Greco 40546a
MIME-Version: 1.0
Pablo Greco 40546a
Content-Type: text/plain; charset=UTF-8
Pablo Greco 40546a
Content-Transfer-Encoding: 8bit
Pablo Greco 40546a
Pablo Greco 40546a
So every caller does the same: they use virStringListAdd() to add
Pablo Greco 40546a
new item into the list and then free the old copy to replace it
Pablo Greco 40546a
with new list. It's not very memory effective, nor environmental
Pablo Greco 40546a
friendly.
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Pablo Greco 40546a
Reviewed-by: Erik Skultety <eskultet@redhat.com>
Pablo Greco 40546a
(cherry picked from commit 71a390e0fdb4e6cbeaef4c9045a501a6c8de5412)
Pablo Greco 40546a
Pablo Greco 40546a
https://bugzilla.redhat.com/show_bug.cgi?id=1697627
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Pablo Greco 40546a
Message-Id: <a9764c87b3f557a2fd9ac8c5fcd077a3d713e2ca.1561068591.git.jdenemar@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
---
Pablo Greco 40546a
 src/util/virmacmap.c  |  8 ++------
Pablo Greco 40546a
 src/util/virstring.c  | 33 ++++++++++++---------------------
Pablo Greco 40546a
 src/util/virstring.h  |  4 ++--
Pablo Greco 40546a
 tests/virstringtest.c |  6 +-----
Pablo Greco 40546a
 4 files changed, 17 insertions(+), 34 deletions(-)
Pablo Greco 40546a
Pablo Greco 40546a
diff --git a/src/util/virmacmap.c b/src/util/virmacmap.c
Pablo Greco 40546a
index 88ca9b3f36..c7b700fa05 100644
Pablo Greco 40546a
--- a/src/util/virmacmap.c
Pablo Greco 40546a
+++ b/src/util/virmacmap.c
Pablo Greco 40546a
@@ -90,7 +90,6 @@ virMacMapAddLocked(virMacMapPtr mgr,
Pablo Greco 40546a
 {
Pablo Greco 40546a
     int ret = -1;
Pablo Greco 40546a
     char **macsList = NULL;
Pablo Greco 40546a
-    char **newMacsList = NULL;
Pablo Greco 40546a
 
Pablo Greco 40546a
     if ((macsList = virHashLookup(mgr->macs, domain)) &&
Pablo Greco 40546a
         virStringListHasString((const char**) macsList, mac)) {
Pablo Greco 40546a
@@ -98,15 +97,12 @@ virMacMapAddLocked(virMacMapPtr mgr,
Pablo Greco 40546a
         goto cleanup;
Pablo Greco 40546a
     }
Pablo Greco 40546a
 
Pablo Greco 40546a
-    if (!(newMacsList = virStringListAdd((const char **) macsList, mac)) ||
Pablo Greco 40546a
-        virHashUpdateEntry(mgr->macs, domain, newMacsList) < 0)
Pablo Greco 40546a
+    if (virStringListAdd(&macsList, mac) < 0 ||
Pablo Greco 40546a
+        virHashUpdateEntry(mgr->macs, domain, macsList) < 0)
Pablo Greco 40546a
         goto cleanup;
Pablo Greco 40546a
-    newMacsList = NULL;
Pablo Greco 40546a
-    virStringListFree(macsList);
Pablo Greco 40546a
 
Pablo Greco 40546a
     ret = 0;
Pablo Greco 40546a
  cleanup:
Pablo Greco 40546a
-    virStringListFree(newMacsList);
Pablo Greco 40546a
     return ret;
Pablo Greco 40546a
 }
Pablo Greco 40546a
 
Pablo Greco 40546a
diff --git a/src/util/virstring.c b/src/util/virstring.c
Pablo Greco 40546a
index 0f13b6c664..74fa2f6a94 100644
Pablo Greco 40546a
--- a/src/util/virstring.c
Pablo Greco 40546a
+++ b/src/util/virstring.c
Pablo Greco 40546a
@@ -175,32 +175,23 @@ char *virStringListJoin(const char **strings,
Pablo Greco 40546a
  * @strings: a NULL-terminated array of strings
Pablo Greco 40546a
  * @item: string to add
Pablo Greco 40546a
  *
Pablo Greco 40546a
- * Creates new strings list with all strings duplicated and @item
Pablo Greco 40546a
- * at the end of the list. Callers is responsible for freeing
Pablo Greco 40546a
- * both @strings and returned list.
Pablo Greco 40546a
+ * Appends @item into string list @strings. If *@strings is not
Pablo Greco 40546a
+ * allocated yet new string list is created.
Pablo Greco 40546a
+ *
Pablo Greco 40546a
+ * Returns: 0 on success,
Pablo Greco 40546a
+ *         -1 otherwise
Pablo Greco 40546a
  */
Pablo Greco 40546a
-char **
Pablo Greco 40546a
-virStringListAdd(const char **strings,
Pablo Greco 40546a
+int
Pablo Greco 40546a
+virStringListAdd(char ***strings,
Pablo Greco 40546a
                  const char *item)
Pablo Greco 40546a
 {
Pablo Greco 40546a
-    char **ret = NULL;
Pablo Greco 40546a
-    size_t i = virStringListLength(strings);
Pablo Greco 40546a
+    size_t i = virStringListLength((const char **) *strings);
Pablo Greco 40546a
 
Pablo Greco 40546a
-    if (VIR_ALLOC_N(ret, i + 2) < 0)
Pablo Greco 40546a
-        goto error;
Pablo Greco 40546a
+    if (VIR_EXPAND_N(*strings, i, 2) < 0 ||
Pablo Greco 40546a
+        VIR_STRDUP((*strings)[i - 2], item) < 0)
Pablo Greco 40546a
+        return -1;
Pablo Greco 40546a
 
Pablo Greco 40546a
-    for (i = 0; strings && strings[i]; i++) {
Pablo Greco 40546a
-        if (VIR_STRDUP(ret[i], strings[i]) < 0)
Pablo Greco 40546a
-            goto error;
Pablo Greco 40546a
-    }
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (VIR_STRDUP(ret[i], item) < 0)
Pablo Greco 40546a
-        goto error;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    return ret;
Pablo Greco 40546a
- error:
Pablo Greco 40546a
-    virStringListFree(ret);
Pablo Greco 40546a
-    return NULL;
Pablo Greco 40546a
+    return 0;
Pablo Greco 40546a
 }
Pablo Greco 40546a
 
Pablo Greco 40546a
 
Pablo Greco 40546a
diff --git a/src/util/virstring.h b/src/util/virstring.h
Pablo Greco 40546a
index e68b9eec79..a3db08ce58 100644
Pablo Greco 40546a
--- a/src/util/virstring.h
Pablo Greco 40546a
+++ b/src/util/virstring.h
Pablo Greco 40546a
@@ -41,8 +41,8 @@ char *virStringListJoin(const char **strings,
Pablo Greco 40546a
                         const char *delim)
Pablo Greco 40546a
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
Pablo Greco 40546a
 
Pablo Greco 40546a
-char **virStringListAdd(const char **strings,
Pablo Greco 40546a
-                        const char *item);
Pablo Greco 40546a
+int virStringListAdd(char ***strings,
Pablo Greco 40546a
+                     const char *item);
Pablo Greco 40546a
 void virStringListRemove(char ***strings,
Pablo Greco 40546a
                          const char *item);
Pablo Greco 40546a
 
Pablo Greco 40546a
diff --git a/tests/virstringtest.c b/tests/virstringtest.c
Pablo Greco 40546a
index 1230aba5b7..1a1e6364d1 100644
Pablo Greco 40546a
--- a/tests/virstringtest.c
Pablo Greco 40546a
+++ b/tests/virstringtest.c
Pablo Greco 40546a
@@ -179,12 +179,8 @@ static int testAdd(const void *args)
Pablo Greco 40546a
     size_t i;
Pablo Greco 40546a
 
Pablo Greco 40546a
     for (i = 0; data->tokens[i]; i++) {
Pablo Greco 40546a
-        char **tmp = virStringListAdd((const char **)list, data->tokens[i]);
Pablo Greco 40546a
-        if (!tmp)
Pablo Greco 40546a
+        if (virStringListAdd(&list, data->tokens[i]) < 0)
Pablo Greco 40546a
             goto cleanup;
Pablo Greco 40546a
-        virStringListFree(list);
Pablo Greco 40546a
-        list = tmp;
Pablo Greco 40546a
-        tmp = NULL;
Pablo Greco 40546a
     }
Pablo Greco 40546a
 
Pablo Greco 40546a
     if (!list &&
Pablo Greco 40546a
-- 
Pablo Greco 40546a
2.22.0
Pablo Greco 40546a