]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Impl of threading locking APIs
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 4 Dec 2008 22:00:14 +0000 (22:00 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Thu, 4 Dec 2008 22:00:14 +0000 (22:00 +0000)
ChangeLog
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

index e3ddb69e926f09e4b5e99eee21853bbfa1e9efb5..fd2d3f6c62760da4cbda312a5c0029688767f412 100644 (file)
--- a/ChangeLog
+++ b/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,
index 2740ab72e87e5910765ce537fa7d03d9c6e06b84..ad82a16e7aab6142042b5d506b765aa1c4abc359 100644 (file)
@@ -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,8 +3364,10 @@ 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 */
index 76405578522729d49aab05ee512f35613470ae56..51cf6d56d51ba69c81431b1df0e5d7ed93b04afa 100644 (file)
@@ -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;
index 0dfde672dbca1a24886551a1a26224b31390d7d5..21dbc674cf2c692d7964c76e4413930a808fd7d9 100644 (file)
@@ -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,
-                             nets,
-                             configDir,
-                             autostartDir,
-                             entry->d_name);
+        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
index c83eeabc97fed8f8da606861c85f50e112707530..47bfc6e3070ce3124d22da366198794dc1fed95d 100644 (file)
@@ -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;
index bee466b119823b17fb3f0e1e657073898f2ce317..526cd84588e7c279246a3ea8bb329aabdeade6d7 100644 (file)
@@ -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
index 6f03a012cf773f7548a942165927ed95166f2ac0..5addbab1ac3441132036e1bac596facc2b3fcb9e 100644 (file)
@@ -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 */
index c54490a99d9bdcbbc68086647b825f0ca096c964..522fc984ba4bc111672140478dcc99297e39ae8f 100644 (file)
@@ -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
index 6ee3f9d030657f65a8700f401dae3a503e3bdcb3..76ea9135b0e732e9dc20ada5cb402c01fa4f288c 100644 (file)
@@ -223,6 +223,8 @@ typedef struct _virStoragePoolObj virStoragePoolObj;
 typedef virStoragePoolObj *virStoragePoolObjPtr;
 
 struct _virStoragePoolObj {
+    PTHREAD_MUTEX_T(lock);
+
     char *configFile;
     char *autostartLink;
     int active;