aboutsummaryrefslogtreecommitdiffstats
path: root/miner/agent.go
diff options
context:
space:
mode:
authorgary rong <garyrong0905@gmail.com>2018-08-14 23:34:33 +0800
committerPéter Szilágyi <peterke@gmail.com>2018-08-14 23:34:33 +0800
commita1783d169732dd34aa8c7d68f411ce741c1a5015 (patch)
tree14e12ac6077667789c0fe5bd1166fdc534528d73 /miner/agent.go
parente0e0e53401e93733d921338b6d794162c40a7883 (diff)
downloaddexon-a1783d169732dd34aa8c7d68f411ce741c1a5015.tar.gz
dexon-a1783d169732dd34aa8c7d68f411ce741c1a5015.tar.zst
dexon-a1783d169732dd34aa8c7d68f411ce741c1a5015.zip
miner: move agent logic to worker (#17351)
* miner: move agent logic to worker * miner: polish * core: persist block before reorg
Diffstat (limited to 'miner/agent.go')
-rw-r--r--miner/agent.go116
1 files changed, 0 insertions, 116 deletions
diff --git a/miner/agent.go b/miner/agent.go
deleted file mode 100644
index e922ea153..000000000
--- a/miner/agent.go
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2015 The go-ethereum Authors
-// This file is part of the go-ethereum library.
-//
-// The go-ethereum library is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// The go-ethereum library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
-
-package miner
-
-import (
- "sync"
- "sync/atomic"
-
- "github.com/ethereum/go-ethereum/consensus"
- "github.com/ethereum/go-ethereum/log"
-)
-
-type CpuAgent struct {
- mu sync.Mutex
-
- taskCh chan *Package
- returnCh chan<- *Package
- stop chan struct{}
- quitCurrentOp chan struct{}
-
- chain consensus.ChainReader
- engine consensus.Engine
-
- started int32 // started indicates whether the agent is currently started
-}
-
-func NewCpuAgent(chain consensus.ChainReader, engine consensus.Engine) *CpuAgent {
- agent := &CpuAgent{
- chain: chain,
- engine: engine,
- stop: make(chan struct{}, 1),
- taskCh: make(chan *Package, 1),
- }
- return agent
-}
-
-func (self *CpuAgent) AssignTask(p *Package) {
- if atomic.LoadInt32(&self.started) == 1 {
- self.taskCh <- p
- }
-}
-func (self *CpuAgent) DeliverTo(ch chan<- *Package) { self.returnCh = ch }
-
-func (self *CpuAgent) Start() {
- if !atomic.CompareAndSwapInt32(&self.started, 0, 1) {
- return // agent already started
- }
- go self.update()
-}
-
-func (self *CpuAgent) Stop() {
- if !atomic.CompareAndSwapInt32(&self.started, 1, 0) {
- return // agent already stopped
- }
- self.stop <- struct{}{}
-done:
- // Empty work channel
- for {
- select {
- case <-self.taskCh:
- default:
- break done
- }
- }
-}
-
-func (self *CpuAgent) update() {
-out:
- for {
- select {
- case p := <-self.taskCh:
- self.mu.Lock()
- if self.quitCurrentOp != nil {
- close(self.quitCurrentOp)
- }
- self.quitCurrentOp = make(chan struct{})
- go self.mine(p, self.quitCurrentOp)
- self.mu.Unlock()
- case <-self.stop:
- self.mu.Lock()
- if self.quitCurrentOp != nil {
- close(self.quitCurrentOp)
- self.quitCurrentOp = nil
- }
- self.mu.Unlock()
- break out
- }
- }
-}
-
-func (self *CpuAgent) mine(p *Package, stop <-chan struct{}) {
- var err error
- if p.Block, err = self.engine.Seal(self.chain, p.Block, stop); p.Block != nil {
- log.Info("Successfully sealed new block", "number", p.Block.Number(), "hash", p.Block.Hash())
- self.returnCh <- p
- } else {
- if err != nil {
- log.Warn("Block sealing failed", "err", err)
- }
- self.returnCh <- nil
- }
-}