~ chicken-core (chicken-5) 44c814b7ce5e711e409d71f34c6188a72c07ad44


commit 44c814b7ce5e711e409d71f34c6188a72c07ad44
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Thu Sep 16 08:59:15 2010 -0400
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Thu Sep 16 08:59:15 2010 -0400

    halt on deadlock; disable print-length-limit in dbg output of scheduler

diff --git a/scheduler.scm b/scheduler.scm
index 4a1594c2..b834b99c 100644
--- a/scheduler.scm
+++ b/scheduler.scm
@@ -83,13 +83,14 @@ EOF
 (include "common-declarations.scm")
 
 (begin
-    (define stderr ##sys#standard-error) ; use default stderr port
-    (define (dbg . args)
+  (define stderr ##sys#standard-error) ; use default stderr port
+  (define (dbg . args)
+    (fluid-let ((print-length-limit #f))
       (for-each
        (lambda (x)
 	 (display x stderr))
        args)
-      (newline stderr)))
+      (newline stderr))))
 
 #;(define-syntax dbg
   (syntax-rules ()
@@ -154,16 +155,15 @@ EOF
 		      (loop (cdr lst)) ) ) ) ) ) )
       ;; Unblock threads blocked by I/O:
       (if eintr
-	  (##sys#force-primordial)
-	  (begin
-	    (unless (null? ##sys#fd-list)
-	      (##sys#unblock-threads-for-i/o) ) ) )
+	  (##sys#force-primordial)	; force it to handle user-interrupt
+	  (unless (null? ##sys#fd-list)
+	    (##sys#unblock-threads-for-i/o) ) )
       ;; Fetch and activate next ready thread:
       (let loop2 ()
 	(let ([nt (remove-from-ready-queue)])
 	  (cond [(not nt) 
 		 (if (and (null? ##sys#timeout-list) (null? ##sys#fd-list))
-		     (##sys#signal-hook #:runtime-error "deadlock")
+		     (##sys#halt "deadlock")
 		     (loop1) ) ]
 		[(eq? (##sys#slot nt 3) 'ready) (switch nt)]
 		[else (loop2)] ) ) ) ) ) )
@@ -421,7 +421,8 @@ EOF
 	      (or rq? to?)
 	      tmo)))
       (dbg n " fds ready")
-      (cond [(eq? -1 n) 
+      (cond [(eq? -1 n)
+	     (dbg "select(2) returned with result -1" )
 	     (##sys#force-primordial)]
 	    [(fx> n 0)
 	     (set! ##sys#fd-list
@@ -432,7 +433,7 @@ EOF
 			    [fd (car a)]
 			    [inf (##core#inline "C_fd_test_input" fd)]
 			    [outf (##core#inline "C_fd_test_output" fd)] )
-		       (dbg "fd " fd " ready: input=" inf ", output=" outf)
+		       (dbg "fd " fd " state: input=" inf ", output=" outf)
 		       (if (or inf outf)
 			   (let loop2 ((threads (cdr a)) (keep '()))
 			     (if (null? threads)
Trap