On Fri, Oct 23, 2009 at 02:05:31PM +0100, Daniel P. Berrange wrote:
This implements a thin wrapper around the pthread_rwlock
primitives. No impl is provided for Win32 at this time
since it is rather hard, and none of our code yet requires
it on Win32
* src/util/threads.h: Add virRWLockInit, virRWLockDestroy,
virRWLockRead, virRWLockWrite, virRWLockUnlock APIs
* src/util/threads-pthread.h: define virRWLock struct
* src/util/threads-pthread.c: Implement RWLock APIs
---
src/libvirt_private.syms | 6 ++++++
src/util/threads-pthread.c | 30 ++++++++++++++++++++++++++++++
src/util/threads-pthread.h | 4 ++++
src/util/threads.h | 10 ++++++++++
4 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index bd9d84a..6ed562d 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -426,6 +426,12 @@ virCondWait;
virCondSignal;
virCondBroadcast;
+virRWLockInit;
+virRWLockDestroy;
+virRWLockRead;
+virRWLockWrite;
+virRWLockUnlock;
+
# util.h
virFileReadAll;
virFileWriteStr;
diff --git a/src/util/threads-pthread.c b/src/util/threads-pthread.c
index 4e00bc5..2052c0a 100644
--- a/src/util/threads-pthread.c
+++ b/src/util/threads-pthread.c
@@ -57,6 +57,36 @@ void virMutexUnlock(virMutexPtr m)
}
+int virRWLockInit(virRWLockPtr m)
+{
+ if (pthread_rwlock_init(&m->lock, NULL) != 0) {
+ errno = EINVAL;
+ 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);
+}
+
+
Hum it's a small patch, but I would rather fix those function to not
be void when the underlying pthread_ counterpart can actually fail.
IMHO we should report errors coming from the thread library (whichever
is used on a given platform).
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/