4444
4545 isChild bool
4646 socketOrder string
47+
48+ hookableSignals []os.Signal
4749)
4850
4951func init () {
@@ -60,6 +62,15 @@ func init() {
6062 // after a restart the parent will finish ongoing requests before
6163 // shutting down. set to a negative value to disable
6264 DefaultHammerTime = 60 * time .Second
65+
66+ hookableSignals = []os.Signal {
67+ syscall .SIGHUP ,
68+ syscall .SIGUSR1 ,
69+ syscall .SIGUSR2 ,
70+ syscall .SIGINT ,
71+ syscall .SIGTERM ,
72+ syscall .SIGTSTP ,
73+ }
6374}
6475
6576type endlessServer struct {
@@ -304,12 +315,7 @@ func (srv *endlessServer) handleSignals() {
304315
305316 signal .Notify (
306317 srv .sigChan ,
307- syscall .SIGHUP ,
308- syscall .SIGUSR1 ,
309- syscall .SIGUSR2 ,
310- syscall .SIGINT ,
311- syscall .SIGTERM ,
312- syscall .SIGTSTP ,
318+ hookableSignals ... ,
313319 )
314320
315321 pid := syscall .Getpid ()
@@ -412,7 +418,7 @@ func (srv *endlessServer) hammerTime(d time.Duration) {
412418func (srv * endlessServer ) fork () (err error ) {
413419 // only one server isntance should fork!
414420 if runningServersForked {
415- return errors .New ("another fork is running " )
421+ return errors .New ("Another process already forked. Ignoring this one. " )
416422 }
417423 runningServerReg .Lock ()
418424 defer runningServerReg .Unlock ()
@@ -531,3 +537,23 @@ func (w endlessConn) Close() error {
531537 }
532538 return err
533539}
540+
541+ /*
542+ RegisterSignalHook registers a function to be run PRE_SIGNAL or POST_SIGNAL for
543+ a given signal. PRE or POST in this case means before or after the signal
544+ related code endless itself runs
545+ */
546+ func (srv * endlessServer ) RegisterSignalHook (prePost int , sig os.Signal , f func ()) (err error ) {
547+ if prePost != PRE_SIGNAL && prePost != POST_SIGNAL {
548+ err = fmt .Errorf ("Cannot use %v for prePost arg. Must be endless.PRE_SIGNAL or endless.POST_SIGNAL." )
549+ return
550+ }
551+ for _ , s := range hookableSignals {
552+ if s == sig {
553+ srv.SignalHooks [prePost ][sig ] = append (srv.SignalHooks [prePost ][sig ], f )
554+ return
555+ }
556+ }
557+ err = fmt .Errorf ("Signal %v is not supported." )
558+ return
559+ }
0 commit comments