From 2f96652bb408e65c205317403d749ba9a395c6bb Mon Sep 17 00:00:00 2001 From: zelig Date: Thu, 26 Jun 2014 10:47:45 +0100 Subject: interrupt handlers now ordered --- utils/cmd.go | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'utils') 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() - }) } } -- cgit v1.2.3