]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Add a read/write lock implementation
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 22 Jan 2014 15:26:21 +0000 (15:26 +0000)
committerLaine Stump <laine@laine.org>
Thu, 6 Feb 2014 13:49:51 +0000 (15:49 +0200)
Add virRWLock backed up by a POSIX rwlock primitive

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
(cherry picked from commit c065984b58000a44c90588198d222a314ac532fd)

Conflicts:
  src/libvirt_private.syms
   - virThreadCancel (in context) was introduced after 1.0.3 branch

src/libvirt_private.syms
src/util/virthread.h
src/util/virthreadpthread.c
src/util/virthreadpthread.h
src/util/virthreadwin32.c
src/util/virthreadwin32.h

index dd44ba61c01e7851928870bf76e6651a7cd3e901..987762893ef6b4aa82200866c62f19c18ce0e753 100644 (file)
@@ -1744,6 +1744,11 @@ virMutexInitRecursive;
 virMutexLock;
 virMutexUnlock;
 virOnce;
+virRWLockDestroy;
+virRWLockInit;
+virRWLockRead;
+virRWLockUnlock;
+virRWLockWrite;
 virThreadCreate;
 virThreadID;
 virThreadInitialize;
index c59a2cfddf77ff6d25a0629f16716bd4367f5ba4..bc98cba7939bc74288ace2e26c76e3e651f4777f 100644 (file)
@@ -28,6 +28,9 @@
 typedef struct virMutex virMutex;
 typedef virMutex *virMutexPtr;
 
+typedef struct virRWLock virRWLock;
+typedef virRWLock *virRWLockPtr;
+
 typedef struct virCond virCond;
 typedef virCond *virCondPtr;
 
@@ -85,6 +88,13 @@ void virMutexLock(virMutexPtr m);
 void virMutexUnlock(virMutexPtr m);
 
 
+int virRWLockInit(virRWLockPtr m) ATTRIBUTE_RETURN_CHECK;
+void virRWLockDestroy(virRWLockPtr m);
+
+void virRWLockRead(virRWLockPtr m);
+void virRWLockWrite(virRWLockPtr m);
+void virRWLockUnlock(virRWLockPtr m);
+
 
 int virCondInit(virCondPtr c) ATTRIBUTE_RETURN_CHECK;
 int virCondDestroy(virCondPtr c);
index 9f02ba1b04a7e6b7035e79a2d60ed950d7521ef9..481ba2697b13a329e7cc585f2cb320469f5e8b2a 100644 (file)
@@ -91,6 +91,39 @@ void virMutexUnlock(virMutexPtr m)
 }
 
 
+int virRWLockInit(virRWLockPtr m)
+{
+    int ret;
+    ret = pthread_rwlock_init(&m->lock, NULL);
+    if (ret != 0) {
+        errno = ret;
+        return -1;
+    }
+    return 0;
+}
+
+void virRWLockDestroy(virRWLockPtr m)
+{
+    pthread_rwlock_destroy(&m->lock);
+}
+
+
+void virRWLockRead(virRWLockPtr m)
+{
+    pthread_rwlock_rdlock(&m->lock);
+}
+
+void virRWLockWrite(virRWLockPtr m)
+{
+    pthread_rwlock_wrlock(&m->lock);
+}
+
+
+void virRWLockUnlock(virRWLockPtr m)
+{
+    pthread_rwlock_unlock(&m->lock);
+}
+
 int virCondInit(virCondPtr c)
 {
     int ret;
index b9f1319fc1098dec24ae2bf32a697f1f73f0e4f2..cb607d0d72a1c6b630498e46deb603f47167ef0d 100644 (file)
@@ -27,6 +27,10 @@ struct virMutex {
     pthread_mutex_t lock;
 };
 
+struct virRWLock {
+    pthread_rwlock_t lock;
+};
+
 struct virCond {
     pthread_cond_t cond;
 };
index 0ad7e5c57029964a70bbb32a435d5ac9c775ad20..dc96533dced40e7e04d1deec6e53d7087a96d4cb 100644 (file)
@@ -121,6 +121,25 @@ void virMutexUnlock(virMutexPtr m)
 }
 
 
+int virRWLockInit(virRWLockPtr m ATTRIBUTE_UNUSED)
+{
+    errno = ENOSYS;
+    return -1;
+}
+
+void virRWLockDestroy(virRWLockPtr m ATTRIBUTE_UNUSED)
+{}
+
+
+void virRWLockRead(virRWLockPtr m ATTRIBUTE_UNUSED)
+{}
+
+void virRWLockWrite(virRWLockPtr m ATTRIBUTE_UNUSED)
+{}
+
+
+void virRWLockUnlock(virRWLockPtr m ATTRIBUTE_UNUSED)
+{}
 
 int virCondInit(virCondPtr c)
 {
index fc12847a8986953f3995d2b16022516c14e96772..5f8dfd36783a11133b4b1d80cafc696d7a73b323 100644 (file)
@@ -30,6 +30,10 @@ struct virMutex {
     HANDLE lock;
 };
 
+struct virRWLock {
+    bool ignored;
+};
+
 struct virCond {
     virMutex lock;
     unsigned int nwaiters;