From 8c38f8d81529ada04fde4e3d41530aa61b477792 Mon Sep 17 00:00:00 2001 From: Jeffrey Wilcke Date: Sat, 31 Oct 2015 02:18:41 +0100 Subject: [PATCH] miner: synchronise start / stop This PR fixes an issue where the remote worker was stopped twice and not properly handled. This adds a synchronised running check to the start and stop methods preventing closing of a channel more than once. --- miner/remote_agent.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/miner/remote_agent.go b/miner/remote_agent.go index 18ddf121c7..00b5f7e089 100644 --- a/miner/remote_agent.go +++ b/miner/remote_agent.go @@ -20,6 +20,7 @@ import ( "errors" "math/big" "sync" + "sync/atomic" "time" "github.com/ethereum/ethash" @@ -45,6 +46,8 @@ type RemoteAgent struct { hashrateMu sync.RWMutex hashrate map[common.Hash]hashrate + + running int32 // running indicates whether the agent is active. Call atomically } func NewRemoteAgent() *RemoteAgent { @@ -70,18 +73,22 @@ func (a *RemoteAgent) SetReturnCh(returnCh chan<- *Result) { } func (a *RemoteAgent) Start() { + if !atomic.CompareAndSwapInt32(&a.running, 0, 1) { + return + } + a.quit = make(chan struct{}) a.workCh = make(chan *Work, 1) go a.maintainLoop() } func (a *RemoteAgent) Stop() { - if a.quit != nil { - close(a.quit) - } - if a.workCh != nil { - close(a.workCh) + if !atomic.CompareAndSwapInt32(&a.running, 1, 0) { + return } + + close(a.quit) + close(a.workCh) } // GetHashRate returns the accumulated hashrate of all identifier combined