summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2014-01-22 15:26:21 +0000
committerLaine Stump <laine@laine.org>2014-02-06 15:49:51 +0200
commit14f6b2085eefa668b7f3310c948f4f72025a9369 (patch)
tree7101bc1474da2f9d146d2ce8c5ff7067faf06805
parente57db9525390a314ca44bf56bceb407f53fbd8d2 (diff)
downloadlibvirt-14f6b2085eefa668b7f3310c948f4f72025a9369.tar.gz
Add a read/write lock implementation
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
-rw-r--r--src/libvirt_private.syms5
-rw-r--r--src/util/virthread.h10
-rw-r--r--src/util/virthreadpthread.c33
-rw-r--r--src/util/virthreadpthread.h4
-rw-r--r--src/util/virthreadwin32.c19
-rw-r--r--src/util/virthreadwin32.h4
6 files changed, 75 insertions, 0 deletions
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index dd44ba61c0..987762893e 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1744,6 +1744,11 @@ virMutexInitRecursive;
virMutexLock;
virMutexUnlock;
virOnce;
+virRWLockDestroy;
+virRWLockInit;
+virRWLockRead;
+virRWLockUnlock;
+virRWLockWrite;
virThreadCreate;
virThreadID;
virThreadInitialize;
diff --git a/src/util/virthread.h b/src/util/virthread.h
index c59a2cfddf..bc98cba793 100644
--- a/src/util/virthread.h
+++ b/src/util/virthread.h
@@ -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);
diff --git a/src/util/virthreadpthread.c b/src/util/virthreadpthread.c
index 9f02ba1b04..481ba2697b 100644
--- a/src/util/virthreadpthread.c
+++ b/src/util/virthreadpthread.c
@@ -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;
diff --git a/src/util/virthreadpthread.h b/src/util/virthreadpthread.h
index b9f1319fc1..cb607d0d72 100644
--- a/src/util/virthreadpthread.h
+++ b/src/util/virthreadpthread.h
@@ -27,6 +27,10 @@ struct virMutex {
pthread_mutex_t lock;
};
+struct virRWLock {
+ pthread_rwlock_t lock;
+};
+
struct virCond {
pthread_cond_t cond;
};
diff --git a/src/util/virthreadwin32.c b/src/util/virthreadwin32.c
index 0ad7e5c570..dc96533dce 100644
--- a/src/util/virthreadwin32.c
+++ b/src/util/virthreadwin32.c
@@ -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)
{
diff --git a/src/util/virthreadwin32.h b/src/util/virthreadwin32.h
index fc12847a89..5f8dfd3678 100644
--- a/src/util/virthreadwin32.h
+++ b/src/util/virthreadwin32.h
@@ -30,6 +30,10 @@ struct virMutex {
HANDLE lock;
};
+struct virRWLock {
+ bool ignored;
+};
+
struct virCond {
virMutex lock;
unsigned int nwaiters;