Update of /cvsroot/sbcl/sbcl/src/code
In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv637/src/code
Modified Files:
unix.lisp
Log Message:
1.0.42.54: #!+darwin the nanosleep hack
* At least on linux the the output value of nanosleep can drift
up a little bit compared to the input. Combined with the hack
for the darwin nanosleep problems, this caused early exits
from SLEEP.
Index: unix.lisp
===================================================================
RCS file: /cvsroot/sbcl/sbcl/src/code/unix.lisp,v
retrieving revision 1.111
retrieving revision 1.112
diff -u -d -r1.111 -r1.112
--- unix.lisp 21 Sep 2010 13:10:39 -0000 1.111
+++ unix.lisp 27 Sep 2010 23:42:12 -0000 1.112
@@ -926,9 +926,16 @@
;; return with EINT and (unsigned)-1 seconds in the
;; remainder timespec, which would cause us to enter
;; nanosleep again for ~136 years. So, we check that the
- ;; remainder time is actually decreasing. Since the cost
- ;; of this check is neglible, do it on all platforms.
- ;; http://osdir.com/ml/darwin-kernel/2010-03/msg00007.html
+ ;; remainder time is actually decreasing.
+ ;;
+ ;; It would be neat to do this bit of defensive
+ ;; programming on all platforms, but unfortunately on
+ ;; Linux, REM can be a little higher than REQ if the
+ ;; nanosleep() call is interrupted quickly enough,
+ ;; probably due to the request being rounded up to the
+ ;; nearest HZ. This would cause the sleep to return way
+ ;; too early.
+ #!+darwin
(let ((rem-sec (slot rem 'tv-sec))
(rem-nsec (slot rem 'tv-nsec)))
(when (or (> secs rem-sec)