mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
virHookCall: Don't use 'virStringListAdd' to construct list in loop
'virStringListAdd' calculates the string list length on every invocation so constructing a string list using it results in O(n^2) complexity. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
9afed29b45
commit
97fd333fde
@ -34,6 +34,7 @@
|
|||||||
#include "configmake.h"
|
#include "configmake.h"
|
||||||
#include "vircommand.h"
|
#include "vircommand.h"
|
||||||
#include "virstring.h"
|
#include "virstring.h"
|
||||||
|
#include "virglibutil.h"
|
||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_HOOK
|
#define VIR_FROM_THIS VIR_FROM_HOOK
|
||||||
|
|
||||||
@ -343,11 +344,11 @@ virHookCall(int driver,
|
|||||||
struct dirent *entry;
|
struct dirent *entry;
|
||||||
g_autofree char *path = NULL;
|
g_autofree char *path = NULL;
|
||||||
g_autofree char *dir_path = NULL;
|
g_autofree char *dir_path = NULL;
|
||||||
g_auto(GStrv) entries = NULL;
|
g_autoptr(virGSListString) entries = NULL;
|
||||||
const char *drvstr;
|
const char *drvstr;
|
||||||
const char *opstr;
|
const char *opstr;
|
||||||
const char *subopstr;
|
const char *subopstr;
|
||||||
size_t i, nentries;
|
GSList *next;
|
||||||
|
|
||||||
if (output)
|
if (output)
|
||||||
*output = NULL;
|
*output = NULL;
|
||||||
@ -433,7 +434,7 @@ virHookCall(int driver,
|
|||||||
if (!virFileIsExecutable(entry_path))
|
if (!virFileIsExecutable(entry_path))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
virStringListAdd(&entries, entry_path);
|
entries = g_slist_prepend(entries, g_steal_pointer(&entry_path));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
@ -442,18 +443,18 @@ virHookCall(int driver,
|
|||||||
if (!entries)
|
if (!entries)
|
||||||
return script_ret;
|
return script_ret;
|
||||||
|
|
||||||
nentries = virStringListLength((const char **)entries);
|
entries = g_slist_sort(entries, (GCompareFunc) strcmp);
|
||||||
qsort(entries, nentries, sizeof(*entries), virStringSortCompare);
|
|
||||||
|
|
||||||
for (i = 0; i < nentries; i++) {
|
for (next = entries; next; next = next->next) {
|
||||||
int entry_ret;
|
int entry_ret;
|
||||||
const char *entry_input;
|
const char *entry_input;
|
||||||
g_autofree char *entry_output = NULL;
|
g_autofree char *entry_output = NULL;
|
||||||
|
const char *filename = next->data;
|
||||||
|
|
||||||
/* Get input from previous output */
|
/* Get input from previous output */
|
||||||
entry_input = (!script_ret && output &&
|
entry_input = (!script_ret && output &&
|
||||||
!virStringIsEmpty(*output)) ? *output : input;
|
!virStringIsEmpty(*output)) ? *output : input;
|
||||||
entry_ret = virRunScript(entries[i], id, opstr,
|
entry_ret = virRunScript(filename, id, opstr,
|
||||||
subopstr, extra, entry_input,
|
subopstr, extra, entry_input,
|
||||||
(output) ? &entry_output : NULL);
|
(output) ? &entry_output : NULL);
|
||||||
if (entry_ret < script_ret)
|
if (entry_ret < script_ret)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user