- morning panick victory
[The-Artvertiser.git] / artvertiser / FProfiler / FSemaphore.h
blob34d7b3602c2afbf8baa6c350185f71ff562c90dc
1 /*
2 * FSemaphore.h
3 * F
5 * Created by damian on 25/5/08.
6 * Copyright 2008 frey damian@frey.co.nz. All rights reserved.
8 */
10 #ifndef _FSEMAPHORE_H
11 #define _FSEMAPHORE_H
13 #include <stdio.h>
14 #include <semaphore.h>
15 #include <pthread.h>
16 #include <sys/errno.h>
17 #include <assert.h>
19 class FBarrier
21 public:
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; }
30 private:
32 pthread_barrier_t barrier;
36 class FSemaphore
38 public:
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
46 bool TryWait() {
47 /*#ifdef DEBUG
48 int err=sem_trywait( &sem );
49 if ( err != 0 )
50 Log::Msg( "trywait: error %s\n", err == EAGAIN? "EAGAIN" :
51 (err==EDEADLK?"EDEADLK":(err==EINTR?"EINTR":(err==EINVAL?"EINVAL":"UNKNOWN"))));
52 return ( err == 0 );
53 #else*/
54 if ( debug ) printf( "%x Trywait\n", (unsigned int)&sem );
55 return 0==sem_trywait( &sem );
56 //#endif
59 /// signal the semaphore that we've finished
60 void Signal() { if (debug) printf("%x Signal\n", (unsigned int)&sem); sem_post( &sem ); }
62 private:
63 sem_t sem;
64 bool debug;
68 #endif