~ chicken-core (chicken-5) e1e519311d08fc11a4e76e52ca4c599c6d7f4dad
commit e1e519311d08fc11a4e76e52ca4c599c6d7f4dad Author: felix <felix@call-with-current-continuation.org> AuthorDate: Fri Apr 12 23:05:56 2013 +0200 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Fri Apr 12 23:05:56 2013 +0200 Old code that passes a fixnum timeout value to SRFI-18 functions that later invoke ##sys#thread-block-for-timeout! may cause the timeout-value (after massaging) to be 0. In this case nothing is done and thread will not block. diff --git a/scheduler.scm b/scheduler.scm index ee258fe4..4ef54e6a 100644 --- a/scheduler.scm +++ b/scheduler.scm @@ -292,19 +292,19 @@ EOF (define (##sys#thread-block-for-timeout! t tm) (dbg t " blocks for timeout " tm) - (unless (and (flonum? tm) ; to catch old code that uses fixum timeouts - (fp> tm 0.0)) + (unless (flonum? tm) ; to catch old code that uses fixnum timeouts (panic "##sys#thread-block-for-timeout!: invalid timeout")) - ;; This should really use a balanced tree: - (let loop ([tl ##sys#timeout-list] [prev #f]) - (if (or (null? tl) (fp< tm (caar tl))) - (if prev - (set-cdr! prev (cons (cons tm t) tl)) - (set! ##sys#timeout-list (cons (cons tm t) tl)) ) - (loop (cdr tl) tl) ) ) - (##sys#setslot t 3 'blocked) - (##sys#setislot t 13 #f) - (##sys#setslot t 4 tm) ) + (when (fp> tm 0.0) + ;; This should really use a balanced tree: + (let loop ([tl ##sys#timeout-list] [prev #f]) + (if (or (null? tl) (fp< tm (caar tl))) + (if prev + (set-cdr! prev (cons (cons tm t) tl)) + (set! ##sys#timeout-list (cons (cons tm t) tl)) ) + (loop (cdr tl) tl) ) ) + (##sys#setslot t 3 'blocked) + (##sys#setislot t 13 #f) + (##sys#setslot t 4 tm) ) ) (define (##sys#thread-block-for-termination! t t2) (dbg t " blocks for " t2)Trap