/* Functions */
+static void lxcDriverLock(lxc_driver_t *driver)
+{
+ pthread_mutex_lock(&driver->lock);
+}
+static void lxcDriverUnlock(lxc_driver_t *driver)
+{
+ pthread_mutex_unlock(&driver->lock);
+}
+
+
static int lxcProbe(void)
{
if (getuid() != 0 ||
virDomainObjPtr vm;
virDomainPtr dom = NULL;
+ lxcDriverLock(driver);
vm = virDomainFindByID(&driver->domains, id);
+ lxcDriverUnlock(driver);
+
if (!vm) {
lxcError(conn, NULL, VIR_ERR_NO_DOMAIN, NULL);
goto cleanup;
dom->id = vm->def->id;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return dom;
}
virDomainObjPtr vm;
virDomainPtr dom = NULL;
+ lxcDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, uuid);
+ lxcDriverUnlock(driver);
+
if (!vm) {
lxcError(conn, NULL, VIR_ERR_NO_DOMAIN, NULL);
goto cleanup;
dom->id = vm->def->id;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return dom;
}
virDomainObjPtr vm;
virDomainPtr dom = NULL;
+ lxcDriverLock(driver);
vm = virDomainFindByName(&driver->domains, name);
+ lxcDriverUnlock(driver);
if (!vm) {
lxcError(conn, NULL, VIR_ERR_NO_DOMAIN, NULL);
goto cleanup;
dom->id = vm->def->id;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return dom;
}
lxc_driver_t *driver = conn->privateData;
int got = 0, i;
- for (i = 0 ; i < driver->domains.count && got < nids ; i++)
+ lxcDriverLock(driver);
+ for (i = 0 ; i < driver->domains.count && got < nids ; i++) {
+ virDomainObjLock(driver->domains.objs[i]);
if (virDomainIsActive(driver->domains.objs[i]))
ids[got++] = driver->domains.objs[i]->def->id;
+ virDomainObjUnlock(driver->domains.objs[i]);
+ }
+ lxcDriverUnlock(driver);
return got;
}
lxc_driver_t *driver = conn->privateData;
int n = 0, i;
- for (i = 0 ; i < driver->domains.count ; i++)
+ lxcDriverLock(driver);
+ for (i = 0 ; i < driver->domains.count ; i++) {
+ virDomainObjLock(driver->domains.objs[i]);
if (virDomainIsActive(driver->domains.objs[i]))
n++;
+ virDomainObjUnlock(driver->domains.objs[i]);
+ }
+ lxcDriverUnlock(driver);
return n;
}
lxc_driver_t *driver = conn->privateData;
int got = 0, i;
+ lxcDriverLock(driver);
for (i = 0 ; i < driver->domains.count && got < nnames ; i++) {
+ virDomainObjLock(driver->domains.objs[i]);
if (!virDomainIsActive(driver->domains.objs[i])) {
if (!(names[got++] = strdup(driver->domains.objs[i]->def->name))) {
lxcError(conn, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for VM name string"));
+ virDomainObjUnlock(driver->domains.objs[i]);
goto cleanup;
}
}
+ virDomainObjUnlock(driver->domains.objs[i]);
}
+ lxcDriverUnlock(driver);
return got;
cleanup:
for (i = 0 ; i < got ; i++)
VIR_FREE(names[i]);
+ lxcDriverUnlock(driver);
return -1;
}
lxc_driver_t *driver = conn->privateData;
int n = 0, i;
- for (i = 0 ; i < driver->domains.count ; i++)
+ lxcDriverLock(driver);
+ for (i = 0 ; i < driver->domains.count ; i++) {
+ virDomainObjLock(driver->domains.objs[i]);
if (!virDomainIsActive(driver->domains.objs[i]))
n++;
+ virDomainObjUnlock(driver->domains.objs[i]);
+ }
+ lxcDriverUnlock(driver);
return n;
}
{
lxc_driver_t *driver = conn->privateData;
virDomainDefPtr def = NULL;
- virDomainObjPtr vm;
+ virDomainObjPtr vm = NULL;
virDomainPtr dom = NULL;
+ lxcDriverLock(driver);
if (!(def = virDomainDefParseString(conn, driver->caps, xml)))
goto cleanup;
driver->configDir,
vm->newDef ? vm->newDef : vm->def) < 0) {
virDomainRemoveInactive(&driver->domains, vm);
+ vm = NULL;
goto cleanup;
}
cleanup:
virDomainDefFree(def);
+ if (vm)
+ virDomainObjUnlock(vm);
+ lxcDriverUnlock(driver);
return dom;
}
virDomainObjPtr vm;
int ret = -1;
+ lxcDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
if (!vm) {
lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
goto cleanup;
virDomainRemoveInactive(&driver->domains, vm);
+ vm = NULL;
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ lxcDriverUnlock(driver);
return ret;
}
virDomainObjPtr vm;
int ret = -1;
+ lxcDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ lxcDriverUnlock(driver);
+
if (!vm) {
lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virDomainObjPtr vm;
char *ret = NULL;
+ lxcDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ lxcDriverUnlock(driver);
+
if (!vm) {
lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
ret = strdup(vm->def->os.type);
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virDomainObjPtr vm;
char *ret = NULL;
+ lxcDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ lxcDriverUnlock(driver);
+
if (!vm) {
lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
flags);
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virDomainObjPtr vm = NULL;
unsigned int i;
+ lxcDriverLock(driver);
for (i = 0 ; i < driver->domains.count ; i++) {
- if (driver->domains.objs[i]->monitorWatch == watch) {
- vm = driver->domains.objs[i];
+ virDomainObjPtr tmpvm = driver->domains.objs[i];
+ virDomainObjLock(tmpvm);
+ if (tmpvm->monitorWatch == watch) {
+ vm = tmpvm;
break;
}
+ virDomainObjUnlock(tmpvm);
}
if (!vm) {
virEventRemoveHandle(watch);
- return;
+ goto cleanup;
}
if (vm->monitor != fd) {
virEventRemoveHandle(watch);
- return;
+ goto cleanup;
}
if (lxcVmTerminate(NULL, driver, vm, SIGINT) < 0)
virEventRemoveHandle(watch);
+
+cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ lxcDriverUnlock(driver);
}
virDomainObjPtr vm;
int ret = -1;
+ lxcDriverLock(driver);
vm = virDomainFindByName(&driver->domains, dom->name);
if (!vm) {
lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
ret = lxcVmStart(dom->conn, driver, vm);
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ lxcDriverUnlock(driver);
return ret;
}
const char *xml,
unsigned int flags ATTRIBUTE_UNUSED) {
lxc_driver_t *driver = conn->privateData;
- virDomainObjPtr vm;
+ virDomainObjPtr vm = NULL;
virDomainDefPtr def;
virDomainPtr dom = NULL;
+ lxcDriverLock(driver);
if (!(def = virDomainDefParseString(conn, driver->caps, xml)))
goto cleanup;
if (lxcVmStart(conn, driver, vm) < 0) {
virDomainRemoveInactive(&driver->domains, vm);
+ vm = NULL;
goto cleanup;
}
cleanup:
virDomainDefFree(def);
+ if (vm)
+ virDomainObjUnlock(vm);
+ lxcDriverUnlock(driver);
return dom;
}
virDomainObjPtr vm;
int ret = -1;
+ lxcDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
if (!vm) {
lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
}
ret = lxcVmTerminate(dom->conn, driver, vm, 0);
+ if (!vm->persistent) {
+ virDomainRemoveInactive(&driver->domains, vm);
+ vm = NULL;
+ }
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ lxcDriverUnlock(driver);
return ret;
}
virDomainObjPtr vm;
int ret = -1;
+ lxcDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
if (!vm) {
lxcError(dom->conn, dom, VIR_ERR_INVALID_DOMAIN,
}
ret = lxcVmTerminate(dom->conn, driver, vm, SIGKILL);
+ if (!vm->persistent) {
+ virDomainRemoveInactive(&driver->domains, vm);
+ vm = NULL;
+ }
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ lxcDriverUnlock(driver);
return ret;
}
if (VIR_ALLOC(lxc_driver) < 0) {
return -1;
}
+ pthread_mutex_init(&lxc_driver->lock, NULL);
+ lxcDriverLock(lxc_driver);
/* Check that this is a container enabled kernel */
if(lxcContainerAvailable(0) < 0)
- return -1;
+ goto cleanup;
lxc_driver->have_netns = lxcCheckNetNsSupport();
/* Call function to load lxc driver configuration information */
- if (lxcLoadDriverConfig(lxc_driver) < 0) {
- lxcShutdown();
- return -1;
- }
+ if (lxcLoadDriverConfig(lxc_driver) < 0)
+ goto cleanup;
- if ((lxc_driver->caps = lxcCapsInit()) == NULL) {
- lxcShutdown();
- return -1;
- }
+ if ((lxc_driver->caps = lxcCapsInit()) == NULL)
+ goto cleanup;
if (virDomainLoadAllConfigs(NULL,
lxc_driver->caps,
&lxc_driver->domains,
lxc_driver->configDir,
lxc_driver->autostartDir,
- NULL, NULL) < 0) {
- lxcShutdown();
- return -1;
- }
+ NULL, NULL) < 0)
+ goto cleanup;
for (i = 0 ; i < lxc_driver->domains.count ; i++) {
virDomainObjPtr vm = lxc_driver->domains.objs[i];
char *config = NULL;
virDomainDefPtr tmp;
int rc;
- if ((vm->monitor = lxcMonitorClient(NULL, lxc_driver, vm)) < 0)
+
+ virDomainObjLock(vm);
+ if ((vm->monitor = lxcMonitorClient(NULL, lxc_driver, vm)) < 0) {
+ virDomainObjUnlock(vm);
continue;
+ }
/* Read pid from controller */
if ((rc = virFileReadPid(lxc_driver->stateDir, vm->def->name, &vm->pid)) != 0) {
close(vm->monitor);
vm->monitor = -1;
+ virDomainObjUnlock(vm);
continue;
}
if ((config = virDomainConfigFile(NULL,
lxc_driver->stateDir,
- vm->def->name)) == NULL)
+ vm->def->name)) == NULL) {
+ virDomainObjUnlock(vm);
continue;
+ }
/* Try and load the live config */
tmp = virDomainDefParseFile(NULL, lxc_driver->caps, config, 0);
close(vm->monitor);
vm->monitor = -1;
}
+ virDomainObjUnlock(vm);
}
+ lxcDriverUnlock(lxc_driver);
return 0;
-}
-static void lxcFreeDriver(lxc_driver_t *driver)
-{
- virCapabilitiesFree(driver->caps);
- VIR_FREE(driver->configDir);
- VIR_FREE(driver->autostartDir);
- VIR_FREE(driver->stateDir);
- VIR_FREE(driver->logDir);
- VIR_FREE(driver);
+cleanup:
+ lxcDriverUnlock(lxc_driver);
+ lxcShutdown();
+ return -1;
}
static int lxcShutdown(void)
if (lxc_driver == NULL)
return(-1);
+ lxcDriverLock(lxc_driver);
virDomainObjListFree(&lxc_driver->domains);
- lxcFreeDriver(lxc_driver);
+
+ virCapabilitiesFree(lxc_driver->caps);
+ VIR_FREE(lxc_driver->configDir);
+ VIR_FREE(lxc_driver->autostartDir);
+ VIR_FREE(lxc_driver->stateDir);
+ VIR_FREE(lxc_driver->logDir);
+ lxcDriverUnlock(lxc_driver);
+ VIR_FREE(lxc_driver);
lxc_driver = NULL;
return 0;
static int
lxcActive(void) {
unsigned int i;
+ int active = 0;
if (lxc_driver == NULL)
return(0);
- for (i = 0 ; i < lxc_driver->domains.count ; i++)
+ lxcDriverLock(lxc_driver);
+ for (i = 0 ; i < lxc_driver->domains.count ; i++) {
+ virDomainObjLock(lxc_driver->domains.objs[i]);
if (virDomainIsActive(lxc_driver->domains.objs[i]))
- return 1;
+ active = 1;
+ virDomainObjUnlock(lxc_driver->domains.objs[i]);
+ }
+ lxcDriverUnlock(lxc_driver);
- /* Otherwise we're happy to deal with a shutdown */
- return 0;
+ return active;
}
static int lxcVersion(virConnectPtr conn, unsigned long *version)
virSchedParameterPtr params,
int nparams)
{
+ lxc_driver_t *driver = domain->conn->privateData;
int i;
virCgroupPtr group = NULL;
virDomainObjPtr vm = NULL;
int ret = -1;
if (virCgroupHaveSupport() != 0)
- goto cleanup;
+ return -1;
+
+ lxcDriverLock(driver);
+ vm = virDomainFindByUUID(&driver->domains, domain->uuid);
+ lxcDriverUnlock(driver);
- vm = virDomainFindByUUID(&lxc_driver->domains, domain->uuid);
if (vm == NULL) {
lxcError(NULL, domain, VIR_ERR_INTERNAL_ERROR,
_("No such domain %s"), domain->uuid);
cleanup:
virCgroupFree(&group);
-
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virSchedParameterPtr params,
int *nparams)
{
+ lxc_driver_t *driver = domain->conn->privateData;
virCgroupPtr group = NULL;
virDomainObjPtr vm = NULL;
unsigned long val;
int ret = -1;
if (virCgroupHaveSupport() != 0)
- goto cleanup;
+ return -1;
if ((*nparams) != 1) {
lxcError(NULL, domain, VIR_ERR_INVALID_ARG,
"%s", _("Invalid parameter count"));
- goto cleanup;
+ return -1;
}
- vm = virDomainFindByUUID(&lxc_driver->domains, domain->uuid);
+ lxcDriverLock(driver);
+ vm = virDomainFindByUUID(&driver->domains, domain->uuid);
+ lxcDriverUnlock(driver);
+
if (vm == NULL) {
lxcError(NULL, domain, VIR_ERR_INTERNAL_ERROR,
_("No such domain %s"), domain->uuid);
cleanup:
virCgroupFree(&group);
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}