thread/PosixCond: fix timed_wait
pthread_cond_timedwait() in PosixCond.hxx:timed_wait(PosixMutex...) returns EINVAL, if ts.tv_nsec >= 1E9. In this case, it returns to early. Find attached a patch which fixes this. I chose a compare-subtraction method to keep ts.tv_nsec below 1E9. Another option would be ts.tv_sec += ts.tv_nsec / 1000000000; ts.tv_nsec %= 1000000000; But I guess this takes more time on some ARM processors, which don't support hardware division.
This commit is contained in:
parent
1e17d5b1cc
commit
8bbfb5cda1
@ -79,6 +79,11 @@ public:
|
||||
struct timespec ts;
|
||||
ts.tv_sec = now.tv_sec + timeout_ms / 1000;
|
||||
ts.tv_nsec = (now.tv_usec + (timeout_ms % 1000) * 1000) * 1000;
|
||||
// Keep tv_nsec < 1E9 to prevent return of EINVAL
|
||||
if (ts.tv_nsec >= 1000000000) {
|
||||
ts.tv_nsec -= 1000000000;
|
||||
ts.tv_sec++;
|
||||
}
|
||||
|
||||
return pthread_cond_timedwait(&cond, &mutex.mutex, &ts) == 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user