Update .gitreview file
[src/xds/xds-cli.git] / signals.go
1 package main
2
3 import (
4         "fmt"
5         "os"
6         "os/signal"
7 )
8
9 // OnSignalCB callback type for signal
10 type OnSignalCB func(sig os.Signal)
11
12 // MonSignals .
13 type MonSignals struct {
14         callback          map[string][]OnSignalCB
15         registeredSignals []os.Signal
16 }
17
18 var monSig MonSignals
19
20 // MonitorSignals Routine used to monitor signals (eg. SIGINT, SIGTERM, ...)
21 func MonitorSignals() {
22
23         monSig.callback = make(map[string][]OnSignalCB)
24         monSig.registeredSignals = GetRegisteredSignals()
25
26         sigs := make(chan os.Signal, 1)
27         signal.Notify(sigs, monSig.registeredSignals...)
28
29         go func() {
30                 for {
31                         sig := <-sigs
32                         Log.Debugf("Detect signal %v", sig)
33                         if cbArr, exist := monSig.callback[sig.String()]; exist {
34                                 for _, cb := range cbArr {
35                                         cb(sig)
36                                 }
37                         }
38                 }
39         }()
40 }
41
42 // isSupportSignal Check if a signal is supported or not
43 func isSupportSignal(sig os.Signal) bool {
44         for _, s := range monSig.registeredSignals {
45                 if s == sig {
46                         return true
47                 }
48         }
49         return false
50 }
51
52 // OnSignal Register a callback for a specified signal
53 func OnSignal(sig os.Signal, fCB OnSignalCB) error {
54         if !isSupportSignal(sig) {
55                 return fmt.Errorf("unsupported signal %v", sig)
56         }
57         sigStr := sig.String()
58         monSig.callback[sigStr] = append(monSig.callback[sigStr], fCB)
59         return nil
60 }
61
62 // OnSignals Register a callback for any signals
63 func OnSignals(fCB OnSignalCB) error {
64         for _, s := range monSig.registeredSignals {
65                 if err := OnSignal(s, fCB); err != nil {
66                         return err
67                 }
68         }
69         return nil
70 }