forked from rpms/libvirt
146 lines
4.5 KiB
Diff
146 lines
4.5 KiB
Diff
From e7d53ee08ec9929974fb4159be8359c4ba88f5b2 Mon Sep 17 00:00:00 2001
|
|
Message-Id: <e7d53ee08ec9929974fb4159be8359c4ba88f5b2@dist-git>
|
|
From: Michal Privoznik <mprivozn@redhat.com>
|
|
Date: Fri, 21 Jun 2019 09:26:05 +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=1697627
|
|
|
|
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
Message-Id: <a9764c87b3f557a2fd9ac8c5fcd077a3d713e2ca.1561068591.git.jdenemar@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);
|
|
+ size_t i = virStringListLength((const char **) *strings);
|
|
|
|
- if (VIR_ALLOC_N(ret, i + 2) < 0)
|
|
- goto error;
|
|
+ if (VIR_EXPAND_N(*strings, i, 2) < 0 ||
|
|
+ VIR_STRDUP((*strings)[i - 2], item) < 0)
|
|
+ return -1;
|
|
|
|
- for (i = 0; strings && strings[i]; i++) {
|
|
- if (VIR_STRDUP(ret[i], strings[i]) < 0)
|
|
- goto error;
|
|
- }
|
|
-
|
|
- if (VIR_STRDUP(ret[i], item) < 0)
|
|
- goto error;
|
|
-
|
|
- 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.22.0
|
|
|