aboutsummaryrefslogtreecommitdiff
path: root/weed/util/signal_handling.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/util/signal_handling.go')
-rw-r--r--weed/util/signal_handling.go25
1 files changed, 20 insertions, 5 deletions
diff --git a/weed/util/signal_handling.go b/weed/util/signal_handling.go
index 7da898738..99447e8be 100644
--- a/weed/util/signal_handling.go
+++ b/weed/util/signal_handling.go
@@ -5,13 +5,16 @@ package util
import (
"os"
"os/signal"
+ "sync"
"syscall"
)
-func OnInterrupt(fn func()) {
- // deal with control+c,etc
- signalChan := make(chan os.Signal, 1)
- // controlling terminal close, daemon not exit
+var signalChan chan os.Signal
+var hooks = make([]func(), 0)
+var hookLock sync.Mutex
+
+func init() {
+ signalChan = make(chan os.Signal, 1)
signal.Ignore(syscall.SIGHUP)
signal.Notify(signalChan,
os.Interrupt,
@@ -24,8 +27,20 @@ func OnInterrupt(fn func()) {
)
go func() {
for _ = range signalChan {
- fn()
+ for _, hook := range hooks {
+ hook()
+ }
os.Exit(0)
}
}()
}
+
+func OnInterrupt(fn func()) {
+ // prevent reentry
+ hookLock.Lock()
+ defer hookLock.Unlock()
+
+ // deal with control+c,etc
+ // controlling terminal close, daemon not exit
+ hooks = append(hooks, fn)
+}