static int openvzDomainGetMaxVcpus(virDomainPtr dom);
static int openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus);
+static void openvzDriverLock(struct openvz_driver *driver)
+{
+ pthread_mutex_lock(&driver->lock);
+}
+
+static void openvzDriverUnlock(struct openvz_driver *driver)
+{
+ pthread_mutex_unlock(&driver->lock);
+}
+
struct openvz_driver ovz_driver;
static void cmdExecFree(const char *cmdExec[])
virDomainObjPtr vm;
virDomainPtr dom = NULL;
+ openvzDriverLock(driver);
vm = virDomainFindByID(&driver->domains, id);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(conn, VIR_ERR_NO_DOMAIN, NULL);
goto cleanup;
dom->id = vm->def->id;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return dom;
}
static int openvzGetVersion(virConnectPtr conn, unsigned long *version) {
struct openvz_driver *driver = conn->privateData;
+ openvzDriverLock(driver);
*version = driver->version;
+ openvzDriverUnlock(driver);
return 0;
}
virDomainObjPtr vm;
char *ret = NULL;
+ openvzDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(dom->conn, VIR_ERR_NO_DOMAIN, NULL);
goto cleanup;
openvzError(dom->conn, VIR_ERR_NO_MEMORY, NULL);
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virDomainObjPtr vm;
virDomainPtr dom = NULL;
+ openvzDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, uuid);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(conn, VIR_ERR_NO_DOMAIN, NULL);
goto cleanup;
dom->id = vm->def->id;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return dom;
}
virDomainObjPtr vm;
virDomainPtr dom = NULL;
+ openvzDriverLock(driver);
vm = virDomainFindByName(&driver->domains, name);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(conn, VIR_ERR_NO_DOMAIN, NULL);
goto cleanup;
dom->id = vm->def->id;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return dom;
}
virDomainObjPtr vm;
int ret = -1;
+ openvzDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virDomainObjPtr vm;
char *ret = NULL;
+ openvzDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
ret = virDomainDefFormat(dom->conn, vm->def, flags);
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
const char *prog[] = {VZCTL, "--quiet", "stop", PROGRAM_SENTINAL, NULL};
int ret = -1;
+ openvzDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
const char *prog[] = {VZCTL, "--quiet", "restart", PROGRAM_SENTINAL, NULL};
int ret = -1;
+ openvzDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
const char *prog[OPENVZ_MAX_ARG];
prog[0] = NULL;
+ openvzDriverLock(driver);
if ((vmdef = virDomainDefParseString(conn, driver->caps, xml)) == NULL)
goto cleanup;
cleanup:
virDomainDefFree(vmdef);
cmdExecFree(prog);
+ if (vm)
+ virDomainObjUnlock(vm);
+ openvzDriverUnlock(driver);
return dom;
}
static virDomainPtr
openvzDomainCreateXML(virConnectPtr conn, const char *xml,
- unsigned int flags ATTRIBUTE_UNUSED)
+ unsigned int flags ATTRIBUTE_UNUSED)
{
struct openvz_driver *driver = conn->privateData;
virDomainDefPtr vmdef = NULL;
const char *progcreate[OPENVZ_MAX_ARG];
progcreate[0] = NULL;
+ openvzDriverLock(driver);
if ((vmdef = virDomainDefParseString(conn, driver->caps, xml)) == NULL)
goto cleanup;
cleanup:
virDomainDefFree(vmdef);
cmdExecFree(progcreate);
+ if (vm)
+ virDomainObjUnlock(vm);
+ openvzDriverUnlock(driver);
return dom;
}
const char *prog[] = {VZCTL, "--quiet", "start", PROGRAM_SENTINAL, NULL };
int ret = -1;
+ openvzDriverLock(driver);
vm = virDomainFindByName(&driver->domains, dom->name);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching id"));
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
const char *prog[] = { VZCTL, "--quiet", "destroy", PROGRAM_SENTINAL, NULL };
int ret = -1;
+ openvzDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN, "%s", _("no domain with matching uuid"));
}
virDomainRemoveInactive(&driver->domains, vm);
+ vm = NULL;
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ openvzDriverUnlock(driver);
return ret;
}
"--save", NULL };
int ret = -1;
+ openvzDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN, "%s", _("no domain with matching uuid"));
goto cleanup;
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
char value[1024];
int ret = -1;
+ openvzDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
unsigned int pcpus;
int ret = -1;
+ openvzDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ openvzDriverUnlock(driver);
+
if (!vm) {
openvzError(dom->conn, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
struct openvz_driver *driver = conn->privateData;
char *ret;
+ openvzDriverLock(driver);
ret = virCapabilitiesFormatXML(driver->caps);
+ openvzDriverUnlock(driver);
return ret;
}
struct openvz_driver *driver = conn->privateData;
int nactive = 0, i;
- for (i = 0 ; i < driver->domains.count ; i++)
+ openvzDriverLock(driver);
+ for (i = 0 ; i < driver->domains.count ; i++) {
+ virDomainObjLock(driver->domains.objs[i]);
if (virDomainIsActive(driver->domains.objs[i]))
nactive++;
+ virDomainObjUnlock(driver->domains.objs[i]);
+ }
+ openvzDriverUnlock(driver);
return nactive;
}
struct openvz_driver *driver = conn->privateData;
int ninactive = 0, i;
- for (i = 0 ; i < driver->domains.count ; i++)
+ openvzDriverLock(driver);
+ for (i = 0 ; i < driver->domains.count ; i++) {
+ virDomainObjLock(driver->domains.objs[i]);
if (!virDomainIsActive(driver->domains.objs[i]))
ninactive++;
+ virDomainObjUnlock(driver->domains.objs[i]);
+ }
+ openvzDriverUnlock(driver);
return ninactive;
}