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>
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