aboutsummaryrefslogtreecommitdiffstats
path: root/ethminer/miner.go
diff options
context:
space:
mode:
Diffstat (limited to 'ethminer/miner.go')
-rw-r--r--ethminer/miner.go85
1 files changed, 46 insertions, 39 deletions
diff --git a/ethminer/miner.go b/ethminer/miner.go
index bfea8e580..e51b37e05 100644
--- a/ethminer/miner.go
+++ b/ethminer/miner.go
@@ -4,7 +4,7 @@ import (
"bytes"
"github.com/ethereum/eth-go/ethchain"
"github.com/ethereum/eth-go/ethlog"
- "github.com/ethereum/eth-go/ethutil"
+ "github.com/ethereum/eth-go/ethreact"
"github.com/ethereum/eth-go/ethwire"
"sort"
)
@@ -15,13 +15,13 @@ type Miner struct {
pow ethchain.PoW
ethereum ethchain.EthManager
coinbase []byte
- reactChan chan ethutil.React
+ reactChan chan ethreact.Event
txs ethchain.Transactions
uncles []*ethchain.Block
block *ethchain.Block
powChan chan []byte
- powQuitChan chan ethutil.React
- quitChan chan bool
+ powQuitChan chan ethreact.Event
+ quitChan chan chan error
}
func (self *Miner) GetPow() ethchain.PoW {
@@ -29,55 +29,53 @@ func (self *Miner) GetPow() ethchain.PoW {
}
func NewDefaultMiner(coinbase []byte, ethereum ethchain.EthManager) *Miner {
- reactChan := make(chan ethutil.React, 1) // This is the channel that receives 'updates' when ever a new transaction or block comes in
- powChan := make(chan []byte, 1) // This is the channel that receives valid sha hases for a given block
- powQuitChan := make(chan ethutil.React, 1) // This is the channel that can exit the miner thread
- quitChan := make(chan bool, 1)
-
- ethereum.Reactor().Subscribe("newBlock", reactChan)
- ethereum.Reactor().Subscribe("newTx:pre", reactChan)
-
- // We need the quit chan to be a Reactor event.
- // The POW search method is actually blocking and if we don't
- // listen to the reactor events inside of the pow itself
- // The miner overseer will never get the reactor events themselves
- // Only after the miner will find the sha
- ethereum.Reactor().Subscribe("newBlock", powQuitChan)
- ethereum.Reactor().Subscribe("newTx:pre", powQuitChan)
-
miner := Miner{
- pow: &ethchain.EasyPow{},
- ethereum: ethereum,
- coinbase: coinbase,
- reactChan: reactChan,
- powChan: powChan,
- powQuitChan: powQuitChan,
- quitChan: quitChan,
+ pow: &ethchain.EasyPow{},
+ ethereum: ethereum,
+ coinbase: coinbase,
}
- // Insert initial TXs in our little miner 'pool'
- miner.txs = ethereum.TxPool().Flush()
- miner.block = ethereum.BlockChain().NewBlock(miner.coinbase)
-
return &miner
}
func (miner *Miner) Start() {
+ miner.reactChan = make(chan ethreact.Event, 1) // This is the channel that receives 'updates' when ever a new transaction or block comes in
+ miner.powChan = make(chan []byte, 1) // This is the channel that receives valid sha hashes for a given block
+ miner.powQuitChan = make(chan ethreact.Event, 1) // This is the channel that can exit the miner thread
+ miner.quitChan = make(chan chan error, 1)
+
+ // Insert initial TXs in our little miner 'pool'
+ miner.txs = miner.ethereum.TxPool().Flush()
+ miner.block = miner.ethereum.BlockChain().NewBlock(miner.coinbase)
+
// Prepare inital block
//miner.ethereum.StateManager().Prepare(miner.block.State(), miner.block.State())
go miner.listener()
+
+ reactor := miner.ethereum.Reactor()
+ reactor.Subscribe("newBlock", miner.reactChan)
+ reactor.Subscribe("newTx:pre", miner.reactChan)
+
+ // We need the quit chan to be a Reactor event.
+ // The POW search method is actually blocking and if we don't
+ // listen to the reactor events inside of the pow itself
+ // The miner overseer will never get the reactor events themselves
+ // Only after the miner will find the sha
+ reactor.Subscribe("newBlock", miner.powQuitChan)
+ reactor.Subscribe("newTx:pre", miner.powQuitChan)
+
logger.Infoln("Started")
- miner.ethereum.Reactor().Post("miner:start", miner)
+ reactor.Post("miner:start", miner)
}
func (miner *Miner) listener() {
-out:
for {
select {
- case <-miner.quitChan:
+ case status := <-miner.quitChan:
logger.Infoln("Stopped")
- break out
+ status <- nil
+ return
case chanMessage := <-miner.reactChan:
if block, ok := chanMessage.Resource.(*ethchain.Block); ok {
@@ -133,13 +131,22 @@ out:
}
}
-func (self *Miner) Stop() {
+func (miner *Miner) Stop() {
logger.Infoln("Stopping...")
- self.quitChan <- true
- self.powQuitChan <- ethutil.React{}
+ miner.powQuitChan <- ethreact.Event{}
+
+ status := make(chan error)
+ miner.quitChan <- status
+ <-status
+
+ reactor := miner.ethereum.Reactor()
+ reactor.Unsubscribe("newBlock", miner.powQuitChan)
+ reactor.Unsubscribe("newTx:pre", miner.powQuitChan)
+ reactor.Unsubscribe("newBlock", miner.reactChan)
+ reactor.Unsubscribe("newTx:pre", miner.reactChan)
- self.ethereum.Reactor().Post("miner:stop", self)
+ reactor.Post("miner:stop", miner)
}
func (self *Miner) mineNewBlock() {