aboutsummaryrefslogtreecommitdiffstats
path: root/miner
diff options
context:
space:
mode:
authorJeffrey Wilcke <geffobscura@gmail.com>2015-10-31 09:18:41 +0800
committerJeffrey Wilcke <geffobscura@gmail.com>2015-10-31 09:18:41 +0800
commit8c38f8d81529ada04fde4e3d41530aa61b477792 (patch)
treed9401a501076932c010c2e5ec590ef5bbfc38ef0 /miner
parent016ad3e96215a7bdd309bbef847f9dcf4674b8e9 (diff)
downloadgo-tangerine-8c38f8d81529ada04fde4e3d41530aa61b477792.tar
go-tangerine-8c38f8d81529ada04fde4e3d41530aa61b477792.tar.gz
go-tangerine-8c38f8d81529ada04fde4e3d41530aa61b477792.tar.bz2
go-tangerine-8c38f8d81529ada04fde4e3d41530aa61b477792.tar.lz
go-tangerine-8c38f8d81529ada04fde4e3d41530aa61b477792.tar.xz
go-tangerine-8c38f8d81529ada04fde4e3d41530aa61b477792.tar.zst
go-tangerine-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.
Diffstat (limited to 'miner')
-rw-r--r--miner/remote_agent.go17
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