64cdda50ca68bb49d53f8500c227580a241c17d5
[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   // this should NEVER BE CALLED if it is possible
46   // the semaphore is still in use, NEVER
47   if( pthread_mutex_trylock( &(sem->lock) ) == EBUSY ) {
48     exit( -1 );
49   }
50   pthread_mutex_unlock( &(sem->lock) );
51   sem->tag++;
52   sem->signaled = 0;
53 }