diff options
author | Daniel P. Berrange <berrange@redhat.com> | 2014-01-22 15:26:21 +0000 |
---|---|---|
committer | Laine Stump <laine@laine.org> | 2014-02-06 15:49:51 +0200 |
commit | 14f6b2085eefa668b7f3310c948f4f72025a9369 (patch) | |
tree | 7101bc1474da2f9d146d2ce8c5ff7067faf06805 | |
parent | e57db9525390a314ca44bf56bceb407f53fbd8d2 (diff) | |
download | libvirt-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.syms | 5 | ||||
-rw-r--r-- | src/util/virthread.h | 10 | ||||
-rw-r--r-- | src/util/virthreadpthread.c | 33 | ||||
-rw-r--r-- | src/util/virthreadpthread.h | 4 | ||||
-rw-r--r-- | src/util/virthreadwin32.c | 19 | ||||
-rw-r--r-- | src/util/virthreadwin32.h | 4 |
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; |