From 6ffcab65c99dbd688bceb5b8adf8eac94e2e7bd4 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Mon, 14 Jan 2013 16:50:08 +0000 Subject: [PATCH] Use atomic ops to increment nextvmid Use atomic ops to increment nextvmid and encapsulate it in a method to prevent accidental non-atomic access --- src/qemu/qemu_conf.c | 6 ++++++ src/qemu/qemu_conf.h | 2 ++ src/qemu/qemu_process.c | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index badbdde678..17f7d45bfd 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -52,6 +52,7 @@ #include "domain_nwfilter.h" #include "virfile.h" #include "virstring.h" +#include "viratomic.h" #include "configmake.h" #define VIR_FROM_THIS VIR_FROM_QEMU @@ -782,3 +783,8 @@ qemuRemoveSharedDisk(virHashTablePtr sharedDisks, VIR_FREE(key); return 0; } + +int qemuDriverAllocateID(virQEMUDriverPtr driver) +{ + return virAtomicIntInc(&driver->nextvmid); +} diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index a96ff76f48..1cc277f698 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -260,4 +260,6 @@ int qemuRemoveSharedDisk(virHashTablePtr sharedDisks, char * qemuGetSharedDiskKey(const char *disk_path) ATTRIBUTE_NONNULL(1); +int qemuDriverAllocateID(virQEMUDriverPtr driver); + #endif /* __QEMUD_CONF_H */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 9c777ce140..30f923ab92 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3586,7 +3586,7 @@ int qemuProcessStart(virConnectPtr conn, if (virDomainObjSetDefTransient(driver->caps, vm, true) < 0) goto cleanup; - vm->def->id = driver->nextvmid++; + vm->def->id = qemuDriverAllocateID(driver); qemuDomainSetFakeReboot(driver, vm, false); virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, VIR_DOMAIN_SHUTOFF_UNKNOWN); @@ -4438,7 +4438,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED, if (virDomainObjSetDefTransient(driver->caps, vm, true) < 0) goto cleanup; - vm->def->id = driver->nextvmid++; + vm->def->id = qemuDriverAllocateID(driver); if (!driver->nactive && driver->inhibitCallback) driver->inhibitCallback(true, driver->inhibitOpaque); -- GitLab