|
|
|
@ -23,6 +23,7 @@ import ( |
|
|
|
|
"github.com/ethereum/go-ethereum/logger" |
|
|
|
|
"github.com/ethereum/go-ethereum/logger/glog" |
|
|
|
|
"github.com/ethereum/go-ethereum/pow" |
|
|
|
|
"sync/atomic" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
type CpuAgent struct { |
|
|
|
@ -35,6 +36,8 @@ type CpuAgent struct { |
|
|
|
|
|
|
|
|
|
index int |
|
|
|
|
pow pow.PoW |
|
|
|
|
|
|
|
|
|
isMining int32 // isMining indicates whether the agent is currently mining
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func NewCpuAgent(index int, pow pow.PoW) *CpuAgent { |
|
|
|
@ -60,6 +63,10 @@ func (self *CpuAgent) Stop() { |
|
|
|
|
func (self *CpuAgent) Start() { |
|
|
|
|
self.mu.Lock() |
|
|
|
|
defer self.mu.Unlock() |
|
|
|
|
|
|
|
|
|
if !atomic.CompareAndSwapInt32(&self.isMining, 0, 1) { |
|
|
|
|
return // agent already started
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
self.quit = make(chan struct{}) |
|
|
|
|
// creating current op ch makes sure we're not closing a nil ch
|
|
|
|
@ -99,10 +106,11 @@ done: |
|
|
|
|
case <-self.workCh: |
|
|
|
|
default: |
|
|
|
|
close(self.workCh) |
|
|
|
|
|
|
|
|
|
break done |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
atomic.StoreInt32(&self.isMining, 0) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *CpuAgent) mine(work *Work, stop <-chan struct{}) { |
|
|
|
|