summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authormtm <mtm@FreeBSD.org>2004-01-29 09:44:36 +0000
committermtm <mtm@FreeBSD.org>2004-01-29 09:44:36 +0000
commitf488df6c994e9b1a8827ed7d4188574f09c815fb (patch)
treead5b9b25ae6d1419d325b325932ee757d75c1cd6 /lib
parentab3e3b27cbf1f29151265ba6c9c730a5a0e58782 (diff)
downloadFreeBSD-src-f488df6c994e9b1a8827ed7d4188574f09c815fb.zip
FreeBSD-src-f488df6c994e9b1a8827ed7d4188574f09c815fb.tar.gz
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>
Diffstat (limited to 'lib')
-rw-r--r--lib/libthr/thread/thr_kern.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/lib/libthr/thread/thr_kern.c b/lib/libthr/thread/thr_kern.c
index 3584246..1073ffd 100644
--- a/lib/libthr/thread/thr_kern.c
+++ b/lib/libthr/thread/thr_kern.c
@@ -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;
OpenPOWER on IntegriCloud