int id)
{
virDomainObjPtr obj;
+ virObjectLock(doms);
obj = virHashSearch(doms->objs, virDomainObjListSearchID, &id);
if (obj)
virObjectLock(obj);
+ virObjectUnlock(doms);
return obj;
}
char uuidstr[VIR_UUID_STRING_BUFLEN];
virDomainObjPtr obj;
+ virObjectLock(doms);
virUUIDFormat(uuid, uuidstr);
obj = virHashLookup(doms->objs, uuidstr);
if (obj)
virObjectLock(obj);
+ virObjectUnlock(doms);
return obj;
}
const char *name)
{
virDomainObjPtr obj;
+ virObjectLock(doms);
obj = virHashSearch(doms->objs, virDomainObjListSearchName, name);
if (obj)
virObjectLock(obj);
+ virObjectUnlock(doms);
return obj;
}
* live config, not a future inactive config
*
*/
-virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms,
- virCapsPtr caps,
- const virDomainDefPtr def,
- unsigned int flags,
- virDomainDefPtr *oldDef)
+static virDomainObjPtr
+virDomainObjListAddLocked(virDomainObjListPtr doms,
+ virCapsPtr caps,
+ const virDomainDefPtr def,
+ unsigned int flags,
+ virDomainDefPtr *oldDef)
{
virDomainObjPtr vm;
char uuidstr[VIR_UUID_STRING_BUFLEN];
+
if (oldDef)
*oldDef = false;
+ virUUIDFormat(def->uuid, uuidstr);
+
/* See if a VM with matching UUID already exists */
- if ((vm = virDomainObjListFindByUUID(doms, def->uuid))) {
+ if ((vm = virHashLookup(doms->objs, uuidstr))) {
+ virObjectLock(vm);
/* UUID matches, but if names don't match, refuse it */
if (STRNEQ(vm->def->name, def->name)) {
virUUIDFormat(vm->def->uuid, uuidstr);
oldDef);
} else {
/* UUID does not match, but if a name matches, refuse it */
- if ((vm = virDomainObjListFindByName(doms, def->name))) {
+ if ((vm = virHashSearch(doms->objs, virDomainObjListSearchName, def->name))) {
+ virObjectLock(vm);
virUUIDFormat(vm->def->uuid, uuidstr);
virReportError(VIR_ERR_OPERATION_FAILED,
_("domain '%s' already exists with uuid %s"),
goto cleanup;
}
+
+virDomainObjPtr virDomainObjListAdd(virDomainObjListPtr doms,
+ virCapsPtr caps,
+ const virDomainDefPtr def,
+ unsigned int flags,
+ virDomainDefPtr *oldDef)
+{
+ virDomainObjPtr ret;
+
+ virObjectLock(doms);
+ ret = virDomainObjListAddLocked(doms, caps, def, flags, oldDef);
+ virObjectUnlock(doms);
+ return ret;
+}
+
/*
* Mark the running VM config as transient. Ensures transient hotplug
* operations do not persist past shutdown.
virDomainObjPtr dom)
{
char uuidstr[VIR_UUID_STRING_BUFLEN];
+
+ virObjectLock(doms);
virUUIDFormat(dom->def->uuid, uuidstr);
virObjectUnlock(dom);
virHashRemoveEntry(doms->objs, uuidstr);
+ virObjectUnlock(doms);
}
if ((autostart = virFileLinkPointsTo(autostartLink, configFile)) < 0)
goto error;
- if (!(dom = virDomainObjListAdd(doms, caps, def, 0, &oldDef)))
+ if (!(dom = virDomainObjListAddLocked(doms, caps, def, 0, &oldDef)))
goto error;
dom->autostart = autostart;
return -1;
}
+ virObjectLock(doms);
+
while ((entry = readdir(dir))) {
virDomainObjPtr dom;
}
closedir(dir);
-
+ virObjectUnlock(doms);
return 0;
}
int virDomainObjListNumOfDomains(virDomainObjListPtr doms, int active)
{
int count = 0;
+ virObjectLock(doms);
if (active)
virHashForEach(doms->objs, virDomainObjListCountActive, &count);
else
virHashForEach(doms->objs, virDomainObjListCountInactive, &count);
+ virObjectUnlock(doms);
return count;
}
int maxids)
{
struct virDomainIDData data = { 0, maxids, ids };
+ virObjectLock(doms);
virHashForEach(doms->objs, virDomainObjListCopyActiveIDs, &data);
+ virObjectUnlock(doms);
return data.numids;
}
{
struct virDomainNameData data = { 0, 0, maxnames, names };
int i;
+ virObjectLock(doms);
virHashForEach(doms->objs, virDomainObjListCopyInactiveNames, &data);
+ virObjectUnlock(doms);
if (data.oom) {
virReportOOMError();
goto cleanup;
struct virDomainListIterData data = {
callback, opaque, 0,
};
+ virObjectLock(doms);
virHashForEach(doms->objs, virDomainObjListHelper, &data);
-
+ virObjectUnlock(doms);
return data.ret;
}
struct virDomainListData data = { conn, NULL, flags, 0, false };
+ virObjectLock(doms);
if (domains) {
if (VIR_ALLOC_N(data.domains, virHashSize(doms->objs) + 1) < 0) {
virReportOOMError();
}
VIR_FREE(data.domains);
+ virObjectUnlock(doms);
return ret;
}