@ -8,6 +8,7 @@ import (
"os"
"runtime"
"sync"
"sync/atomic"
"time"
"github.com/ethereum/go-ethereum/common"
@ -101,7 +102,8 @@ type ChainManager struct {
futureBlocks * BlockCache
quit chan struct { }
procInterupt chan struct { } // interupt signaler for block processing
// procInterrupt must be atomically called
procInterrupt int32 // interrupt signaler for block processing
wg sync . WaitGroup
pow pow . PoW
@ -114,7 +116,6 @@ func NewChainManager(genesis *types.Block, blockDb, stateDb common.Database, pow
genesisBlock : GenesisBlock ( 42 , stateDb ) ,
eventMux : mux ,
quit : make ( chan struct { } ) ,
procInterupt : make ( chan struct { } ) ,
cache : NewBlockCache ( blockCacheLimit ) ,
pow : pow ,
}
@ -518,7 +519,7 @@ func (self *ChainManager) CalcTotalDiff(block *types.Block) (*big.Int, error) {
func ( bc * ChainManager ) Stop ( ) {
close ( bc . quit )
close ( bc . procInterupt )
atomic . StoreInt32 ( & bc . procInterr upt , 1 )
bc . wg . Wait ( )
@ -571,13 +572,12 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
defer close ( nonceQuit )
txcount := 0
done :
for i , block := range chain {
select {
case <- self . procInterupt :
if atomic . LoadInt32 ( & self . procInterrupt ) == 1 {
glog . V ( logger . Debug ) . Infoln ( "Premature abort during chain processing" )
break done
default :
break
}
bstart := time . Now ( )
// Wait for block i's nonce to be verified before processing
// its state transition.
@ -691,7 +691,6 @@ done:
stats . processed ++
}
}
if ( stats . queued > 0 || stats . processed > 0 || stats . ignored > 0 ) && bool ( glog . V ( logger . Info ) ) {
tend := time . Since ( tstart )