core: added a running flag to prevent panics in the chainmanager

The running flag will determine whether the chain manager is still
running or not. This will prevent the quit channel from being closed
twice resulting in a panic. This PR should fix this issue.

Closes #1559
This commit is contained in:
Jeffrey Wilcke 2015-08-01 12:32:28 +02:00
parent e7f4232b10
commit acd2c4e520

View File

@ -76,7 +76,8 @@ type ChainManager struct {
cache *lru.Cache // cache is the LRU caching cache *lru.Cache // cache is the LRU caching
futureBlocks *lru.Cache // future blocks are blocks added for later processing futureBlocks *lru.Cache // future blocks are blocks added for later processing
quit chan struct{} quit chan struct{}
running int32 // running must be called automically
// procInterrupt must be atomically called // procInterrupt must be atomically called
procInterrupt int32 // interrupt signaler for block processing procInterrupt int32 // interrupt signaler for block processing
wg sync.WaitGroup wg sync.WaitGroup
@ -443,6 +444,9 @@ func (bc *ChainManager) setTotalDifficulty(td *big.Int) {
} }
func (bc *ChainManager) Stop() { func (bc *ChainManager) Stop() {
if !atomic.CompareAndSwapInt32(&bc.running, 0, 1) {
return
}
close(bc.quit) close(bc.quit)
atomic.StoreInt32(&bc.procInterrupt, 1) atomic.StoreInt32(&bc.procInterrupt, 1)