]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add recursive locks
authorStefan Berger <stefanb@us.ibm.com>
Thu, 25 Mar 2010 17:45:59 +0000 (13:45 -0400)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 26 Mar 2010 18:01:15 +0000 (18:01 +0000)
This patch adds recursive locks necessary due to the processing of
network filter XML that can reference other network filters, including
references that cause looks. Loops in the XML are prevented but their
detection requires recursive locks.

Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
src/util/threads-pthread.c
src/util/threads-win32.c
src/util/threads.h

index 2f0746bb2680d1d31eeb831aa727b5dd518bce25..030b33fcafbf324b986067324809ab1600a28d88 100644 (file)
@@ -46,6 +46,19 @@ int virMutexInit(virMutexPtr m)
     return 0;
 }
 
+int virMutexInitRecursive(virMutexPtr m)
+{
+    int ret;
+    pthread_mutexattr_t attr;
+    pthread_mutexattr_init(&attr);
+    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+    if ((ret = pthread_mutex_init(&m->lock, &attr)) != 0) {
+        errno = ret;
+        return -1;
+    }
+    return 0;
+}
+
 void virMutexDestroy(virMutexPtr m)
 {
     pthread_mutex_destroy(&m->lock);
index ef3f2ef2c0c233623e567048167b4c5df4e96a14..b1d15712cbe525e227e7cd77b6f7bd9759f67adc 100644 (file)
@@ -68,6 +68,11 @@ void virThreadOnExit(void)
 
 
 int virMutexInit(virMutexPtr m)
+{
+    virMutexInitRecursive(m);
+}
+
+int virMutexInitRecursive(virMutexPtr m)
 {
     if (!(m->lock = CreateMutex(NULL, FALSE, NULL))) {
         errno = ESRCH;
index 36fc6002beb1998e3fc9d0fa463edc105acfb663..6e010829ff446eb0a26b27a5d749536c64d9545f 100644 (file)
@@ -38,6 +38,7 @@ int virThreadInitialize(void) ATTRIBUTE_RETURN_CHECK;
 void virThreadOnExit(void);
 
 int virMutexInit(virMutexPtr m) ATTRIBUTE_RETURN_CHECK;
+int virMutexInitRecursive(virMutexPtr m) ATTRIBUTE_RETURN_CHECK;
 void virMutexDestroy(virMutexPtr m);
 
 void virMutexLock(virMutexPtr m);