Jelajahi Sumber

Merge pull request #1255 from obscuren/chain-proc-interupt

eth, core: interrupt the chain processing on stop
Jeffrey Wilcke 10 tahun lalu
induk
melakukan
6f5c6150b7
2 mengubah file dengan 11 tambahan dan 2 penghapusan
  1. 10 1
      core/chain_manager.go
  2. 1 1
      eth/backend.go

+ 10 - 1
core/chain_manager.go

@@ -8,6 +8,7 @@ import (
 	"os"
 	"runtime"
 	"sync"
+	"sync/atomic"
 	"time"
 
 	"github.com/ethereum/go-ethereum/common"
@@ -101,7 +102,9 @@ type ChainManager struct {
 	futureBlocks *BlockCache
 
 	quit chan struct{}
-	wg   sync.WaitGroup
+	// procInterrupt must be atomically called
+	procInterrupt int32 // interrupt signaler for block processing
+	wg            sync.WaitGroup
 
 	pow pow.PoW
 }
@@ -516,6 +519,7 @@ func (self *ChainManager) CalcTotalDiff(block *types.Block) (*big.Int, error) {
 
 func (bc *ChainManager) Stop() {
 	close(bc.quit)
+	atomic.StoreInt32(&bc.procInterrupt, 1)
 
 	bc.wg.Wait()
 
@@ -569,6 +573,11 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
 
 	txcount := 0
 	for i, block := range chain {
+		if atomic.LoadInt32(&self.procInterrupt) == 1 {
+			glog.V(logger.Debug).Infoln("Premature abort during chain processing")
+			break
+		}
+
 		bstart := time.Now()
 		// Wait for block i's nonce to be verified before processing
 		// its state transition.

+ 1 - 1
eth/backend.go

@@ -527,8 +527,8 @@ func (self *Ethereum) AddPeer(nodeURL string) error {
 
 func (s *Ethereum) Stop() {
 	s.net.Stop()
-	s.protocolManager.Stop()
 	s.chainManager.Stop()
+	s.protocolManager.Stop()
 	s.txPool.Stop()
 	s.eventMux.Stop()
 	if s.whisper != nil {