From 21d86ca486a88c936a1fe71f78d76c78df36a7eb Mon Sep 17 00:00:00 2001 From: zelig Date: Thu, 26 Jun 2014 16:26:14 +0100 Subject: [PATCH] gui stop - introduce gui.Stop() - remember state with open - stopping ethereum stack is not gui concern, moved to main - stopping mining, gui and ethereum handled via interrupt callbacks - ^C triggers exactly the same behaviour as quit via menu --- ethereal/main.go | 27 ++++++++++++++++++++++----- ethereal/ui/gui.go | 16 +++++++++++++--- ethereum/main.go | 4 ++++ utils/cmd.go | 13 ++++++++----- 4 files changed, 47 insertions(+), 13 deletions(-) diff --git a/ethereal/main.go b/ethereal/main.go index 5dfab4c45..cfd85afe7 100644 --- a/ethereal/main.go +++ b/ethereal/main.go @@ -3,17 +3,24 @@ package main import ( "github.com/ethereum/go-ethereum/ethereal/ui" "github.com/ethereum/go-ethereum/utils" + "github.com/ethereum/eth-go/ethlog" "github.com/go-qml/qml" "runtime" + "os" ) func main() { runtime.GOMAXPROCS(runtime.NumCPU()) - utils.HandleInterrupt() - qml.Init(nil) + var interrupted = false + utils.RegisterInterrupt(func(os.Signal) { + interrupted = true + }) + + utils.HandleInterrupt() + // precedence: code-internal flag default < config file < environment variables < command line Init() // parsing command line utils.InitConfig(ConfigFile, Datadir, Identifier, "ETH") @@ -36,9 +43,19 @@ func main() { } gui := ethui.New(ethereum, LogLevel) - gui.Start(AssetPath) + utils.RegisterInterrupt(func(os.Signal) { + gui.Stop() + }) utils.StartEthereum(ethereum, UseSeed) - - + // gui blocks the main thread + gui.Start(AssetPath) + // we need to run the interrupt callbacks in case gui is closed + // this skips if we got here by actual interrupt stopping the GUI + if !interrupted { + utils.RunInterruptCallbacks(os.Interrupt) + } + // this blocks the thread + ethereum.WaitForShutdown() + ethlog.Flush() } diff --git a/ethereal/ui/gui.go b/ethereal/ui/gui.go index 8845f6af3..938037b90 100644 --- a/ethereal/ui/gui.go +++ b/ethereal/ui/gui.go @@ -37,6 +37,7 @@ type Gui struct { pub *ethpub.PEthereum logLevel ethlog.LogLevel + open bool } // Create GUI, but doesn't start it @@ -56,7 +57,7 @@ func New(ethereum *eth.Ethereum, logLevel int) *Gui { pub := ethpub.NewPEthereum(ethereum) - return &Gui{eth: ethereum, lib: lib, txDb: db, addr: addr, pub: pub, logLevel: ethlog.LogLevel(logLevel)} + return &Gui{eth: ethereum, lib: lib, txDb: db, addr: addr, pub: pub, logLevel: ethlog.LogLevel(logLevel), open: false} } func (gui *Gui) Start(assetPath string) { @@ -104,7 +105,7 @@ func (gui *Gui) Start(assetPath string) { } logger.Infoln("Starting GUI") - + gui.open = true win.Show() // only add the gui logger after window is shown otherwise slider wont be shown if addlog { @@ -113,7 +114,16 @@ func (gui *Gui) Start(assetPath string) { win.Wait() // need to silence gui logger after window closed otherwise logsystem hangs gui.SetLogLevel(ethlog.Silence) - gui.eth.Stop() + gui.open = false +} + +func (gui *Gui) Stop() { + if gui.open { + gui.SetLogLevel(ethlog.Silence) + gui.open = false + gui.win.Hide() + } + logger.Infoln("Stopped") } func (gui *Gui) ToggleMining() { diff --git a/ethereum/main.go b/ethereum/main.go index 800486e56..93b2b47d3 100644 --- a/ethereum/main.go +++ b/ethereum/main.go @@ -46,4 +46,8 @@ func main() { } utils.StartEthereum(ethereum, UseSeed) + + // this blocks the thread + ethereum.WaitForShutdown() + ethlog.Flush() } diff --git a/utils/cmd.go b/utils/cmd.go index da05c6d83..db5ec5b48 100644 --- a/utils/cmd.go +++ b/utils/cmd.go @@ -32,13 +32,17 @@ func HandleInterrupt() { signal.Notify(c, os.Interrupt) for sig := range c { logger.Errorf("Shutting down (%v) ... \n", sig) - for _, cb := range interruptCallbacks { - cb(sig) - } + RunInterruptCallbacks(sig) } }() } +func RunInterruptCallbacks(sig os.Signal) { + for _, cb := range interruptCallbacks { + cb(sig) + } +} + func AbsolutePath(Datadir string, filename string) string { if path.IsAbs(filename) { return filename @@ -94,6 +98,7 @@ func InitLogging (Datadir string, LogFile string, LogLevel int, DebugFile string } func InitConfig(ConfigFile string, Datadir string, Identifier string, EnvPrefix string) { + InitDataDir(Datadir) ethutil.ReadConfig(ConfigFile, Datadir, Identifier, EnvPrefix) ethutil.Config.Set("rpcport", "700") } @@ -120,8 +125,6 @@ func StartEthereum(ethereum *eth.Ethereum, UseSeed bool) { ethereum.Stop() ethlog.Flush() }) - // this blocks the thread - ethereum.WaitForShutdown() } func ShowGenesis(ethereum *eth.Ethereum) {