|
|
@ -37,7 +37,7 @@ type hashrate struct { |
|
|
|
type RemoteAgent struct { |
|
|
|
type RemoteAgent struct { |
|
|
|
mu sync.Mutex |
|
|
|
mu sync.Mutex |
|
|
|
|
|
|
|
|
|
|
|
quit chan struct{} |
|
|
|
quitCh chan struct{} |
|
|
|
workCh chan *Work |
|
|
|
workCh chan *Work |
|
|
|
returnCh chan<- *Result |
|
|
|
returnCh chan<- *Result |
|
|
|
|
|
|
|
|
|
|
@ -76,18 +76,16 @@ func (a *RemoteAgent) Start() { |
|
|
|
if !atomic.CompareAndSwapInt32(&a.running, 0, 1) { |
|
|
|
if !atomic.CompareAndSwapInt32(&a.running, 0, 1) { |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
a.quitCh = make(chan struct{}) |
|
|
|
a.quit = make(chan struct{}) |
|
|
|
|
|
|
|
a.workCh = make(chan *Work, 1) |
|
|
|
a.workCh = make(chan *Work, 1) |
|
|
|
go a.maintainLoop() |
|
|
|
go a.loop(a.workCh, a.quitCh) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (a *RemoteAgent) Stop() { |
|
|
|
func (a *RemoteAgent) Stop() { |
|
|
|
if !atomic.CompareAndSwapInt32(&a.running, 1, 0) { |
|
|
|
if !atomic.CompareAndSwapInt32(&a.running, 1, 0) { |
|
|
|
return |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
close(a.quitCh) |
|
|
|
close(a.quit) |
|
|
|
|
|
|
|
close(a.workCh) |
|
|
|
close(a.workCh) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -148,15 +146,20 @@ func (a *RemoteAgent) SubmitWork(nonce uint64, mixDigest, hash common.Hash) bool |
|
|
|
return false |
|
|
|
return false |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (a *RemoteAgent) maintainLoop() { |
|
|
|
// loop monitors mining events on the work and quit channels, updating the internal
|
|
|
|
|
|
|
|
// state of the rmeote miner until a termination is requested.
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// Note, the reason the work and quit channels are passed as parameters is because
|
|
|
|
|
|
|
|
// RemoteAgent.Start() constantly recreates these channels, so the loop code cannot
|
|
|
|
|
|
|
|
// assume data stability in these member fields.
|
|
|
|
|
|
|
|
func (a *RemoteAgent) loop(workCh chan *Work, quitCh chan struct{}) { |
|
|
|
ticker := time.Tick(5 * time.Second) |
|
|
|
ticker := time.Tick(5 * time.Second) |
|
|
|
|
|
|
|
|
|
|
|
out: |
|
|
|
|
|
|
|
for { |
|
|
|
for { |
|
|
|
select { |
|
|
|
select { |
|
|
|
case <-a.quit: |
|
|
|
case <-quitCh: |
|
|
|
break out |
|
|
|
return |
|
|
|
case work := <-a.workCh: |
|
|
|
case work := <-workCh: |
|
|
|
a.mu.Lock() |
|
|
|
a.mu.Lock() |
|
|
|
a.currentWork = work |
|
|
|
a.currentWork = work |
|
|
|
a.mu.Unlock() |
|
|
|
a.mu.Unlock() |
|
|
|