/* Main driver state */
struct network_driver {
+ PTHREAD_MUTEX_T(lock);
+
virNetworkObjList networks;
iptablesContext *iptables;
char *logDir;
};
+
+static void networkDriverLock(struct network_driver *driver)
+{
+ pthread_mutex_lock(&driver->lock);
+}
+static void networkDriverUnlock(struct network_driver *driver)
+{
+ pthread_mutex_unlock(&driver->lock);
+}
+
static int networkShutdown(void);
/* networkDebug statements should be changed to use this macro instead. */
unsigned int i;
for (i = 0 ; i < driver->networks.count ; i++) {
+ virNetworkObjLock(driver->networks.objs[i]);
if (driver->networks.objs[i]->autostart &&
!virNetworkIsActive(driver->networks.objs[i]) &&
networkStartNetworkDaemon(NULL, driver, driver->networks.objs[i]) < 0) {
driver->networks.objs[i]->def->name,
err ? err->message : NULL);
}
+ virNetworkObjUnlock(driver->networks.objs[i]);
}
}
if (VIR_ALLOC(driverState) < 0)
goto error;
+ pthread_mutex_init(&driverState->lock, NULL);
+ networkDriverLock(driverState);
+
if (!uid) {
if (asprintf(&driverState->logDir,
"%s/log/libvirt/qemu", LOCAL_STATE_DIR) == -1)
networkAutostartConfigs(driverState);
+ networkDriverUnlock(driverState);
+
return 0;
out_of_memory:
"%s", _("networkStartup: out of memory\n"));
error:
+ if (driverState)
+ networkDriverUnlock(driverState);
+
VIR_FREE(base);
networkShutdown();
return -1;
if (!driverState)
return 0;
+ networkDriverLock(driverState);
virNetworkLoadAllConfigs(NULL,
&driverState->networks,
driverState->networkConfigDir,
}
networkAutostartConfigs(driverState);
-
+ networkDriverUnlock(driverState);
return 0;
}
if (!driverState)
return 0;
+ networkDriverLock(driverState);
for (i = 0 ; i < driverState->networks.count ; i++) {
virNetworkObjPtr net = driverState->networks.objs[i];
+ virNetworkObjLock(net);
if (virNetworkIsActive(net))
active = 1;
+ virNetworkObjUnlock(net);
}
-
+ networkDriverUnlock(driverState);
return active;
}
if (!driverState)
return -1;
+ networkDriverLock(driverState);
+
/* shutdown active networks */
for (i = 0 ; i < driverState->networks.count ; i++) {
virNetworkObjPtr net = driverState->networks.objs[i];
+ virNetworkObjLock(net);
if (virNetworkIsActive(net))
networkShutdownNetworkDaemon(NULL, driverState,
driverState->networks.objs[i]);
+ virNetworkObjUnlock(net);
}
/* free inactive networks */
if (driverState->iptables)
iptablesContextFree(driverState->iptables);
+ networkDriverUnlock(driverState);
+
VIR_FREE(driverState);
return 0;
network->newDef = NULL;
}
- if (!network->configFile)
- virNetworkRemoveInactive(&driver->networks,
- network);
-
return 0;
}
virNetworkObjPtr network;
virNetworkPtr ret = NULL;
+ networkDriverLock(driver);
network = virNetworkFindByUUID(&driver->networks, uuid);
+ networkDriverUnlock(driver);
if (!network) {
networkReportError(conn, NULL, NULL, VIR_ERR_NO_NETWORK,
"%s", _("no network with matching uuid"));
ret = virGetNetwork(conn, network->def->name, network->def->uuid);
cleanup:
+ if (network)
+ virNetworkObjUnlock(network);
return ret;
}
virNetworkObjPtr network;
virNetworkPtr ret = NULL;
+ networkDriverLock(driver);
network = virNetworkFindByName(&driver->networks, name);
+ networkDriverUnlock(driver);
if (!network) {
networkReportError(conn, NULL, NULL, VIR_ERR_NO_NETWORK,
"%s", _("no network with matching name"));
ret = virGetNetwork(conn, network->def->name, network->def->uuid);
cleanup:
+ if (network)
+ virNetworkObjUnlock(network);
return ret;
}
int nactive = 0, i;
struct network_driver *driver = conn->networkPrivateData;
- for (i = 0 ; i < driver->networks.count ; i++)
+ networkDriverLock(driver);
+ for (i = 0 ; i < driver->networks.count ; i++) {
+ virNetworkObjLock(driver->networks.objs[i]);
if (virNetworkIsActive(driver->networks.objs[i]))
nactive++;
+ virNetworkObjUnlock(driver->networks.objs[i]);
+ }
+ networkDriverUnlock(driver);
return nactive;
}
struct network_driver *driver = conn->networkPrivateData;
int got = 0, i;
+ networkDriverLock(driver);
for (i = 0 ; i < driver->networks.count && got < nnames ; i++) {
+ virNetworkObjLock(driver->networks.objs[i]);
if (virNetworkIsActive(driver->networks.objs[i])) {
if (!(names[got] = strdup(driver->networks.objs[i]->def->name))) {
+ virNetworkObjUnlock(driver->networks.objs[i]);
networkReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for VM name string"));
goto cleanup;
}
got++;
}
+ virNetworkObjUnlock(driver->networks.objs[i]);
}
+ networkDriverUnlock(driver);
+
return got;
cleanup:
+ networkDriverUnlock(driver);
for (i = 0 ; i < got ; i++)
VIR_FREE(names[i]);
return -1;
int ninactive = 0, i;
struct network_driver *driver = conn->networkPrivateData;
- for (i = 0 ; i < driver->networks.count ; i++)
+ networkDriverLock(driver);
+ for (i = 0 ; i < driver->networks.count ; i++) {
+ virNetworkObjLock(driver->networks.objs[i]);
if (!virNetworkIsActive(driver->networks.objs[i]))
ninactive++;
+ virNetworkObjUnlock(driver->networks.objs[i]);
+ }
+ networkDriverUnlock(driver);
return ninactive;
}
struct network_driver *driver = conn->networkPrivateData;
int got = 0, i;
+ networkDriverLock(driver);
for (i = 0 ; i < driver->networks.count && got < nnames ; i++) {
+ virNetworkObjLock(driver->networks.objs[i]);
if (!virNetworkIsActive(driver->networks.objs[i])) {
if (!(names[got] = strdup(driver->networks.objs[i]->def->name))) {
+ virNetworkObjUnlock(driver->networks.objs[i]);
networkReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for VM name string"));
goto cleanup;
}
got++;
}
+ virNetworkObjUnlock(driver->networks.objs[i]);
}
+ networkDriverUnlock(driver);
return got;
cleanup:
+ networkDriverUnlock(driver);
for (i = 0 ; i < got ; i++)
VIR_FREE(names[i]);
return -1;
static virNetworkPtr networkCreate(virConnectPtr conn, const char *xml) {
struct network_driver *driver = conn->networkPrivateData;
virNetworkDefPtr def;
- virNetworkObjPtr network;
+ virNetworkObjPtr network = NULL;
virNetworkPtr ret = NULL;
+ networkDriverLock(driver);
+
if (!(def = virNetworkDefParseString(conn, xml)))
goto cleanup;
if (networkStartNetworkDaemon(conn, driver, network) < 0) {
virNetworkRemoveInactive(&driver->networks,
network);
+ network = NULL;
goto cleanup;
}
cleanup:
virNetworkDefFree(def);
+ if (network)
+ virNetworkObjUnlock(network);
+ networkDriverUnlock(driver);
return ret;
}
static virNetworkPtr networkDefine(virConnectPtr conn, const char *xml) {
struct network_driver *driver = conn->networkPrivateData;
virNetworkDefPtr def;
- virNetworkObjPtr network;
+ virNetworkObjPtr network = NULL;
virNetworkPtr ret = NULL;
+ networkDriverLock(driver);
+
if (!(def = virNetworkDefParseString(conn, xml)))
goto cleanup;
network) < 0) {
virNetworkRemoveInactive(&driver->networks,
network);
+ network = NULL;
goto cleanup;
}
cleanup:
virNetworkDefFree(def);
+ if (network)
+ virNetworkObjUnlock(network);
+ networkDriverUnlock(driver);
return ret;
}
static int networkUndefine(virNetworkPtr net) {
struct network_driver *driver = net->conn->networkPrivateData;
- virNetworkObjPtr network;
+ virNetworkObjPtr network = NULL;
int ret = -1;
+ networkDriverLock(driver);
+
network = virNetworkFindByUUID(&driver->networks, net->uuid);
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_DOMAIN,
virNetworkRemoveInactive(&driver->networks,
network);
+ network = NULL;
ret = 0;
cleanup:
+ if (network)
+ virNetworkObjUnlock(network);
+ networkDriverUnlock(driver);
return ret;
}
virNetworkObjPtr network;
int ret = -1;
+ networkDriverLock(driver);
network = virNetworkFindByUUID(&driver->networks, net->uuid);
+ networkDriverUnlock(driver);
+
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
"%s", _("no network with matching uuid"));
ret = networkStartNetworkDaemon(net->conn, driver, network);
cleanup:
+ if (network)
+ virNetworkObjUnlock(network);
return ret;
}
virNetworkObjPtr network;
int ret = -1;
+ networkDriverLock(driver);
network = virNetworkFindByUUID(&driver->networks, net->uuid);
+ networkDriverUnlock(driver);
+
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
"%s", _("no network with matching uuid"));
}
ret = networkShutdownNetworkDaemon(net->conn, driver, network);
+ if (!network->configFile) {
+ virNetworkRemoveInactive(&driver->networks,
+ network);
+ network = NULL;
+ }
cleanup:
+ if (network)
+ virNetworkObjUnlock(network);
return ret;
}
virNetworkObjPtr network;
char *ret = NULL;
+ networkDriverLock(driver);
network = virNetworkFindByUUID(&driver->networks, net->uuid);
+ networkDriverUnlock(driver);
+
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
"%s", _("no network with matching uuid"));
ret = virNetworkDefFormat(net->conn, network->def);
cleanup:
+ if (network)
+ virNetworkObjUnlock(network);
return ret;
}
virNetworkObjPtr network;
char *bridge = NULL;
+ networkDriverLock(driver);
network = virNetworkFindByUUID(&driver->networks, net->uuid);
+ networkDriverUnlock(driver);
+
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
"%s", _("no network with matching id"));
"%s", _("failed to allocate space for network bridge string"));
cleanup:
+ if (network)
+ virNetworkObjUnlock(network);
return bridge;
}
virNetworkObjPtr network;
int ret = -1;
+ networkDriverLock(driver);
network = virNetworkFindByUUID(&driver->networks, net->uuid);
+ networkDriverUnlock(driver);
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
"%s", _("no network with matching uuid"));
ret = 0;
cleanup:
+ if (network)
+ virNetworkObjUnlock(network);
return ret;
}
virNetworkObjPtr network;
int ret = -1;
+ networkDriverLock(driver);
network = virNetworkFindByUUID(&driver->networks, net->uuid);
+ networkDriverUnlock(driver);
+
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
"%s", _("no network with matching uuid"));
ret = 0;
cleanup:
+ if (network)
+ virNetworkObjUnlock(network);
return ret;
}