chiark / gitweb /
stest: If one of our secnets dies, call the test a failure
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 25 Nov 2019 00:01:34 +0000 (00:01 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 30 Dec 2019 13:15:49 +0000 (13:15 +0000)
This involves use of TclX's `signal' facility.  In my tests it was
easy to make Tcl deadlock by doing too much work in the signal
handler.  In particular reaping children is a bad idea.  Also signals
are not blocked during the signal handler so it would have to be
reentrant.

Instead, use `after idle'.  That is quite soon enough for the reap to
run, and in my tests with TclX 8.4 it all works properly.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
stest/common.tcl

index d6250c3b7b14df30ce86ba677d62407d1a1b9054..a58ca6fbd7048d244394bf179a84a65a83850e35 100644 (file)
@@ -217,6 +217,21 @@ proc finish {estatus} {
     exit $estatus
 }
 
+proc reap {} {
+    global pidmap
+    #puts stderr REAPING
+    foreach pid [array names pidmap] {
+       set got [wait -nohang $pid]
+       if {![llength $got]} continue
+       set info $pidmap($pid)
+       unset pidmap($pid)
+       puts stderr "reaped $info: $got"
+       finish 1
+    }
+}
+
+signal -restart trap SIGCHLD { after idle reap }
+
 proc udp-proxy {} {
     global socktmp udpsock
     set u $socktmp/udp