Opened 12 years ago
Closed 12 years ago
#1067 closed defect (invalid)
Variable set! in signal handler is optimised away in other code.
| Reported by: | andyjpb | Owned by: | |
|---|---|---|---|
| Priority: | major | Milestone: | 4.9.0 |
| Component: | unknown | Version: | 4.8.x |
| Keywords: | Cc: | ||
| Estimated difficulty: |
Description
In a module I have
(define keep-going "yes") ; #t seems to cause the (if keep-going ...) check to get optimised away.
...
(define (shutdown #!optional signum)
(debug! "Proclaim got signal ~A: shutting down..." signum)
(set! keep-going #f))
(define (handler)
(set-signal-handler! signal/term shutdown)
...
(if keep-going
(begin
...
(loop)))
...
)
In my main program I (use ...) my module and then call handler which loops "forever".
As per the comment, if I use #t for the sentinel value of keep-going then the signal handler is unable to set! it to #f so the loop is never broken. If I use "yes" then it seems to work as expected.
I can't use a parameter because I don't know which thread the signal will be received in and the loop runs in the primordial thread.
Change History (4)
comment:1 Changed 12 years ago by
comment:2 Changed 12 years ago by
| Milestone: | someday → 4.9.0 |
|---|
We should at least take a look at this one before release
comment:3 Changed 12 years ago by
Here's a self contained program that should reproduce the behaviour, but I can't currently get it to work.
; csc -s -O2 -d1 t.scm -j t -o t.so ; csc -s t.import.scm -O2 -d0 -o t.import.so ; echo "(use t)(handler)" > tl.scm ; csc tl.scm ; ./tl ; killall -TERM tl (module t (handler) (import chicken scheme) (use posix srfi-18) (define keep-going #t) ; #t seems to cause the (if keep-going ...) check to get optimised away. (define (shutdown #!optional signum) (printf "Proclaim got signal ~A: shutting down...\n" signum) (set! keep-going #f)) (define (handler) (set-signal-handler! signal/term shutdown) ;(thread-start! ; (make-thread ; (lambda () (let loop () (printf "Still going...\n") (thread-sleep! 1) (if keep-going (loop)));))) ))
comment:4 Changed 12 years ago by
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
Now that it comes to test a fix, I can't seem to reproduce this at all. :-(
For now I'll mark it as INVALID but I'll keep a look out for it in the future.

Everything is in the same module: