Add a read/write lock implementation

Add virRWLock backed up by a POSIX rwlock primitive

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2014-01-22 15:26:21 +00:00
parent 94e0906839
commit c065984b58
6 changed files with 75 additions and 0 deletions

View File

@ -1818,6 +1818,11 @@ virMutexInitRecursive;
virMutexLock; virMutexLock;
virMutexUnlock; virMutexUnlock;
virOnce; virOnce;
virRWLockDestroy;
virRWLockInit;
virRWLockRead;
virRWLockUnlock;
virRWLockWrite;
virThreadCancel; virThreadCancel;
virThreadCreate; virThreadCreate;
virThreadID; virThreadID;

View File

@ -28,6 +28,9 @@
typedef struct virMutex virMutex; typedef struct virMutex virMutex;
typedef virMutex *virMutexPtr; typedef virMutex *virMutexPtr;
typedef struct virRWLock virRWLock;
typedef virRWLock *virRWLockPtr;
typedef struct virCond virCond; typedef struct virCond virCond;
typedef virCond *virCondPtr; typedef virCond *virCondPtr;
@ -89,6 +92,13 @@ void virMutexLock(virMutexPtr m);
void virMutexUnlock(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 virCondInit(virCondPtr c) ATTRIBUTE_RETURN_CHECK;
int virCondDestroy(virCondPtr c); int virCondDestroy(virCondPtr c);

View 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 virCondInit(virCondPtr c)
{ {
int ret; int ret;

View File

@ -27,6 +27,10 @@ struct virMutex {
pthread_mutex_t lock; pthread_mutex_t lock;
}; };
struct virRWLock {
pthread_rwlock_t lock;
};
struct virCond { struct virCond {
pthread_cond_t cond; pthread_cond_t cond;
}; };

View File

@ -123,6 +123,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) int virCondInit(virCondPtr c)
{ {

View File

@ -30,6 +30,10 @@ struct virMutex {
HANDLE lock; HANDLE lock;
}; };
struct virRWLock {
bool ignored;
};
struct virCond { struct virCond {
virMutex lock; virMutex lock;
size_t nwaiters; size_t nwaiters;