My Project
Semaphore.hpp
1 #pragma once
2 
3 // Use Win or Posix
4 #ifdef WIN32
5 #include <windows.h>
6 #define LMAXIMUMCOUNT 99999999
7 #else
8 #ifndef POSIX
9 #warning POSIX will be used (but you did not define it)
10 #endif
11 #include <semaphore.h>
12 #endif
13 
14 namespace ParaEngine
15 {
21  class Semaphore{
22  protected:
23 
24 #ifdef WIN32
25  HANDLE _sem;
26 #else
27  sem_t _sem;
28 #endif
29 
30  public:
35  Semaphore( int in_init = 0 ){
36 #ifdef WIN32
37  _sem = CreateSemaphore(0,in_init,LMAXIMUMCOUNT,0);
38 #else
39  sem_init(&_sem,0,in_init);
40 #endif
41  }
42 
47  Semaphore(const Semaphore &in_sem){
48  int value = in_sem.value();
49 #ifdef WIN32
50  _sem = CreateSemaphore(0,value,LMAXIMUMCOUNT,0);
51 #else
52  sem_init(&_sem,0,value);
53 #endif
54  }
55 
60  void operator=(const Semaphore &in_sem){
61  reset(in_sem.value());
62  }
63 
67  virtual ~Semaphore(){
68 #ifdef WIN32
69  CloseHandle(_sem);
70 #else
71  sem_destroy(&_sem);
72 #endif
73  }
74 
79  bool wait() const {
80 #ifdef WIN32
81  return WaitForSingleObject(static_cast< HANDLE >(_sem),INFINITE) == 0x00000000L;
82 #else
83  return sem_wait(const_cast<sem_t*>(&_sem)) == 0;
84 #endif
85  }
86 
91  bool post(){
92 #ifdef WIN32
93  return ReleaseSemaphore(static_cast< HANDLE >(_sem),1,0) != 0;
94 #else
95  return sem_post(&_sem) == 0;
96 #endif
97  }
98 
103  int value() const{
104 #ifdef WIN32
105  long value = -1;
106  ReleaseSemaphore(static_cast<const HANDLE>(_sem),0,&value);
107  return value;
108 #else
109  int value = -1;
110  sem_getvalue(const_cast<sem_t*>(&_sem),&value);
111  return value;
112 #endif
113  }
114 
119  void reset( int in_init = 0 ){
120 #ifdef WIN32
121  CloseHandle(_sem);
122  _sem = CreateSemaphore(0,in_init,LMAXIMUMCOUNT,0);
123 #else
124  sem_destroy(&_sem);
125  sem_init(&_sem,0,in_init);
126 #endif
127  }
128  };
129 }
int value() const
get current value
Definition: Semaphore.hpp:103
Semaphore(int in_init=0)
Constructor.
Definition: Semaphore.hpp:35
different physics engine has different winding order.
Definition: EventBinding.h:32
bool wait() const
Wait until the semaphore is called by another thread.
Definition: Semaphore.hpp:79
void operator=(const Semaphore &in_sem)
Copy method.
Definition: Semaphore.hpp:60
Semaphore(const Semaphore &in_sem)
Copy constructor.
Definition: Semaphore.hpp:47
void reset(int in_init=0)
release current semaphore and create a new one
Definition: Semaphore.hpp:119
bool post()
post a token
Definition: Semaphore.hpp:91
cross platform condition variable.
Definition: Semaphore.hpp:21
Definition: enum_maker.hpp:46
virtual ~Semaphore()
destroy semaphore
Definition: Semaphore.hpp:67
sem_t _sem
Posix semaphore.
Definition: Semaphore.hpp:27