diff options
author | Jeffrey Wilcke <geffobscura@gmail.com> | 2015-10-31 09:18:41 +0800 |
---|---|---|
committer | Jeffrey Wilcke <geffobscura@gmail.com> | 2015-10-31 09:18:41 +0800 |
commit | 8c38f8d81529ada04fde4e3d41530aa61b477792 (patch) | |
tree | d9401a501076932c010c2e5ec590ef5bbfc38ef0 | |
parent | 016ad3e96215a7bdd309bbef847f9dcf4674b8e9 (diff) | |
download | dexon-8c38f8d81529ada04fde4e3d41530aa61b477792.tar.gz dexon-8c38f8d81529ada04fde4e3d41530aa61b477792.tar.zst dexon-8c38f8d81529ada04fde4e3d41530aa61b477792.zip |
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.
-rw-r--r-- | miner/remote_agent.go | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/miner/remote_agent.go b/miner/remote_agent.go index 18ddf121c..00b5f7e08 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 |