File size: 663 Bytes
0f07ba7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package signals

import (
	"os"
	"os/signal"
	"sync"
	"syscall"
)

var (
	signalHandlers      []func()
	signalHandlersMutex sync.Mutex
	signalHandlersOnce  sync.Once
)

func RegisterGracefulTerminationHandler(fn func()) {
	signalHandlersMutex.Lock()
	defer signalHandlersMutex.Unlock()
	signalHandlers = append(signalHandlers, fn)
}

func init() {
	signalHandlersOnce.Do(func() {
		c := make(chan os.Signal, 1)
		signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
		go signalHandler(c)
	})
}

func signalHandler(c chan os.Signal) {
	<-c

	signalHandlersMutex.Lock()
	defer signalHandlersMutex.Unlock()
	for _, fn := range signalHandlers {
		fn()
	}

	os.Exit(0)
}