forked from cerc-io/plugeth
Merge pull request #1021 from obscuren/global_chain_lock
core: global chain insert lock
This commit is contained in:
commit
443d024843
@ -84,6 +84,7 @@ type ChainManager struct {
|
||||
genesisBlock *types.Block
|
||||
// Last known total difficulty
|
||||
mu sync.RWMutex
|
||||
chainmu sync.RWMutex
|
||||
tsmu sync.RWMutex
|
||||
|
||||
td *big.Int
|
||||
@ -518,6 +519,9 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
|
||||
self.wg.Add(1)
|
||||
defer self.wg.Done()
|
||||
|
||||
self.chainmu.Lock()
|
||||
defer self.chainmu.Unlock()
|
||||
|
||||
// A queued approach to delivering events. This is generally faster than direct delivery and requires much less mutex acquiring.
|
||||
var (
|
||||
queue = make([]interface{}, len(chain))
|
||||
@ -542,7 +546,6 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
|
||||
continue
|
||||
}
|
||||
|
||||
block.Td = new(big.Int)
|
||||
// Do not penelise on future block. We'll need a block queue eventually that will queue
|
||||
// future block for future use
|
||||
if err == BlockFutureErr {
|
||||
@ -568,8 +571,6 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
|
||||
return i, err
|
||||
}
|
||||
|
||||
self.mu.Lock()
|
||||
{
|
||||
cblock := self.currentBlock
|
||||
// Write block to database. Eventually we'll have to improve on this and throw away blocks that are
|
||||
// not in the canonical chain.
|
||||
@ -614,8 +615,6 @@ func (self *ChainManager) InsertChain(chain types.Blocks) (int, error) {
|
||||
queueEvent.sideCount++
|
||||
}
|
||||
self.futureBlocks.Delete(block.Hash())
|
||||
}
|
||||
self.mu.Unlock()
|
||||
|
||||
stats.processed++
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user