diff options
author | obscuren <geffobscura@gmail.com> | 2015-03-27 00:45:03 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-03-27 00:45:03 +0800 |
commit | d36501a6e54e1c794af0c7109e937f7f7c74de79 (patch) | |
tree | 5b32e606558a99e4a516757c924a679fdcb2716f /miner/agent.go | |
parent | d0fa0a234d19468b513d9144f442b8be77ccf898 (diff) | |
download | dexon-d36501a6e54e1c794af0c7109e937f7f7c74de79.tar dexon-d36501a6e54e1c794af0c7109e937f7f7c74de79.tar.gz dexon-d36501a6e54e1c794af0c7109e937f7f7c74de79.tar.bz2 dexon-d36501a6e54e1c794af0c7109e937f7f7c74de79.tar.lz dexon-d36501a6e54e1c794af0c7109e937f7f7c74de79.tar.xz dexon-d36501a6e54e1c794af0c7109e937f7f7c74de79.tar.zst dexon-d36501a6e54e1c794af0c7109e937f7f7c74de79.zip |
Fixed miner
* Miners could stall because the worker wasn't aware the miner was done
Diffstat (limited to 'miner/agent.go')
-rw-r--r-- | miner/agent.go | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/miner/agent.go b/miner/agent.go index 5661d2982..c650fa2f3 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -1,12 +1,15 @@ package miner import ( + "sync" + "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/pow" ) type CpuMiner struct { + chMu sync.Mutex c chan *types.Block quit chan struct{} quitCurrentOp chan struct{} @@ -43,16 +46,13 @@ func (self *CpuMiner) Start() { } func (self *CpuMiner) update() { - justStarted := true out: for { select { case block := <-self.c: - if justStarted { - justStarted = true - } else { - self.quitCurrentOp <- struct{}{} - } + self.chMu.Lock() + self.quitCurrentOp <- struct{}{} + self.chMu.Unlock() go self.mine(block) case <-self.quit: @@ -60,6 +60,7 @@ out: } } + close(self.quitCurrentOp) done: // Empty channel for { @@ -75,12 +76,20 @@ done: func (self *CpuMiner) mine(block *types.Block) { minerlogger.Debugf("(re)started agent[%d]. mining...\n", self.index) + + // Reset the channel + self.chMu.Lock() + self.quitCurrentOp = make(chan struct{}, 1) + self.chMu.Unlock() + + // Mine nonce, mixDigest, _ := self.pow.Search(block, self.quitCurrentOp) if nonce != 0 { block.SetNonce(nonce) block.Header().MixDigest = common.BytesToHash(mixDigest) self.returnCh <- block - //self.returnCh <- Work{block.Number().Uint64(), nonce, mixDigest, seedHash} + } else { + self.returnCh <- nil } } |