scsh-users
[Top] [All Lists]

Re: Signal/Interrupt Question

To: RT Happe <rthappe@mathematik.uni-freiburg.de>
Subject: Re: Signal/Interrupt Question
From: Martin Gasbichler <gasbichl@informatik.uni-tuebingen.de>
Date: Thu, 18 Jul 2002 09:47:19 +0200
Cc: <scsh@zurich.ai.mit.edu>
Sender: gasbichl@informatik.uni-tuebingen.de
>>>>> "RT" == RT Happe <rthappe@mathematik.uni-freiburg.de> writes:

RT> The discussion of 3.9.0.1 Interrupt Handlers in the Scsh manual suggests
RT> to me that when the scshvm receives e.g. a TSTP signal, it delivers the
RT> corresponding interrupt to the running Scheme code that may choose to
RT> block or handle it.  Concretely, I would have thought that the script
RT> below reads and prints a Scheme datum before it may yield to suspension.
RT> -- It doesn't (as of scsh-0.6.2 / Linux kernel 2.4.10).  So what's the
RT> right way to protect code from catchable Unix signals?

RT> rthappe


RT> #!/tmp/bin/scsh \
RT> -o low-interrupt -s
RT> !#
RT> ; the struct LOW-INTERRUPT serves the proc REMOVE-INTERRUPT

RT> (with-enabled-interrupts
RT>  (remove-interrupt interrupt/tstp (enabled-interrupts))
RT>  (display (read))
RT>  (newline))


Index: sighandlers.scm
===================================================================
RCS file: /cvsroot/scsh/scsh-0.6/scsh/sighandlers.scm,v
retrieving revision 1.24
diff -u -c -r1.24 sighandlers.scm
*** sighandlers.scm     26 Jun 2002 10:02:10 -0000      1.24
--- sighandlers.scm     18 Jul 2002 07:45:04 -0000
***************
*** 196,204 ****
  
  (define (deliver-interrupts)
    (let lp ((last ((structure-ref sigevents most-recent-sigevent))))
!     (let ((event ((structure-ref sigevents next-sigevent-set)
!                 last full-interrupt-set)))
!       (call-interrupt-handler ((structure-ref sigevents sigevent-type) event))
        (lp event))))
      
  ;;; I am ashamed to say the 33 below is completely bogus.
--- 196,206 ----
  
  (define (deliver-interrupts)
    (let lp ((last ((structure-ref sigevents most-recent-sigevent))))
!     (let* ((event ((structure-ref sigevents next-sigevent-set)
!                  last full-interrupt-set))
!          (interrupt ((structure-ref sigevents sigevent-type) event)))
!       (if (interrupt-enabled? interrupt (enabled-interrupts))
!         (call-interrupt-handler interrupt))
        (lp event))))
      
  ;;; I am ashamed to say the 33 below is completely bogus.


--
Martin ducks and runs away

<Prev in Thread] Current Thread [Next in Thread>