virNetworkObjPtr network;
char uuidstr[VIR_UUID_STRING_BUFLEN];
- if ((network = virNetworkObjFindByName(nets, def->name))) {
+ virObjectLock(nets);
+ if ((network = virNetworkObjFindByNameLocked(nets, def->name))) {
+ virObjectUnlock(nets);
virNetworkObjAssignDef(network, def, live);
return network;
}
- if (!(network = virNetworkObjNew()))
+ if (!(network = virNetworkObjNew())) {
+ virObjectUnlock(nets);
return NULL;
+ }
virObjectLock(network);
virUUIDFormat(def->uuid, uuidstr);
network->def = def;
network->persistent = !live;
+ virObjectUnlock(nets);
return network;
error:
+ virObjectUnlock(nets);
virObjectUnlock(network);
virObjectUnref(network);
return NULL;
char uuidstr[VIR_UUID_STRING_BUFLEN];
virUUIDFormat(net->def->uuid, uuidstr);
+ virObjectRef(net);
virObjectUnlock(net);
+ virObjectLock(nets);
+ virObjectLock(net);
virHashRemoveEntry(nets->objs, uuidstr);
+ virObjectUnlock(net);
+ virObjectUnlock(nets);
+ virObjectUnref(net);
}
/* return ips[index], or NULL if there aren't enough ips */
virNetworkObjPtr obj;
struct virNetworkBridgeInUseHelperData data = {bridge, skipname};
+ virObjectLock(nets);
obj = virHashSearch(nets->objs, virNetworkBridgeInUseHelper, &data);
+ virObjectUnlock(nets);
return obj != NULL;
}
int ret = -1;
struct virNetworkObjListData data = { conn, NULL, filter, flags, 0, false};
+ virObjectLock(netobjs);
if (nets && VIR_ALLOC_N(data.nets, virHashSize(netobjs->objs) + 1) < 0)
goto cleanup;
ret = data.nnets;
cleanup:
+ virObjectUnlock(netobjs);
while (data.nets && data.nnets)
virObjectUnref(data.nets[--data.nnets]);
* @opaque: pointer to pass to the @callback
*
* Function iterates over the list of network objects and calls
- * passed callback over each one of them.
+ * passed callback over each one of them. You should avoid
+ * calling those virNetworkObjList APIs, which lock the list
+ * again in favor of their virNetworkObj*Locked variants.
*
* Returns: 0 on success, -1 otherwise.
*/
void *opaque)
{
struct virNetworkObjListForEachHelperData data = {callback, opaque, 0};
+ virObjectLock(nets);
virHashForEach(nets->objs, virNetworkObjListForEachHelper, &data);
+ virObjectUnlock(nets);
return data.ret;
}
struct virNetworkObjListGetHelperData data = {
conn, filter, names, nnames, active, 0, false};
+ virObjectLock(nets);
virHashForEach(nets->objs, virNetworkObjListGetHelper, &data);
+ virObjectUnlock(nets);
if (data.error)
goto cleanup;
struct virNetworkObjListGetHelperData data = {
conn, filter, NULL, -1, active, 0, false};
+ virObjectLock(nets);
virHashForEach(nets->objs, virNetworkObjListGetHelper, &data);
+ virObjectUnlock(nets);
return data.got;
}
{
struct virNetworkObjListPruneHelperData data = {flags};
+ virObjectLock(nets);
virHashRemoveSet(nets->objs, virNetworkObjListPruneHelper, &data);
+ virObjectUnlock(nets);
}