Skip to content

Commit 2973141

Browse files
committed
add convenience function to register functions for signals
1 parent d13ee2c commit 2973141

1 file changed

Lines changed: 33 additions & 7 deletions

File tree

endless.go

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ var (
4444

4545
isChild bool
4646
socketOrder string
47+
48+
hookableSignals []os.Signal
4749
)
4850

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

6576
type 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) {
412418
func (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

Comments
 (0)