aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ethereal/main.go27
-rw-r--r--ethereal/ui/gui.go16
-rw-r--r--ethereum/main.go4
-rw-r--r--utils/cmd.go13
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) {