5 * Created by damian on 25/5/08.
6 * Copyright 2008 frey damian@frey.co.nz. All rights reserved.
14 #include <semaphore.h>
16 #include <sys/errno.h>
22 /// count is the number of threads to wait for.
23 FBarrier( int count
) { int res
= pthread_barrier_init( &barrier
, 0, count
); assert(res
==0 && "error creating barrier"); }
24 ~FBarrier() { int res
= pthread_barrier_destroy( &barrier
); if ( res
==EBUSY
) assert(false && "cannot destroy barrier when it is in use" ); }
26 /// wait for everyone to arrive at the barrier. return once they have. returns true if wait returns
27 /// the PTHREAD_BARRIER_SERIAL_THREAD return value.
28 bool Wait() { int ret
= pthread_barrier_wait( &barrier
); return ret
== PTHREAD_BARRIER_SERIAL_THREAD
; }
32 pthread_barrier_t barrier
;
39 FSemaphore( int init
= 1,bool _debug
= false) { debug
= _debug
; sem_init( &sem
, 0, init
); }
40 ~FSemaphore() { sem_destroy( &sem
); }
42 /// wait for the semaphore to become available and then grab
43 void Wait() { if ( debug
) printf("%x about to Wait\n", (unsigned int)&sem
); sem_wait( &sem
); if( debug
) printf("%x Wait\n", (unsigned int)&sem
); }
45 /// try once; if available, grab and return true, else return false
48 int err=sem_trywait( &sem );
50 Log::Msg( "trywait: error %s\n", err == EAGAIN? "EAGAIN" :
51 (err==EDEADLK?"EDEADLK":(err==EINTR?"EINTR":(err==EINVAL?"EINVAL":"UNKNOWN"))));
54 if ( debug
) printf( "%x Trywait\n", (unsigned int)&sem
);
55 return 0==sem_trywait( &sem
);
59 /// signal the semaphore that we've finished
60 void Signal() { if (debug
) printf("%x Signal\n", (unsigned int)&sem
); sem_post( &sem
); }