~ chicken-core (chicken-5) 2f552362df8a06fbe739d38ac3fafb4ffa1e3efb
commit 2f552362df8a06fbe739d38ac3fafb4ffa1e3efb Author: felix <felix@call-with-current-continuation.org> AuthorDate: Tue Oct 12 11:13:26 2010 -0400 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Tue Oct 12 11:13:26 2010 -0400 remove I/O-unblocked thread from timeout list if timeout slot is set (possible problem pointed out by Joerg Wittenberger) diff --git a/scheduler.scm b/scheduler.scm index 8fa8a77c..c247a29f 100644 --- a/scheduler.scm +++ b/scheduler.scm @@ -236,7 +236,7 @@ EOF (define (##sys#thread-block-for-timeout! t tm) (dbg t " blocks for timeout " tm) - (unless (flonum? tm) + (unless (flonum? tm) ; to catch old code that uses fixum timeouts (panic "##sys#thread-block-for-timeout!: invalid timeout")) ;; This should really use a balanced tree: (let loop ([tl ##sys#timeout-list] [prev #f]) @@ -271,7 +271,7 @@ EOF (for-each (lambda (t2) (dbg " unblocking: " t2) - (##sys#thread-basic-unblock! t2) ) + (##sys#thread-unblock! t2) ) wts) ) ) (##sys#setislot m 3 '()) ) ms) ) ) ) @@ -453,6 +453,8 @@ EOF (panic "##sys#unblock-threads-for-i/o: thread on fd-list has wrong FD")) ((fdset-test inf outf (cdr p)) + (when (##sys#slot t 4) ; also blocked for timeout? + (##sys#remove-from-timeout-list t)) (##sys#thread-basic-unblock! t) (loop2 (cdr threads) keep)) (else (loop2 (cdr threads) (cons t keep)))))))Trap