From: "Daniel P. Berrange" <berrange(a)redhat.com>
Use atomic ops to increment nextvmid and encapsulate it in a
methd 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 958ed56..cc02200 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
@@ -784,3 +785,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 a96ff76..1cc277f 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 8f76dde..9c9038b 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3569,7 +3569,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);
@@ -4421,7 +4421,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);
--
1.8.0.2