|
|
|
@ -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 !atomic.CompareAndSwapInt32(&a.running, 1, 0) { |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
if a.workCh != nil { |
|
|
|
|
|
|
|
|
|
close(a.quit) |
|
|
|
|
close(a.workCh) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// GetHashRate returns the accumulated hashrate of all identifier combined
|
|
|
|
|