14 #include <sys/types.h> 40 Locker::LOCK_STATUS lock(
unsigned long timeout = 0xFFFFFFFF) {
42 switch (WaitForSingleObject(_lock, timeout==0xFFFFFFF?INFINITE:(DWORD)timeout)) {
54 if (pthread_mutex_lock(&_lock) == 0)
return LOCK_OK;
57 if (timeout == 0xFFFFFFFF){
58 if (pthread_mutex_lock(&_lock) == 0)
return LOCK_OK;
61 else if (timeout == 0) {
62 if (pthread_mutex_trylock(&_lock) == 0)
return LOCK_OK;
68 gettimeofday(&now,NULL);
70 wait_time.tv_sec = timeout/1000 + now.tv_sec;
71 wait_time.tv_nsec = (timeout%1000)*1000000 + now.tv_usec*1000;
73 if (wait_time.tv_nsec >= 1000000000){
75 wait_time.tv_nsec -= 1000000000;
78 #if !defined(__ANDROID__) 80 switch (pthread_mutex_timedlock(&_lock,&wait_time)){
88 struct timeval timenow;
89 struct timespec sleepytime;
91 sleepytime.tv_sec = 0;
92 sleepytime.tv_nsec = 10000000;
94 while (pthread_mutex_trylock (&_lock) == EBUSY) {
95 gettimeofday (&timenow, NULL);
97 if (timenow.tv_sec >= wait_time.tv_sec &&
98 (timenow.tv_usec * 1000) >= wait_time.tv_nsec) {
102 nanosleep (&sleepytime, NULL);
121 pthread_mutex_unlock(&_lock);
126 HANDLE getLockHandle(){
130 pthread_mutex_t *getLockHandle(){
140 _lock = CreateMutex(NULL,FALSE,NULL);
142 pthread_mutex_init(&_lock, NULL);
155 pthread_mutex_destroy(&_lock);
162 pthread_mutex_t _lock;
177 explicit Event(
bool isAutoReset =
true,
bool isSignal =
false)
181 : _is_signalled(isSignal)
182 , _isAutoReset(isAutoReset)
186 _event = CreateEvent(NULL, isAutoReset?FALSE:TRUE, isSignal?TRUE:FALSE, NULL);
188 pthread_mutex_init(&_cond_locker, NULL);
189 pthread_cond_init(&_cond_var, NULL);
197 void set(
bool isSignal = true ){
202 pthread_mutex_lock(&_cond_locker);
204 if ( _is_signalled ==
false ){
205 _is_signalled =
true;
206 pthread_cond_signal(&_cond_var);
208 pthread_mutex_unlock(&_cond_locker);
214 pthread_mutex_lock(&_cond_locker);
215 _is_signalled =
false;
216 pthread_mutex_unlock(&_cond_locker);
221 unsigned long wait(
unsigned long timeout = 0xFFFFFFFF ){
223 switch (WaitForSingleObject(_event, timeout==0xFFFFFFF?INFINITE:(DWORD)timeout)){
229 return EVENT_TIMEOUT;
233 unsigned long ans = EVENT_OK;
234 pthread_mutex_lock( &_cond_locker );
237 if (timeout == 0xFFFFFFFF){
238 pthread_cond_wait(&_cond_var,&_cond_locker);
242 gettimeofday(&now,NULL);
244 wait_time.tv_sec = timeout/1000 + now.tv_sec;
245 wait_time.tv_nsec = (timeout%1000)*1000000ULL + now.tv_usec*1000;
247 if (wait_time.tv_nsec >= 1000000000){
249 wait_time.tv_nsec -= 1000000000;
251 switch (pthread_cond_timedwait(&_cond_var,&_cond_locker,&wait_time)){
268 assert(_is_signalled);
271 _is_signalled =
false;
274 pthread_mutex_unlock( &_cond_locker );
286 pthread_mutex_destroy(&_cond_locker);
287 pthread_cond_destroy(&_cond_var);
294 pthread_cond_t _cond_var;
295 pthread_mutex_t _cond_locker;