|
|
|
@ -37,7 +37,7 @@ int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr) |
|
|
|
|
|
|
|
int pthread_cond_destroy(pthread_cond_t *cond) |
|
|
|
{ |
|
|
|
return CloseHandle(cond->semaphore) ? 0 : EINVAL; |
|
|
|
return CloseHandle(cond->semaphore) ? 0 : EINVAL; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -51,6 +51,7 @@ int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) |
|
|
|
return 0 ; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, |
|
|
|
struct timespec *abstime) |
|
|
|
{ |
|
|
|
@ -61,26 +62,26 @@ int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, |
|
|
|
GetSystemTimeAsFileTime(&now.ft); |
|
|
|
|
|
|
|
/* |
|
|
|
- subtract start time from current time(values are in 100ns units |
|
|
|
Calculate time left to abstime |
|
|
|
- subtract start time from current time(values are in 100ns units) |
|
|
|
- convert to millisec by dividing with 10000 |
|
|
|
- subtract time since start from max timeout |
|
|
|
*/ |
|
|
|
timeout= abstime->timeout_msec - (long)((now.i64 - abstime->start.i64) / 10000); |
|
|
|
timeout= (long)((abstime->tv.i64 - now.i64) / 10000); |
|
|
|
|
|
|
|
/* Don't allow the timeout to be negative */ |
|
|
|
if (timeout < 0) |
|
|
|
timeout = 0L; |
|
|
|
timeout= 0L; |
|
|
|
|
|
|
|
/* |
|
|
|
Make sure the calucated time does not exceed original timeout |
|
|
|
Make sure the calucated timeout does not exceed original timeout |
|
|
|
value which could cause "wait for ever" if system time changes |
|
|
|
*/ |
|
|
|
if (timeout > abstime->timeout_msec) |
|
|
|
timeout= abstime->timeout_msec; |
|
|
|
if (timeout > abstime->max_timeout_msec) |
|
|
|
timeout= abstime->max_timeout_msec; |
|
|
|
|
|
|
|
InterlockedIncrement(&cond->waiting); |
|
|
|
LeaveCriticalSection(mutex); |
|
|
|
result=WaitForSingleObject(cond->semaphore,timeout); |
|
|
|
result= WaitForSingleObject(cond->semaphore,timeout); |
|
|
|
InterlockedDecrement(&cond->waiting); |
|
|
|
EnterCriticalSection(mutex); |
|
|
|
|
|
|
|
|