When suspending a thread if the timeout was very short or

the system call got interrupted and the absolute timeout is
converted to a relative timeout, it may happen that we get a
negative number. In such a case, simply set the timeout to
zero so that if the event that the thread wants to wait for has
happened it can still return successfully, but if it hasn't
happened then the thread doesn't suspend indefinitely. This should
fix certain applications (including mozilla) that seem to hang
indefinitely sometimes.

Noticed and debugged by: Morten Johansen <root@morten-johansen.net>
This commit is contained in:
mtm 2004-01-29 09:44:36 +00:00
parent ab3e3b27cb
commit f488df6c99

View File

@ -137,6 +137,17 @@ _thread_suspend(pthread_t pthread, const struct timespec *abstime)
remaining = *abstime;
timespecsub(&remaining, &now);
ts = &remaining;
/*
* If the absolute timeout has already passed set the
* relative timeout to 0 sec. so that sigtimedwait()
* returns immediately.
* NOTE: timespecsub() makes sure the tv_nsec member >= 0.
*/
if (ts->tv_sec < 0) {
ts->tv_sec = 0;
ts->tv_nsec = 0;
}
} else
ts = NULL;