瀏覽代碼

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.
Jeffrey Wilcke 10 年之前
父節點
當前提交
8c38f8d815
共有 1 個文件被更改,包括 12 次插入5 次删除
  1. 12 5
      miner/remote_agent.go

+ 12 - 5
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