aboutsummaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorzelig <viktor.tron@gmail.com>2014-06-26 17:47:45 +0800
committerzelig <viktor.tron@gmail.com>2014-06-26 17:47:45 +0800
commit2f96652bb408e65c205317403d749ba9a395c6bb (patch)
tree401b515d2a1d1d668ed692c8a39788f06ebc2b73 /utils
parent9a06efd0809c370451c5e85ce4688104cd5df461 (diff)
downloaddexon-2f96652bb408e65c205317403d749ba9a395c6bb.tar.gz
dexon-2f96652bb408e65c205317403d749ba9a395c6bb.tar.zst
dexon-2f96652bb408e65c205317403d749ba9a395c6bb.zip
interrupt handlers now ordered
Diffstat (limited to 'utils')
-rw-r--r--utils/cmd.go25
1 files changed, 14 insertions, 11 deletions
diff --git a/utils/cmd.go b/utils/cmd.go
index 34716b94a..da05c6d83 100644
--- a/utils/cmd.go
+++ b/utils/cmd.go
@@ -18,16 +18,23 @@ import (
)
var logger = ethlog.NewLogger("CLI")
+var interruptCallbacks = []func(os.Signal){}
-// Register interrupt handlers
+// Register interrupt handlers callbacks
func RegisterInterrupt(cb func(os.Signal)) {
+ interruptCallbacks = append(interruptCallbacks, cb)
+}
+
+// go routine that call interrupt handlers in order of registering
+func HandleInterrupt() {
+ c := make(chan os.Signal, 1)
go func() {
- // Buffered chan of one is enough
- c := make(chan os.Signal, 1)
- // Notify about interrupts for now
signal.Notify(c, os.Interrupt)
for sig := range c {
- cb(sig)
+ logger.Errorf("Shutting down (%v) ... \n", sig)
+ for _, cb := range interruptCallbacks {
+ cb(sig)
+ }
}
}()
}
@@ -109,13 +116,12 @@ func NewEthereum(UseUPnP bool, OutboundPort string, MaxPeer int) *eth.Ethereum {
func StartEthereum(ethereum *eth.Ethereum, UseSeed bool) {
logger.Infof("Starting Ethereum v%s", ethutil.Config.Ver)
ethereum.Start(UseSeed)
- // Wait for shutdown
- ethereum.WaitForShutdown()
RegisterInterrupt(func(sig os.Signal) {
- logger.Errorf("Shutting down (%v) ... \n", sig)
ethereum.Stop()
ethlog.Flush()
})
+ // this blocks the thread
+ ethereum.WaitForShutdown()
}
func ShowGenesis(ethereum *eth.Ethereum) {
@@ -174,9 +180,6 @@ func StartRpc(ethereum *eth.Ethereum, RpcPort int) {
logger.Errorf("Could not start RPC interface (port %v): %v", RpcPort, err)
} else {
go ethereum.RpcServer.Start()
- RegisterInterrupt(func(os.Signal) {
- ethereum.RpcServer.Stop()
- })
}
}