|
|
|
@ -222,14 +222,15 @@ type BlockChain struct { |
|
|
|
|
statedb *state.CachingDB // State database to reuse between imports (contains state cache)
|
|
|
|
|
txIndexer *txIndexer // Transaction indexer, might be nil if not enabled
|
|
|
|
|
|
|
|
|
|
hc *HeaderChain |
|
|
|
|
rmLogsFeed event.Feed |
|
|
|
|
chainFeed event.Feed |
|
|
|
|
chainHeadFeed event.Feed |
|
|
|
|
logsFeed event.Feed |
|
|
|
|
blockProcFeed event.Feed |
|
|
|
|
scope event.SubscriptionScope |
|
|
|
|
genesisBlock *types.Block |
|
|
|
|
hc *HeaderChain |
|
|
|
|
rmLogsFeed event.Feed |
|
|
|
|
chainFeed event.Feed |
|
|
|
|
chainHeadFeed event.Feed |
|
|
|
|
logsFeed event.Feed |
|
|
|
|
blockProcFeed event.Feed |
|
|
|
|
blockProcCounter int32 |
|
|
|
|
scope event.SubscriptionScope |
|
|
|
|
genesisBlock *types.Block |
|
|
|
|
|
|
|
|
|
// This mutex synchronizes chain write operations.
|
|
|
|
|
// Readers don't need to take it, they can just read the database.
|
|
|
|
@ -1616,8 +1617,15 @@ func (bc *BlockChain) insertChain(chain types.Blocks, setHead bool, makeWitness |
|
|
|
|
if bc.insertStopped() { |
|
|
|
|
return nil, 0, nil |
|
|
|
|
} |
|
|
|
|
bc.blockProcFeed.Send(true) |
|
|
|
|
defer bc.blockProcFeed.Send(false) |
|
|
|
|
|
|
|
|
|
if atomic.AddInt32(&bc.blockProcCounter, 1) == 1 { |
|
|
|
|
bc.blockProcFeed.Send(true) |
|
|
|
|
} |
|
|
|
|
defer func() { |
|
|
|
|
if atomic.AddInt32(&bc.blockProcCounter, -1) == 0 { |
|
|
|
|
bc.blockProcFeed.Send(false) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
// Start a parallel signature recovery (signer will fluke on fork transition, minimal perf loss)
|
|
|
|
|
SenderCacher().RecoverFromBlocks(types.MakeSigner(bc.chainConfig, chain[0].Number(), chain[0].Time()), chain) |
|
|
|
|