[PATCH 15/40] qemu: Convert 'priv->dbusVMStateIds' to a GSList
Michal Privoznik
mprivozn at redhat.com
Tue Feb 9 14:22:38 UTC 2021
On 2/6/21 9:32 AM, Peter Krempa wrote:
> The conversion removes the use of virStringListAdd/virStringListRemove
> which try to add dynamic properties to a string list which is really
> inefficient.
>
> Storing the dbus VMState ids in a GSList is pretty straightforward and
> the slightly increased complexity of the code will be paid back by
> removing the string list helpers later.
>
> Signed-off-by: Peter Krempa <pkrempa at redhat.com>
> ---
> src/qemu/qemu_command.c | 2 +-
> src/qemu/qemu_dbus.c | 19 ++++++++++++++++---
> src/qemu/qemu_dbus.h | 2 +-
> src/qemu/qemu_domain.c | 4 ++--
> src/qemu/qemu_domain.h | 2 +-
> src/qemu/qemu_migration.c | 10 ++++------
> src/qemu/qemu_monitor.c | 19 +++++++++++++------
> src/qemu/qemu_monitor.h | 2 +-
> src/qemu/qemu_monitor_json.c | 5 ++---
> src/qemu/qemu_monitor_json.h | 2 +-
> src/qemu/qemu_slirp.c | 7 ++-----
> 11 files changed, 44 insertions(+), 30 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 92036d26c0..ac6bec3389 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -9605,7 +9605,7 @@ qemuBuildDBusVMStateCommandLine(virCommandPtr cmd,
> g_autoptr(virJSONValue) props = NULL;
> qemuDomainObjPrivatePtr priv = QEMU_DOMAIN_PRIVATE(vm);
>
> - if (virStringListLength((const char **)priv->dbusVMStateIds) == 0)
> + if (!priv->dbusVMStateIds)
> return 0;
>
> if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DBUS_VMSTATE)) {
> diff --git a/src/qemu/qemu_dbus.c b/src/qemu/qemu_dbus.c
> index ffcf83e5da..31ede2646f 100644
> --- a/src/qemu/qemu_dbus.c
> +++ b/src/qemu/qemu_dbus.c
> @@ -287,15 +287,28 @@ qemuDBusStart(virQEMUDriverPtr driver,
> }
>
>
> -int
> +void
> qemuDBusVMStateAdd(virDomainObjPtr vm, const char *id)
> {
> - return virStringListAdd(&QEMU_DOMAIN_PRIVATE(vm)->dbusVMStateIds, id);
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> +
> + priv->dbusVMStateIds = g_slist_append(priv->dbusVMStateIds, g_strdup(id));
> }
>
>
> void
> qemuDBusVMStateRemove(virDomainObjPtr vm, const char *id)
> {
> - virStringListRemove(&QEMU_DOMAIN_PRIVATE(vm)->dbusVMStateIds, id);
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> + GSList *next;
> +
> + for (next = priv->dbusVMStateIds; next; next = next->next) {
> + const char *elem = next->data;
> +
> + if (STREQ(id, elem)) {
> + priv->dbusVMStateIds = g_slist_remove_link(priv->dbusVMStateIds, next);
> + g_slist_free_full(next, g_free);
> + break;
> + }
> + }
It's rather sad that there is no better way to do this. I mean one would
expect that removing an item from a singly linked list based on value
not address of that value is pretty common.
Michal
More information about the libvir-list
mailing list