- 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
This commit is contained in:
zelig 2014-06-26 16:26:14 +01:00
parent c0a05fcf89
commit 21d86ca486
4 changed files with 47 additions and 13 deletions

View File

@ -3,17 +3,24 @@ package main
import ( import (
"github.com/ethereum/go-ethereum/ethereal/ui" "github.com/ethereum/go-ethereum/ethereal/ui"
"github.com/ethereum/go-ethereum/utils" "github.com/ethereum/go-ethereum/utils"
"github.com/ethereum/eth-go/ethlog"
"github.com/go-qml/qml" "github.com/go-qml/qml"
"runtime" "runtime"
"os"
) )
func main() { func main() {
runtime.GOMAXPROCS(runtime.NumCPU()) runtime.GOMAXPROCS(runtime.NumCPU())
utils.HandleInterrupt()
qml.Init(nil) 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 // precedence: code-internal flag default < config file < environment variables < command line
Init() // parsing command line Init() // parsing command line
utils.InitConfig(ConfigFile, Datadir, Identifier, "ETH") utils.InitConfig(ConfigFile, Datadir, Identifier, "ETH")
@ -36,9 +43,19 @@ func main() {
} }
gui := ethui.New(ethereum, LogLevel) gui := ethui.New(ethereum, LogLevel)
gui.Start(AssetPath)
utils.RegisterInterrupt(func(os.Signal) {
gui.Stop()
})
utils.StartEthereum(ethereum, UseSeed) 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()
} }

View File

@ -37,6 +37,7 @@ type Gui struct {
pub *ethpub.PEthereum pub *ethpub.PEthereum
logLevel ethlog.LogLevel logLevel ethlog.LogLevel
open bool
} }
// Create GUI, but doesn't start it // Create GUI, but doesn't start it
@ -56,7 +57,7 @@ func New(ethereum *eth.Ethereum, logLevel int) *Gui {
pub := ethpub.NewPEthereum(ethereum) 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) { func (gui *Gui) Start(assetPath string) {
@ -104,7 +105,7 @@ func (gui *Gui) Start(assetPath string) {
} }
logger.Infoln("Starting GUI") logger.Infoln("Starting GUI")
gui.open = true
win.Show() win.Show()
// only add the gui logger after window is shown otherwise slider wont be shown // only add the gui logger after window is shown otherwise slider wont be shown
if addlog { if addlog {
@ -113,7 +114,16 @@ func (gui *Gui) Start(assetPath string) {
win.Wait() win.Wait()
// need to silence gui logger after window closed otherwise logsystem hangs // need to silence gui logger after window closed otherwise logsystem hangs
gui.SetLogLevel(ethlog.Silence) 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() { func (gui *Gui) ToggleMining() {

View File

@ -46,4 +46,8 @@ func main() {
} }
utils.StartEthereum(ethereum, UseSeed) utils.StartEthereum(ethereum, UseSeed)
// this blocks the thread
ethereum.WaitForShutdown()
ethlog.Flush()
} }

View File

@ -32,11 +32,15 @@ func HandleInterrupt() {
signal.Notify(c, os.Interrupt) signal.Notify(c, os.Interrupt)
for sig := range c { for sig := range c {
logger.Errorf("Shutting down (%v) ... \n", sig) logger.Errorf("Shutting down (%v) ... \n", sig)
RunInterruptCallbacks(sig)
}
}()
}
func RunInterruptCallbacks(sig os.Signal) {
for _, cb := range interruptCallbacks { for _, cb := range interruptCallbacks {
cb(sig) cb(sig)
} }
}
}()
} }
func AbsolutePath(Datadir string, filename string) string { func AbsolutePath(Datadir string, filename string) string {
@ -94,6 +98,7 @@ func InitLogging (Datadir string, LogFile string, LogLevel int, DebugFile string
} }
func InitConfig(ConfigFile string, Datadir string, Identifier string, EnvPrefix string) { func InitConfig(ConfigFile string, Datadir string, Identifier string, EnvPrefix string) {
InitDataDir(Datadir)
ethutil.ReadConfig(ConfigFile, Datadir, Identifier, EnvPrefix) ethutil.ReadConfig(ConfigFile, Datadir, Identifier, EnvPrefix)
ethutil.Config.Set("rpcport", "700") ethutil.Config.Set("rpcport", "700")
} }
@ -120,8 +125,6 @@ func StartEthereum(ethereum *eth.Ethereum, UseSeed bool) {
ethereum.Stop() ethereum.Stop()
ethlog.Flush() ethlog.Flush()
}) })
// this blocks the thread
ethereum.WaitForShutdown()
} }
func ShowGenesis(ethereum *eth.Ethereum) { func ShowGenesis(ethereum *eth.Ethereum) {