struct bhyveAutostartData data = { driver, conn };
- virDomainObjListForEach(driver->domains, bhyveAutostartDomain, &data);
+ virDomainObjListForEach(driver->domains, false, bhyveAutostartDomain, &data);
virObjectUnref(conn);
}
data.driver = driver;
data.kd = kd;
- virDomainObjListForEach(driver->domains, virBhyveProcessReconnect, &data);
+ virDomainObjListForEach(driver->domains, false, virBhyveProcessReconnect, &data);
kvm_close(kd);
}
/**
* virDomainObjListForEach:
* @doms: Pointer to the domain object list
+ * @modify: Whether to lock @doms for modify operation
* @callback: callback to run over each domain on the list
* @opaque: opaque data to pass to @callback
*
* For every domain on the list (@doms) run @callback on it. If
* @callback fails (i.e. returns a negative value), the iteration
- * carries still on until all domains are visited.
+ * carries still on until all domains are visited. Moreover, if
+ * @callback wants to modify the list of domains (@doms) then
+ * @modify must be set to true.
*
* Returns: 0 on success,
* -1 otherwise.
*/
int
virDomainObjListForEach(virDomainObjListPtr doms,
+ bool modify,
virDomainObjListIterator callback,
void *opaque)
{
struct virDomainListIterData data = {
callback, opaque, 0,
};
- virObjectRWLockRead(doms);
+
+ if (modify)
+ virObjectRWLockWrite(doms);
+ else
+ virObjectRWLockRead(doms);
virHashForEach(doms->objs, virDomainObjListHelper, &data);
virObjectRWUnlock(doms);
return data.ret;
void *opaque);
int virDomainObjListForEach(virDomainObjListPtr doms,
+ bool modify,
virDomainObjListIterator callback,
void *opaque);
static void
libxlReconnectDomains(libxlDriverPrivatePtr driver)
{
- virDomainObjListForEach(driver->domains, libxlReconnectDomain, driver);
+ virDomainObjListForEach(driver->domains, true, libxlReconnectDomain, driver);
}
static int
NULL, NULL) < 0)
goto error;
- virDomainObjListForEach(libxl_driver->domains, libxlAutostartDomain,
+ virDomainObjListForEach(libxl_driver->domains, false,
+ libxlAutostartDomain,
libxl_driver);
- virDomainObjListForEach(libxl_driver->domains, libxlDomainManagedSaveLoad,
+ virDomainObjListForEach(libxl_driver->domains, false,
+ libxlDomainManagedSaveLoad,
libxl_driver);
return VIR_DRV_STATE_INIT_COMPLETE;
libxl_driver->xmlopt,
NULL, libxl_driver);
- virDomainObjListForEach(libxl_driver->domains, libxlAutostartDomain,
+ virDomainObjListForEach(libxl_driver->domains, false,
+ libxlAutostartDomain,
libxl_driver);
virObjectUnref(cfg);
struct virLXCProcessAutostartData data = { driver, conn };
- virDomainObjListForEach(driver->domains,
+ virDomainObjListForEach(driver->domains, false,
virLXCProcessAutostartDomain,
&data);
int virLXCProcessReconnectAll(virLXCDriverPtr driver,
virDomainObjListPtr doms)
{
- virDomainObjListForEach(doms, virLXCProcessReconnectDomain, driver);
+ virDomainObjListForEach(doms, false, virLXCProcessReconnectDomain, driver);
return 0;
}
static void
qemuAutostartDomains(virQEMUDriverPtr driver)
{
- virDomainObjListForEach(driver->domains, qemuAutostartDomain, driver);
+ virDomainObjListForEach(driver->domains, false, qemuAutostartDomain, driver);
}
* the driver with. This is to avoid race between autostart and reconnect
* threads */
virDomainObjListForEach(qemu_driver->domains,
+ false,
qemuDomainFindMaxID,
&qemu_driver->lastvmid);
virDomainObjListForEach(qemu_driver->domains,
+ false,
qemuDomainNetsRestart,
NULL);
goto error;
virDomainObjListForEach(qemu_driver->domains,
+ false,
qemuDomainSnapshotLoad,
cfg->snapshotDir);
virDomainObjListForEach(qemu_driver->domains,
+ false,
qemuDomainCheckpointLoad,
cfg->checkpointDir);
virDomainObjListForEach(qemu_driver->domains,
+ false,
qemuDomainManagedSaveLoad,
qemu_driver);
qemuProcessReconnectAll(virQEMUDriverPtr driver)
{
struct qemuProcessReconnectData data = {.driver = driver};
- virDomainObjListForEach(driver->domains, qemuProcessReconnectHelper, &data);
+ virDomainObjListForEach(driver->domains, true,
+ qemuProcessReconnectHelper, &data);
}
static void
vmwareDomainObjListUpdateAll(virDomainObjListPtr doms, struct vmware_driver *driver)
{
- virDomainObjListForEach(doms, vmwareDomainObjListUpdateDomain, driver);
+ virDomainObjListForEach(doms, false, vmwareDomainObjListUpdateDomain, driver);
}
static int