pthread implementation of a ticket lock

This commit is contained in:
Nils O. Selåsdal
2014-06-25 16:48:42 +02:00
parent 1282f420a1
commit dcc38151b1
2 changed files with 92 additions and 0 deletions
+49
View File
@@ -0,0 +1,49 @@
#include <assert.h>
#include "ucore/ticket_lock.h"
int uc_ticket_lock_init(struct UCTicketLock *lock)
{
return uc_ticket_lock_init_ex(lock, NULL, NULL);
}
int uc_ticket_lock_init_ex(struct UCTicketLock *lock, pthread_mutexattr_t *mattr, pthread_condattr_t *cattr)
{
int rc;
lock->queue_head = 0;
lock->queue_tail = 0;
rc = pthread_mutex_init(&lock->mutex, mattr);
assert(rc == 0);
if (rc != 0) {
return rc;
}
rc = pthread_cond_init(&lock->cond, cattr);
if (rc != 0) {
pthread_mutex_destroy(&lock->mutex);
}
assert(rc == 0);
return rc;
}
void uc_ticket_lock(struct UCTicketLock *lock)
{
unsigned long queue_me;
pthread_mutex_lock(&lock->mutex);
queue_me = lock->queue_tail++;
while (queue_me != lock->queue_head)
{
pthread_cond_wait(&lock->cond, &lock->mutex);
}
pthread_mutex_unlock(&lock->mutex);
}
void uc_ticket_unlock(struct UCTicketLock *lock)
{
pthread_mutex_lock(&lock->mutex);
lock->queue_head++;
pthread_cond_broadcast(&lock->cond);
pthread_mutex_unlock(&lock->mutex);
}