mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-27 02:51:16 +00:00
Impl of threading locking APIs
This commit is contained in:
parent
d48717054c
commit
746f4373e7
10
ChangeLog
10
ChangeLog
@ -1,3 +1,13 @@
|
||||
Thu Dec 4 21:49:41 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
Per object locking implementation
|
||||
* src/domain_conf.c, src/domain_conf.h, src/network_conf.c,
|
||||
src/network_conf.h, src/node_device_conf.c,
|
||||
src/node_device_conf.h, src/storage_conf.c
|
||||
src/storage_conf.h: Add implementation of locking APIs,
|
||||
and make object lookup / creation methods return locked
|
||||
objects
|
||||
|
||||
Thu Dec 4 21:48:41 GMT 2008 Daniel P. Berrange <berrange@redhat.com>
|
||||
|
||||
* src/libvirt_sym.version.in, src/node_device.c,
|
||||
|
@ -151,10 +151,13 @@ virDomainObjPtr virDomainFindByID(const virDomainObjListPtr doms,
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0 ; i < doms->count ; i++)
|
||||
for (i = 0 ; i < doms->count ; i++) {
|
||||
virDomainObjLock(doms->objs[i]);
|
||||
if (virDomainIsActive(doms->objs[i]) &&
|
||||
doms->objs[i]->def->id == id)
|
||||
return doms->objs[i];
|
||||
virDomainObjUnlock(doms->objs[i]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -165,9 +168,12 @@ virDomainObjPtr virDomainFindByUUID(const virDomainObjListPtr doms,
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0 ; i < doms->count ; i++)
|
||||
for (i = 0 ; i < doms->count ; i++) {
|
||||
virDomainObjLock(doms->objs[i]);
|
||||
if (!memcmp(doms->objs[i]->def->uuid, uuid, VIR_UUID_BUFLEN))
|
||||
return doms->objs[i];
|
||||
virDomainObjUnlock(doms->objs[i]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -177,9 +183,12 @@ virDomainObjPtr virDomainFindByName(const virDomainObjListPtr doms,
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0 ; i < doms->count ; i++)
|
||||
for (i = 0 ; i < doms->count ; i++) {
|
||||
virDomainObjLock(doms->objs[i]);
|
||||
if (STREQ(doms->objs[i]->def->name, name))
|
||||
return doms->objs[i];
|
||||
virDomainObjUnlock(doms->objs[i]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -455,6 +464,8 @@ virDomainObjPtr virDomainAssignDef(virConnectPtr conn,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pthread_mutex_init(&domain->lock, NULL);
|
||||
virDomainObjLock(domain);
|
||||
domain->state = VIR_DOMAIN_SHUTOFF;
|
||||
domain->def = def;
|
||||
|
||||
@ -475,8 +486,12 @@ void virDomainRemoveInactive(virDomainObjListPtr doms,
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
virDomainObjUnlock(dom);
|
||||
|
||||
for (i = 0 ; i < doms->count ; i++) {
|
||||
virDomainObjLock(doms->objs[i]);
|
||||
if (doms->objs[i] == dom) {
|
||||
virDomainObjUnlock(doms->objs[i]);
|
||||
virDomainObjFree(doms->objs[i]);
|
||||
|
||||
if (i < (doms->count - 1))
|
||||
@ -490,6 +505,7 @@ void virDomainRemoveInactive(virDomainObjListPtr doms,
|
||||
|
||||
break;
|
||||
}
|
||||
virDomainObjUnlock(doms->objs[i]);
|
||||
}
|
||||
|
||||
}
|
||||
@ -3348,9 +3364,11 @@ int virDomainLoadAllConfigs(virConnectPtr conn,
|
||||
entry->d_name,
|
||||
notify,
|
||||
opaque);
|
||||
if (dom)
|
||||
if (dom) {
|
||||
virDomainObjUnlock(dom);
|
||||
dom->persistent = 1;
|
||||
}
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
|
||||
@ -3470,6 +3488,19 @@ const char *virDomainDefDefaultEmulator(virConnectPtr conn,
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_PTHREAD_H
|
||||
|
||||
void virDomainObjLock(virDomainObjPtr obj)
|
||||
{
|
||||
pthread_mutex_lock(&obj->lock);
|
||||
}
|
||||
|
||||
void virDomainObjUnlock(virDomainObjPtr obj)
|
||||
{
|
||||
pthread_mutex_unlock(&obj->lock);
|
||||
}
|
||||
|
||||
#else
|
||||
void virDomainObjLock(virDomainObjPtr obj ATTRIBUTE_UNUSED)
|
||||
{
|
||||
}
|
||||
@ -3477,5 +3508,6 @@ void virDomainObjLock(virDomainObjPtr obj ATTRIBUTE_UNUSED)
|
||||
void virDomainObjUnlock(virDomainObjPtr obj ATTRIBUTE_UNUSED)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* ! PROXY */
|
||||
|
@ -454,6 +454,8 @@ struct _virDomainDef {
|
||||
typedef struct _virDomainObj virDomainObj;
|
||||
typedef virDomainObj *virDomainObjPtr;
|
||||
struct _virDomainObj {
|
||||
PTHREAD_MUTEX_T(lock);
|
||||
|
||||
int stdin_fd;
|
||||
int stdout_fd;
|
||||
int stdout_watch;
|
||||
|
@ -58,9 +58,12 @@ virNetworkObjPtr virNetworkFindByUUID(const virNetworkObjListPtr nets,
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0 ; i < nets->count ; i++)
|
||||
for (i = 0 ; i < nets->count ; i++) {
|
||||
virNetworkObjLock(nets->objs[i]);
|
||||
if (!memcmp(nets->objs[i]->def->uuid, uuid, VIR_UUID_BUFLEN))
|
||||
return nets->objs[i];
|
||||
virNetworkObjUnlock(nets->objs[i]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -70,9 +73,12 @@ virNetworkObjPtr virNetworkFindByName(const virNetworkObjListPtr nets,
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0 ; i < nets->count ; i++)
|
||||
for (i = 0 ; i < nets->count ; i++) {
|
||||
virNetworkObjLock(nets->objs[i]);
|
||||
if (STREQ(nets->objs[i]->def->name, name))
|
||||
return nets->objs[i];
|
||||
virNetworkObjUnlock(nets->objs[i]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -157,7 +163,8 @@ virNetworkObjPtr virNetworkAssignDef(virConnectPtr conn,
|
||||
virNetworkReportError(conn, VIR_ERR_NO_MEMORY, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pthread_mutex_init(&network->lock, NULL);
|
||||
virNetworkObjLock(network);
|
||||
network->def = def;
|
||||
|
||||
if (VIR_REALLOC_N(nets->objs, nets->count + 1) < 0) {
|
||||
@ -178,8 +185,11 @@ void virNetworkRemoveInactive(virNetworkObjListPtr nets,
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
virNetworkObjUnlock(net);
|
||||
for (i = 0 ; i < nets->count ; i++) {
|
||||
virNetworkObjLock(nets->objs[i]);
|
||||
if (nets->objs[i] == net) {
|
||||
virNetworkObjUnlock(nets->objs[i]);
|
||||
virNetworkObjFree(nets->objs[i]);
|
||||
|
||||
if (i < (nets->count - 1))
|
||||
@ -193,6 +203,7 @@ void virNetworkRemoveInactive(virNetworkObjListPtr nets,
|
||||
|
||||
break;
|
||||
}
|
||||
virNetworkObjUnlock(nets->objs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -770,6 +781,8 @@ int virNetworkLoadAllConfigs(virConnectPtr conn,
|
||||
}
|
||||
|
||||
while ((entry = readdir(dir))) {
|
||||
virNetworkObjPtr net;
|
||||
|
||||
if (entry->d_name[0] == '.')
|
||||
continue;
|
||||
|
||||
@ -778,11 +791,13 @@ int virNetworkLoadAllConfigs(virConnectPtr conn,
|
||||
|
||||
/* NB: ignoring errors, so one malformed config doesn't
|
||||
kill the whole process */
|
||||
virNetworkLoadConfig(conn,
|
||||
net = virNetworkLoadConfig(conn,
|
||||
nets,
|
||||
configDir,
|
||||
autostartDir,
|
||||
entry->d_name);
|
||||
if (net)
|
||||
virNetworkObjUnlock(net);
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
@ -812,6 +827,19 @@ int virNetworkDeleteConfig(virConnectPtr conn,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_PTHREAD_H
|
||||
|
||||
void virNetworkObjLock(virNetworkObjPtr obj)
|
||||
{
|
||||
pthread_mutex_lock(&obj->lock);
|
||||
}
|
||||
|
||||
void virNetworkObjUnlock(virNetworkObjPtr obj)
|
||||
{
|
||||
pthread_mutex_unlock(&obj->lock);
|
||||
}
|
||||
|
||||
#else
|
||||
void virNetworkObjLock(virNetworkObjPtr obj ATTRIBUTE_UNUSED)
|
||||
{
|
||||
}
|
||||
@ -819,3 +847,5 @@ void virNetworkObjLock(virNetworkObjPtr obj ATTRIBUTE_UNUSED)
|
||||
void virNetworkObjUnlock(virNetworkObjPtr obj ATTRIBUTE_UNUSED)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -82,6 +82,8 @@ struct _virNetworkDef {
|
||||
typedef struct _virNetworkObj virNetworkObj;
|
||||
typedef virNetworkObj *virNetworkObjPtr;
|
||||
struct _virNetworkObj {
|
||||
PTHREAD_MUTEX_T(lock);
|
||||
|
||||
pid_t dnsmasqPid;
|
||||
unsigned int active : 1;
|
||||
unsigned int autostart : 1;
|
||||
|
@ -59,9 +59,12 @@ virNodeDeviceObjPtr virNodeDeviceFindByName(const virNodeDeviceObjListPtr devs,
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < devs->count; i++)
|
||||
for (i = 0; i < devs->count; i++) {
|
||||
virNodeDeviceObjLock(devs->objs[i]);
|
||||
if (STREQ(devs->objs[i]->def->name, name))
|
||||
return devs->objs[i];
|
||||
virNodeDeviceObjUnlock(devs->objs[i]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -125,6 +128,8 @@ virNodeDeviceObjPtr virNodeDeviceAssignDef(virConnectPtr conn,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pthread_mutex_init(&device->lock, NULL);
|
||||
virNodeDeviceObjLock(device);
|
||||
device->def = def;
|
||||
|
||||
if (VIR_REALLOC_N(devs->objs, devs->count+1) < 0) {
|
||||
@ -144,8 +149,12 @@ void virNodeDeviceObjRemove(virNodeDeviceObjListPtr devs,
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
virNodeDeviceObjUnlock(dev);
|
||||
|
||||
for (i = 0; i < devs->count; i++) {
|
||||
virNodeDeviceObjLock(dev);
|
||||
if (devs->objs[i] == dev) {
|
||||
virNodeDeviceObjUnlock(dev);
|
||||
virNodeDeviceObjFree(devs->objs[i]);
|
||||
|
||||
if (i < (devs->count - 1))
|
||||
@ -159,6 +168,7 @@ void virNodeDeviceObjRemove(virNodeDeviceObjListPtr devs,
|
||||
|
||||
break;
|
||||
}
|
||||
virNodeDeviceObjUnlock(dev);
|
||||
}
|
||||
}
|
||||
|
||||
@ -398,6 +408,20 @@ void virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps)
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_PTHREAD_H
|
||||
|
||||
void virNodeDeviceObjLock(virNodeDeviceObjPtr obj)
|
||||
{
|
||||
pthread_mutex_lock(&obj->lock);
|
||||
}
|
||||
|
||||
void virNodeDeviceObjUnlock(virNodeDeviceObjPtr obj)
|
||||
{
|
||||
pthread_mutex_unlock(&obj->lock);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void virNodeDeviceObjLock(virNodeDeviceObjPtr obj ATTRIBUTE_UNUSED)
|
||||
{
|
||||
}
|
||||
@ -405,3 +429,5 @@ void virNodeDeviceObjLock(virNodeDeviceObjPtr obj ATTRIBUTE_UNUSED)
|
||||
void virNodeDeviceObjUnlock(virNodeDeviceObjPtr obj ATTRIBUTE_UNUSED)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -142,6 +142,8 @@ struct _virNodeDeviceDef {
|
||||
typedef struct _virNodeDeviceObj virNodeDeviceObj;
|
||||
typedef virNodeDeviceObj *virNodeDeviceObjPtr;
|
||||
struct _virNodeDeviceObj {
|
||||
PTHREAD_MUTEX_T(lock);
|
||||
|
||||
virNodeDeviceDefPtr def; /* device definition */
|
||||
void *privateData; /* driver-specific private data */
|
||||
void (*privateFree)(void *data); /* destructor for private data */
|
||||
|
@ -310,8 +310,12 @@ virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
virStoragePoolObjUnlock(pool);
|
||||
|
||||
for (i = 0 ; i < pools->count ; i++) {
|
||||
virStoragePoolObjLock(pools->objs[i]);
|
||||
if (pools->objs[i] == pool) {
|
||||
virStoragePoolObjUnlock(pools->objs[i]);
|
||||
virStoragePoolObjFree(pools->objs[i]);
|
||||
|
||||
if (i < (pools->count - 1))
|
||||
@ -325,6 +329,7 @@ virStoragePoolObjRemove(virStoragePoolObjListPtr pools,
|
||||
|
||||
break;
|
||||
}
|
||||
virStoragePoolObjUnlock(pools->objs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1153,9 +1158,12 @@ virStoragePoolObjFindByUUID(virStoragePoolObjListPtr pools,
|
||||
const unsigned char *uuid) {
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0 ; i < pools->count ; i++)
|
||||
for (i = 0 ; i < pools->count ; i++) {
|
||||
virStoragePoolObjLock(pools->objs[i]);
|
||||
if (!memcmp(pools->objs[i]->def->uuid, uuid, VIR_UUID_BUFLEN))
|
||||
return pools->objs[i];
|
||||
virStoragePoolObjUnlock(pools->objs[i]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -1165,9 +1173,12 @@ virStoragePoolObjFindByName(virStoragePoolObjListPtr pools,
|
||||
const char *name) {
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0 ; i < pools->count ; i++)
|
||||
for (i = 0 ; i < pools->count ; i++) {
|
||||
virStoragePoolObjLock(pools->objs[i]);
|
||||
if (STREQ(pools->objs[i]->def->name, name))
|
||||
return pools->objs[i];
|
||||
virStoragePoolObjUnlock(pools->objs[i]);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -1243,6 +1254,8 @@ virStoragePoolObjAssignDef(virConnectPtr conn,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pthread_mutex_init(&pool->lock, NULL);
|
||||
virStoragePoolObjLock(pool);
|
||||
pool->active = 0;
|
||||
pool->def = def;
|
||||
|
||||
@ -1327,6 +1340,7 @@ virStoragePoolLoadAllConfigs(virConnectPtr conn,
|
||||
char *xml = NULL;
|
||||
char path[PATH_MAX];
|
||||
char autostartLink[PATH_MAX];
|
||||
virStoragePoolObjPtr pool;
|
||||
|
||||
if (entry->d_name[0] == '.')
|
||||
continue;
|
||||
@ -1351,7 +1365,9 @@ virStoragePoolLoadAllConfigs(virConnectPtr conn,
|
||||
if (virFileReadAll(path, 8192, &xml) < 0)
|
||||
continue;
|
||||
|
||||
virStoragePoolObjLoad(conn, pools, entry->d_name, path, xml, autostartLink);
|
||||
pool = virStoragePoolObjLoad(conn, pools, entry->d_name, path, xml, autostartLink);
|
||||
if (pool)
|
||||
virStoragePoolObjUnlock(pool);
|
||||
|
||||
VIR_FREE(xml);
|
||||
}
|
||||
@ -1509,6 +1525,18 @@ char *virStoragePoolSourceListFormat(virConnectPtr conn,
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_PTHREAD_H
|
||||
|
||||
void virStoragePoolObjLock(virStoragePoolObjPtr obj)
|
||||
{
|
||||
pthread_mutex_lock(&obj->lock);
|
||||
}
|
||||
|
||||
void virStoragePoolObjUnlock(virStoragePoolObjPtr obj)
|
||||
{
|
||||
pthread_mutex_unlock(&obj->lock);
|
||||
}
|
||||
#else
|
||||
void virStoragePoolObjLock(virStoragePoolObjPtr obj ATTRIBUTE_UNUSED)
|
||||
{
|
||||
}
|
||||
@ -1516,3 +1544,4 @@ void virStoragePoolObjLock(virStoragePoolObjPtr obj ATTRIBUTE_UNUSED)
|
||||
void virStoragePoolObjUnlock(virStoragePoolObjPtr obj ATTRIBUTE_UNUSED)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
@ -223,6 +223,8 @@ typedef struct _virStoragePoolObj virStoragePoolObj;
|
||||
typedef virStoragePoolObj *virStoragePoolObjPtr;
|
||||
|
||||
struct _virStoragePoolObj {
|
||||
PTHREAD_MUTEX_T(lock);
|
||||
|
||||
char *configFile;
|
||||
char *autostartLink;
|
||||
int active;
|
||||
|
Loading…
Reference in New Issue
Block a user