Fix tabbing.... Please fix your editors so they do tabbing correctly!!! (Spaces...
[IRC.git] / Robust / src / Runtime / psemaphore.c
1 #include <stdlib.h>
2 #include <errno.h>
3 #include "psemaphore.h"
4
5
6 void psem_init(psemaphore* sem) {
7   pthread_mutex_init(&(sem->lock), NULL);
8   pthread_cond_init(&(sem->cond), NULL);
9   sem->signaled = 0;
10   sem->tag = 0;
11 }
12
13
14 void psem_take(psemaphore* sem, struct garbagelist* gl) {
15   pthread_mutex_lock(&(sem->lock) );
16   if( !sem->signaled ) {
17     stopforgc(gl);
18     do {
19       pthread_cond_wait(&(sem->cond), &(sem->lock) );
20     } while( !sem->signaled );
21     restartaftergc();
22   }
23   pthread_mutex_unlock(&(sem->lock) );
24 }
25
26
27 void psem_give(psemaphore* sem) {
28   pthread_mutex_lock(&(sem->lock) );
29   sem->signaled = 1;
30   pthread_cond_signal(&(sem->cond) );
31   pthread_mutex_unlock(&(sem->lock) );
32 }
33
34 void psem_give_tag(psemaphore* sem, int tag) {
35   pthread_mutex_lock(&(sem->lock) );
36   if (sem->tag==tag) {
37     sem->signaled = 1;
38     pthread_cond_signal(&(sem->cond) );
39   }
40   pthread_mutex_unlock(&(sem->lock) );
41 }
42
43
44 void psem_reset(psemaphore* sem) {
45   pthread_mutex_lock(&(sem->lock) );
46   sem->tag++;
47   sem->signaled = 0;
48   pthread_mutex_unlock(&(sem->lock) );
49 }