~ chicken-core (chicken-5) b51c3afba8f6faab89e06eb724c8fb6a6d7bce1c
commit b51c3afba8f6faab89e06eb724c8fb6a6d7bce1c Author: felix <felix@y.(none)> AuthorDate: Wed Aug 25 19:25:10 2010 +0200 Commit: felix <felix@y.(none)> CommitDate: Wed Aug 25 19:25:10 2010 +0200 Revert "half-hearted attempt to get more sense into the scheduler" This reverts commit 40d7877ba02b9701479d83b8d9777a37ef0c8980. diff --git a/scheduler.scm b/scheduler.scm index d9546078..15d100be 100644 --- a/scheduler.scm +++ b/scheduler.scm @@ -119,6 +119,7 @@ EOF (begin (##sys#setislot tto 13 #t) ; mark as being unblocked by timeout (##sys#clear-i/o-state-for-thread! tto) + ;;(pp `(CLEARED: ,tto ,@##sys#fd-list) ##sys#standard-error) ;*** (##sys#thread-basic-unblock! tto) (loop (cdr lst)) ) (begin @@ -325,7 +326,7 @@ EOF ;;; `select()'-based blocking: -(define ##sys#fd-list '()) ; ((FD THREAD1 ...) ...) +(define ##sys#fd-list '()) (define ##sys#fdset-select-timeout (foreign-lambda* int ([bool to] [double tm]) @@ -341,9 +342,9 @@ EOF "C_fdset_input = C_fdset_input_2;" "C_fdset_output = C_fdset_output_2;") ) -(foreign-code - "FD_ZERO(&C_fdset_input);" - "FD_ZERO(&C_fdset_output);") +((foreign-lambda* void () + "FD_ZERO(&C_fdset_input);" + "FD_ZERO(&C_fdset_output);") ) (define ##sys#fdset-input-set (foreign-lambda* void ([int fd]) @@ -355,8 +356,6 @@ EOF (define ##sys#fdset-clear (foreign-lambda* void ([int fd]) - "FD_CLR(fd, &C_fdset_input);" - "FD_CLR(fd, &C_fdset_input);" "FD_CLR(fd, &C_fdset_input_2);" "FD_CLR(fd, &C_fdset_output_2);") ) @@ -434,7 +433,9 @@ EOF (if (eq? fd fd2) (let ((ts (##sys#delq t (##sys#slot a 1)))) ; remove from fd-list entry (cond ((null? ts) + ;;(pp `(CLEAR FD: ,fd ,t) ##sys#standard-error) (##sys#fdset-clear fd) ; no more threads waiting for this fd + (##sys#fdset-restore) (##sys#slot lst 1) ) (else (##sys#setslot a 1 ts) ; fd-list entry is list with t removed @@ -492,5 +493,13 @@ EOF (when (or (eq? 'blocked (##sys#slot t 3)) (eq? 'sleeping (##sys#slot r 3))) (##sys#remove-from-timeout-list t) - (##sys#clear-i/o-state-for-thread! t) + (set! ##sys#fd-list + (let loop ([fdl ##sys#fd-list]) + (if (null? fdl) + '() + (let ([a (##sys#slot fdl 0)]) + (cons + (cons (##sys#slot a 0) + (##sys#delq t (##sys#slot a 1)) ) + (loop (##sys#slot fdl 1)) ) ) ) ) ) (##sys#thread-basic-unblock! t) ) )Trap