From 7778740315f322a9a31219090f180374a5620ec0 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Mon, 18 May 2015 15:13:58 +0200 Subject: [PATCH 1/2] fixed race condition in miner --- miner/agent.go | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/miner/agent.go b/miner/agent.go index da2a2008d..b4c776c65 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -40,7 +40,6 @@ func (self *CpuAgent) Stop() { defer self.mu.Unlock() close(self.quit) - close(self.quitCurrentOp) } func (self *CpuAgent) Start() { @@ -50,7 +49,6 @@ func (self *CpuAgent) Start() { self.quit = make(chan struct{}) // creating current op ch makes sure we're not closing a nil ch // later on - self.quitCurrentOp = make(chan struct{}) self.workCh = make(chan *types.Block, 1) go self.update() @@ -62,10 +60,12 @@ out: select { case block := <-self.workCh: self.mu.Lock() - close(self.quitCurrentOp) + if self.quitCurrentOp != nil { + close(self.quitCurrentOp) + } + self.quitCurrentOp = make(chan struct{}) + go self.mine(block, self.quitCurrentOp) self.mu.Unlock() - - go self.mine(block) case <-self.quit: break out } @@ -84,16 +84,11 @@ done: } } -func (self *CpuAgent) mine(block *types.Block) { +func (self *CpuAgent) mine(block *types.Block, stop <- chan struct{}) { glog.V(logger.Debug).Infof("(re)started agent[%d]. mining...\n", self.index) - // Reset the channel - self.mu.Lock() - self.quitCurrentOp = make(chan struct{}) - self.mu.Unlock() - // Mine - nonce, mixDigest := self.pow.Search(block, self.quitCurrentOp) + nonce, mixDigest := self.pow.Search(block, stop) if nonce != 0 { block.SetNonce(nonce) block.Header().MixDigest = common.BytesToHash(mixDigest) From 60561cdca26b84843ddb4d96158c6ca7d8c32ec1 Mon Sep 17 00:00:00 2001 From: Bas van Kervel Date: Mon, 18 May 2015 16:09:01 +0200 Subject: [PATCH 2/2] fixed issue when miner is not stopping af stop command --- miner/agent.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/miner/agent.go b/miner/agent.go index b4c776c65..3ed3ba839 100644 --- a/miner/agent.go +++ b/miner/agent.go @@ -67,6 +67,12 @@ out: go self.mine(block, self.quitCurrentOp) self.mu.Unlock() case <-self.quit: + self.mu.Lock() + if self.quitCurrentOp != nil { + close(self.quitCurrentOp) + self.quitCurrentOp = nil + } + self.mu.Unlock() break out } }