aboutsummaryrefslogtreecommitdiffstats
path: root/miner/miner.go
diff options
context:
space:
mode:
authorgary rong <garyrong0905@gmail.com>2018-08-14 23:34:33 +0800
committerPéter Szilágyi <peterke@gmail.com>2018-08-14 23:34:33 +0800
commita1783d169732dd34aa8c7d68f411ce741c1a5015 (patch)
tree14e12ac6077667789c0fe5bd1166fdc534528d73 /miner/miner.go
parente0e0e53401e93733d921338b6d794162c40a7883 (diff)
downloaddexon-a1783d169732dd34aa8c7d68f411ce741c1a5015.tar
dexon-a1783d169732dd34aa8c7d68f411ce741c1a5015.tar.gz
dexon-a1783d169732dd34aa8c7d68f411ce741c1a5015.tar.bz2
dexon-a1783d169732dd34aa8c7d68f411ce741c1a5015.tar.lz
dexon-a1783d169732dd34aa8c7d68f411ce741c1a5015.tar.xz
dexon-a1783d169732dd34aa8c7d68f411ce741c1a5015.tar.zst
dexon-a1783d169732dd34aa8c7d68f411ce741c1a5015.zip
miner: move agent logic to worker (#17351)
* miner: move agent logic to worker * miner: polish * core: persist block before reorg
Diffstat (limited to 'miner/miner.go')
-rw-r--r--miner/miner.go64
1 files changed, 32 insertions, 32 deletions
diff --git a/miner/miner.go b/miner/miner.go
index 4c5717c8a..e350e456e 100644
--- a/miner/miner.go
+++ b/miner/miner.go
@@ -21,14 +21,12 @@ import (
"fmt"
"sync/atomic"
- "github.com/ethereum/go-ethereum/accounts"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/consensus"
"github.com/ethereum/go-ethereum/core"
"github.com/ethereum/go-ethereum/core/state"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/eth/downloader"
- "github.com/ethereum/go-ethereum/ethdb"
"github.com/ethereum/go-ethereum/event"
"github.com/ethereum/go-ethereum/log"
"github.com/ethereum/go-ethereum/params"
@@ -36,10 +34,8 @@ import (
// Backend wraps all methods required for mining.
type Backend interface {
- AccountManager() *accounts.Manager
BlockChain() *core.BlockChain
TxPool() *core.TxPool
- ChainDb() ethdb.Database
}
// Miner creates blocks and searches for proof-of-work values.
@@ -49,6 +45,7 @@ type Miner struct {
coinbase common.Address
eth Backend
engine consensus.Engine
+ exitCh chan struct{}
canStart int32 // can start indicates whether we can start the mining operation
shouldStart int32 // should start indicates whether we should start after sync
@@ -59,10 +56,10 @@ func New(eth Backend, config *params.ChainConfig, mux *event.TypeMux, engine con
eth: eth,
mux: mux,
engine: engine,
+ exitCh: make(chan struct{}),
worker: newWorker(config, engine, eth, mux),
canStart: 1,
}
- miner.Register(NewCpuAgent(eth.BlockChain(), engine))
go miner.update()
return miner
@@ -74,28 +71,35 @@ func New(eth Backend, config *params.ChainConfig, mux *event.TypeMux, engine con
// and halt your mining operation for as long as the DOS continues.
func (self *Miner) update() {
events := self.mux.Subscribe(downloader.StartEvent{}, downloader.DoneEvent{}, downloader.FailedEvent{})
-out:
- for ev := range events.Chan() {
- switch ev.Data.(type) {
- case downloader.StartEvent:
- atomic.StoreInt32(&self.canStart, 0)
- if self.Mining() {
- self.Stop()
- atomic.StoreInt32(&self.shouldStart, 1)
- log.Info("Mining aborted due to sync")
- }
- case downloader.DoneEvent, downloader.FailedEvent:
- shouldStart := atomic.LoadInt32(&self.shouldStart) == 1
+ defer events.Unsubscribe()
- atomic.StoreInt32(&self.canStart, 1)
- atomic.StoreInt32(&self.shouldStart, 0)
- if shouldStart {
- self.Start(self.coinbase)
+ for {
+ select {
+ case ev := <-events.Chan():
+ if ev == nil {
+ return
+ }
+ switch ev.Data.(type) {
+ case downloader.StartEvent:
+ atomic.StoreInt32(&self.canStart, 0)
+ if self.Mining() {
+ self.Stop()
+ atomic.StoreInt32(&self.shouldStart, 1)
+ log.Info("Mining aborted due to sync")
+ }
+ case downloader.DoneEvent, downloader.FailedEvent:
+ shouldStart := atomic.LoadInt32(&self.shouldStart) == 1
+
+ atomic.StoreInt32(&self.canStart, 1)
+ atomic.StoreInt32(&self.shouldStart, 0)
+ if shouldStart {
+ self.Start(self.coinbase)
+ }
+ // stop immediately and ignore all further pending events
+ return
}
- // unsubscribe. we're only interested in this event once
- events.Unsubscribe()
- // stop immediately and ignore all further pending events
- break out
+ case <-self.exitCh:
+ return
}
}
}
@@ -109,7 +113,6 @@ func (self *Miner) Start(coinbase common.Address) {
return
}
self.worker.start()
- self.worker.commitNewWork()
}
func (self *Miner) Stop() {
@@ -117,12 +120,9 @@ func (self *Miner) Stop() {
atomic.StoreInt32(&self.shouldStart, 0)
}
-func (self *Miner) Register(agent Agent) {
- self.worker.register(agent)
-}
-
-func (self *Miner) Unregister(agent Agent) {
- self.worker.unregister(agent)
+func (self *Miner) Close() {
+ self.worker.close()
+ close(self.exitCh)
}
func (self *Miner) Mining() bool {