14 #include <sys/types.h> 39 Locker::LOCK_STATUS lock(
unsigned long timeout = 0xFFFFFFFF) {
42 switch (WaitForSingleObject(_lock,
43 timeout == 0xFFFFFFF ? INFINITE : (DWORD)timeout)) {
58 if (pthread_mutex_lock(&_lock) == 0) {
65 if (timeout == 0xFFFFFFFF) {
66 if (pthread_mutex_lock(&_lock) == 0) {
72 else if (timeout == 0) {
73 if (pthread_mutex_trylock(&_lock) == 0) {
82 gettimeofday(&now, NULL);
84 wait_time.tv_sec = timeout / 1000 + now.tv_sec;
85 wait_time.tv_nsec = (timeout % 1000) * 1000000 + now.tv_usec * 1000;
87 if (wait_time.tv_nsec >= 1000000000) {
89 wait_time.tv_nsec -= 1000000000;
92 #if !defined(__ANDROID__) 94 switch (pthread_mutex_timedlock(&_lock, &wait_time)) {
103 struct timeval timenow;
104 struct timespec sleepytime;
106 sleepytime.tv_sec = 0;
107 sleepytime.tv_nsec = 10000000;
109 while (pthread_mutex_trylock(&_lock) == EBUSY) {
110 gettimeofday(&timenow, NULL);
112 if (timenow.tv_sec >= wait_time.tv_sec &&
113 (timenow.tv_usec * 1000) >= wait_time.tv_nsec) {
117 nanosleep(&sleepytime, NULL);
137 pthread_mutex_unlock(&_lock);
142 HANDLE getLockHandle() {
146 pthread_mutex_t *getLockHandle() {
156 _lock = CreateMutex(NULL, FALSE, NULL);
158 pthread_mutex_init(&_lock, NULL);
172 pthread_mutex_destroy(&_lock);
179 pthread_mutex_t _lock;
193 explicit Event(
bool isAutoReset =
true,
bool isSignal =
false)
197 : _is_signalled(isSignal)
198 , _isAutoReset(isAutoReset)
202 _event = CreateEvent(NULL, isAutoReset ? FALSE : TRUE, isSignal ? TRUE : FALSE,
205 int ret = pthread_condattr_init(&_cond_cattr);
208 fprintf(stderr,
"Failed to init condattr...\n");
212 ret = pthread_condattr_setclock(&_cond_cattr, CLOCK_MONOTONIC);
213 pthread_mutex_init(&_cond_locker, NULL);
214 ret = pthread_cond_init(&_cond_var, &_cond_cattr);
222 void set(
bool isSignal =
true) {
227 pthread_mutex_lock(&_cond_locker);
229 if (_is_signalled ==
false) {
230 _is_signalled =
true;
231 pthread_cond_signal(&_cond_var);
234 pthread_mutex_unlock(&_cond_locker);
240 pthread_mutex_lock(&_cond_locker);
241 _is_signalled =
false;
242 pthread_mutex_unlock(&_cond_locker);
247 unsigned long wait(
unsigned long timeout = 0xFFFFFFFF) {
250 switch (WaitForSingleObject(_event,
251 timeout == 0xFFFFFFF ? INFINITE : (DWORD)timeout)) {
259 return EVENT_TIMEOUT;
264 unsigned long ans = EVENT_OK;
265 pthread_mutex_lock(&_cond_locker);
267 if (!_is_signalled) {
268 if (timeout == 0xFFFFFFFF) {
269 pthread_cond_wait(&_cond_var, &_cond_locker);
271 struct timespec wait_time;
272 clock_gettime(CLOCK_MONOTONIC, &wait_time);
275 wait_time.tv_sec += timeout / 1000;
276 wait_time.tv_nsec += (timeout % 1000) * 1000000ULL;
278 if (wait_time.tv_nsec >= 1000000000) {
280 wait_time.tv_nsec -= 1000000000;
283 switch (pthread_cond_timedwait(&_cond_var, &_cond_locker, &wait_time)) {
302 assert(_is_signalled);
305 _is_signalled =
false;
309 pthread_mutex_unlock(&_cond_locker);
321 pthread_condattr_destroy(&_cond_cattr);
322 pthread_mutex_destroy(&_cond_locker);
323 pthread_cond_destroy(&_cond_var);
330 pthread_condattr_t _cond_cattr;
331 pthread_cond_t _cond_var;
332 pthread_mutex_t _cond_locker;