diff --git a/scsh/procobj.scm b/scsh/procobj.scm index 9e9e1bf..95943b3 100644 --- a/scsh/procobj.scm +++ b/scsh/procobj.scm @@ -172,14 +172,13 @@ (define (with-autoreaping thunk) (set! *autoreap-policy* 'early) - (spawn (lambda () - (let lp ((event (most-recent-sigevent))) - (let ((next-event (next-sigevent event interrupt/chld))) - (*sigchld-handler*) - (lp next-event)))) - '*sigchld-handler*-thread) - (thunk)) - + (run-as-long-as + (lambda () + (let lp ((event (most-recent-sigevent))) + (let ((next-event (next-sigevent event interrupt/chld))) + (*sigchld-handler*) + (lp next-event)))) + thunk)) ;;; This list contains pids whose proc-obj were gc'd before they died ;;; We try to reap them after every gc and maybe on every SIGCHLD diff --git a/scsh/sighandlers.scm b/scsh/sighandlers.scm index e99c1bd..ddab93b 100644 --- a/scsh/sighandlers.scm +++ b/scsh/sighandlers.scm @@ -188,9 +188,7 @@ (structure-ref threads-internal event-type) interrupt) (enum interrupt keyboard)))))) - (spawn deliver-interrupts - 'deliver-interrupts) - (thunk)) + (run-as-long-as deliver-interrupts thunk)) (define (deliver-interrupts) (let lp ((last ((structure-ref scsh-events most-recent-sigevent)))) diff --git a/scsh/utilities.scm b/scsh/utilities.scm index 2bb6ad8..9eb4db7 100644 --- a/scsh/utilities.scm +++ b/scsh/utilities.scm @@ -267,3 +267,24 @@ (define-record-resumer :reinitializer (lambda (r) ((reinitializer-thunk r)))) + +;-------------- +; Run thunk1 until thunk2 escapes +; This is *extremly* low level +; Don't use unless you know what you are doing + +(define (run-as-long-as thunk1 thunk2) + (let ((thread (make-placeholder))) + (spawn (lambda () + (placeholder-set! thread (current-thread)) + (thunk1))) + (dynamic-wind + (lambda () #t) + thunk2 + (lambda () + (remove-thread-from-queues! (placeholder-value thread)) + (kill-thread! (placeholder-value thread)) + (make-ready (placeholder-value thread)))))) + + + \ No newline at end of file