time_t time(time_t *timer) { NLtime t; nlTime(&t); *timer = t.seconds; return *timer; }
NL_EXP NLboolean NL_APIENTRY nlCondWait(NLcond *cond, NLint timeout) { if(cond == NULL) { nlSetError(NL_NULL_POINTER); return NL_FALSE; } if(*cond == NULL) { nlSetError(NL_NULL_POINTER); return NL_FALSE; } if(timeout <= 0) { NLcond cv = *cond; #ifdef NL_WIN_THREADS DWORD result; result = WaitForMultipleObjects (2,cv->events_, FALSE, INFINITE); if(result == WAIT_FAILED) { nlSetError(NL_SYSTEM_ERROR); return NL_FALSE; } #else int result = 0; (void)pthread_mutex_lock((pthread_mutex_t *)&cv->mutex); result = pthread_cond_wait((pthread_cond_t *)&cv->cond, (pthread_mutex_t *)&cv->mutex); if(result != 0) { #ifdef WINDOWS_APP SetLastError((DWORD)result); #endif nlSetError(NL_SYSTEM_ERROR); return NL_FALSE; } (void)pthread_mutex_unlock((pthread_mutex_t *)&cv->mutex); #endif } else { NLcond cv = *cond; #ifdef NL_WIN_THREADS DWORD result; result = WaitForMultipleObjects (2, cv->events_, FALSE, (DWORD)timeout); if(result == WAIT_FAILED) { nlSetError(NL_SYSTEM_ERROR); return NL_FALSE; } else if(result == WAIT_TIMEOUT) { nlSetError(NL_TIMED_OUT); return NL_FALSE; } } #else int result = 0; struct timespec tv; NLtime t; NLlong ms; /* convert timeout to an absolute time */ (void)nlTime(&t); ms = t.mseconds + timeout; tv.tv_sec = t.seconds + (ms / 1000); tv.tv_nsec = (ms % 1000) * 1000; (void)pthread_mutex_lock((pthread_mutex_t *)&cv->mutex); result = pthread_cond_timedwait((pthread_cond_t *)&cv->cond, (pthread_mutex_t *)&cv->mutex, &tv); if(result == ETIMEDOUT) { nlSetError(NL_TIMED_OUT); (void)pthread_mutex_unlock((pthread_mutex_t *)&cv->mutex); return NL_FALSE; } else if(result != 0) { #ifdef WINDOWS_APP SetLastError((DWORD)result); #endif nlSetError(NL_SYSTEM_ERROR); return NL_FALSE; } (void)pthread_mutex_unlock((pthread_mutex_t *)&cv->mutex); }