Fix signal handling so it keeps running after getting SIGHUP.
diff --git a/scaffold.go b/scaffold.go
index 15b5af7..629fcf8 100644
--- a/scaffold.go
+++ b/scaffold.go
@@ -4,6 +4,7 @@
"crypto/tls"
"errors"
"fmt"
+ "io"
"net"
"net/http"
"os"
@@ -433,15 +434,26 @@
will cause the program to be marked down, and "SignalCaught" will be returned
by the "Listen" method. SIGHUP ("kill -1" or "kill -HUP") will cause the
stack trace of all the threads to be printed to stderr, just like a Java program.
+This method is very simplistic -- it starts listening every time that
+you call it. So a program should only call it once.
*/
func (s *HTTPScaffold) CatchSignals() {
- sigChan := make(chan os.Signal, 1)
+ s.CatchSignalsTo(os.Stderr)
+}
+
+/*
+CatchSignalsTo is just like CatchSignals, but it captures the stack trace
+to the specified writer rather than to os.Stderr. This is handy for testing.
+*/
+func (s *HTTPScaffold) CatchSignalsTo(out io.Writer) {
+ sigChan := make(chan os.Signal, 10)
signal.Notify(sigChan, syscall.SIGINT)
signal.Notify(sigChan, syscall.SIGTERM)
signal.Notify(sigChan, syscall.SIGHUP)
go func() {
for {
+ fmt.Printf("Listening for signals\n")
sig := <-sigChan
switch sig {
case syscall.SIGINT, syscall.SIGTERM:
@@ -449,24 +461,27 @@
signal.Reset()
return
case syscall.SIGHUP:
- dumpStack()
+ dumpStack(out)
}
}
}()
}
-func dumpStack() {
- stackSize := 32767
+func dumpStack(out io.Writer) {
+ fmt.Printf("Got HUP\n")
+ stackSize := 4096
stackBuf := make([]byte, stackSize)
var w int
- for w < stackSize {
+ for {
w = runtime.Stack(stackBuf, true)
if w == stackSize {
stackSize *= 2
stackBuf = make([]byte, stackSize)
+ } else {
+ break
}
}
- fmt.Fprint(os.Stderr, string(stackBuf[:w]))
+ fmt.Fprint(out, string(stackBuf[:w]))
}