@ -474,6 +474,7 @@ unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans)
bool IsStandardTx ( const CTransaction & tx , string & reason )
bool IsStandardTx ( const CTransaction & tx , string & reason )
{
{
AssertLockHeld ( cs_main ) ;
if ( tx . nVersion > CTransaction : : CURRENT_VERSION | | tx . nVersion < 1 ) {
if ( tx . nVersion > CTransaction : : CURRENT_VERSION | | tx . nVersion < 1 ) {
reason = " version " ;
reason = " version " ;
return false ;
return false ;
@ -556,6 +557,7 @@ bool IsStandardTx(const CTransaction& tx, string& reason)
bool IsFinalTx ( const CTransaction & tx , int nBlockHeight , int64_t nBlockTime )
bool IsFinalTx ( const CTransaction & tx , int nBlockHeight , int64_t nBlockTime )
{
{
AssertLockHeld ( cs_main ) ;
// Time based nLockTime implemented in 0.1.6
// Time based nLockTime implemented in 0.1.6
if ( tx . nLockTime = = 0 )
if ( tx . nLockTime = = 0 )
return true ;
return true ;
@ -667,6 +669,7 @@ unsigned int GetP2SHSigOpCount(const CTransaction& tx, CCoinsViewCache& inputs)
int CMerkleTx : : SetMerkleBranch ( const CBlock * pblock )
int CMerkleTx : : SetMerkleBranch ( const CBlock * pblock )
{
{
AssertLockHeld ( cs_main ) ;
CBlock blockTmp ;
CBlock blockTmp ;
if ( pblock = = NULL ) {
if ( pblock = = NULL ) {
@ -813,6 +816,7 @@ int64_t GetMinFee(const CTransaction& tx, unsigned int nBytes, bool fAllowFree,
bool AcceptToMemoryPool ( CTxMemPool & pool , CValidationState & state , const CTransaction & tx , bool fLimitFree ,
bool AcceptToMemoryPool ( CTxMemPool & pool , CValidationState & state , const CTransaction & tx , bool fLimitFree ,
bool * pfMissingInputs , bool fRejectInsaneFee )
bool * pfMissingInputs , bool fRejectInsaneFee )
{
{
AssertLockHeld ( cs_main ) ;
if ( pfMissingInputs )
if ( pfMissingInputs )
* pfMissingInputs = false ;
* pfMissingInputs = false ;
@ -958,6 +962,7 @@ int CMerkleTx::GetDepthInMainChainINTERNAL(CBlockIndex* &pindexRet) const
{
{
if ( hashBlock = = 0 | | nIndex = = - 1 )
if ( hashBlock = = 0 | | nIndex = = - 1 )
return 0 ;
return 0 ;
AssertLockHeld ( cs_main ) ;
// Find the block it claims to be in
// Find the block it claims to be in
map < uint256 , CBlockIndex * > : : iterator mi = mapBlockIndex . find ( hashBlock ) ;
map < uint256 , CBlockIndex * > : : iterator mi = mapBlockIndex . find ( hashBlock ) ;
@ -981,6 +986,7 @@ int CMerkleTx::GetDepthInMainChainINTERNAL(CBlockIndex* &pindexRet) const
int CMerkleTx : : GetDepthInMainChain ( CBlockIndex * & pindexRet ) const
int CMerkleTx : : GetDepthInMainChain ( CBlockIndex * & pindexRet ) const
{
{
AssertLockHeld ( cs_main ) ;
int nResult = GetDepthInMainChainINTERNAL ( pindexRet ) ;
int nResult = GetDepthInMainChainINTERNAL ( pindexRet ) ;
if ( nResult = = 0 & & ! mempool . exists ( GetHash ( ) ) )
if ( nResult = = 0 & & ! mempool . exists ( GetHash ( ) ) )
return - 1 ; // Not in chain, not in mempool
return - 1 ; // Not in chain, not in mempool
@ -1304,6 +1310,7 @@ int GetNumBlocksOfPeers()
bool IsInitialBlockDownload ( )
bool IsInitialBlockDownload ( )
{
{
LOCK ( cs_main ) ;
if ( fImporting | | fReindex | | chainActive . Height ( ) < Checkpoints : : GetTotalBlocksEstimate ( ) )
if ( fImporting | | fReindex | | chainActive . Height ( ) < Checkpoints : : GetTotalBlocksEstimate ( ) )
return true ;
return true ;
static int64_t nLastUpdate ;
static int64_t nLastUpdate ;
@ -1323,6 +1330,7 @@ CBlockIndex *pindexBestForkTip = NULL, *pindexBestForkBase = NULL;
void CheckForkWarningConditions ( )
void CheckForkWarningConditions ( )
{
{
AssertLockHeld ( cs_main ) ;
// Before we get past initial download, we cannot reliably alert about forks
// Before we get past initial download, we cannot reliably alert about forks
// (we assume we don't get stuck on a fork before the last checkpoint)
// (we assume we don't get stuck on a fork before the last checkpoint)
if ( IsInitialBlockDownload ( ) )
if ( IsInitialBlockDownload ( ) )
@ -1368,6 +1376,7 @@ void CheckForkWarningConditions()
void CheckForkWarningConditionsOnNewFork ( CBlockIndex * pindexNewForkTip )
void CheckForkWarningConditionsOnNewFork ( CBlockIndex * pindexNewForkTip )
{
{
AssertLockHeld ( cs_main ) ;
// If we are on a fork that is sufficiently large, set a warning flag
// If we are on a fork that is sufficiently large, set a warning flag
CBlockIndex * pfork = pindexNewForkTip ;
CBlockIndex * pfork = pindexNewForkTip ;
CBlockIndex * plonger = chainActive . Tip ( ) ;
CBlockIndex * plonger = chainActive . Tip ( ) ;
@ -2078,6 +2087,7 @@ void static FindMostWorkChain() {
// Try to activate to the most-work chain (thereby connecting it).
// Try to activate to the most-work chain (thereby connecting it).
bool ActivateBestChain ( CValidationState & state ) {
bool ActivateBestChain ( CValidationState & state ) {
LOCK ( cs_main ) ;
CBlockIndex * pindexOldTip = chainActive . Tip ( ) ;
CBlockIndex * pindexOldTip = chainActive . Tip ( ) ;
bool fComplete = false ;
bool fComplete = false ;
while ( ! fComplete ) {
while ( ! fComplete ) {
@ -2162,6 +2172,7 @@ bool AddToBlockIndex(CBlock& block, CValidationState& state, const CDiskBlockPos
if ( ! ActivateBestChain ( state ) )
if ( ! ActivateBestChain ( state ) )
return false ;
return false ;
LOCK ( cs_main ) ;
if ( pindexNew = = chainActive . Tip ( ) )
if ( pindexNew = = chainActive . Tip ( ) )
{
{
// Clear fork warning if its no longer applicable
// Clear fork warning if its no longer applicable
@ -2344,6 +2355,7 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo
bool AcceptBlock ( CBlock & block , CValidationState & state , CDiskBlockPos * dbp )
bool AcceptBlock ( CBlock & block , CValidationState & state , CDiskBlockPos * dbp )
{
{
AssertLockHeld ( cs_main ) ;
// Check for duplicate
// Check for duplicate
uint256 hash = block . GetHash ( ) ;
uint256 hash = block . GetHash ( ) ;
if ( mapBlockIndex . count ( hash ) )
if ( mapBlockIndex . count ( hash ) )
@ -2455,6 +2467,7 @@ bool CBlockIndex::IsSuperMajority(int minVersion, const CBlockIndex* pstart, uns
int64_t CBlockIndex : : GetMedianTime ( ) const
int64_t CBlockIndex : : GetMedianTime ( ) const
{
{
AssertLockHeld ( cs_main ) ;
const CBlockIndex * pindex = this ;
const CBlockIndex * pindex = this ;
for ( int i = 0 ; i < nMedianTimeSpan / 2 ; i + + )
for ( int i = 0 ; i < nMedianTimeSpan / 2 ; i + + )
{
{
@ -2467,6 +2480,7 @@ int64_t CBlockIndex::GetMedianTime() const
void PushGetBlocks ( CNode * pnode , CBlockIndex * pindexBegin , uint256 hashEnd )
void PushGetBlocks ( CNode * pnode , CBlockIndex * pindexBegin , uint256 hashEnd )
{
{
AssertLockHeld ( cs_main ) ;
// Filter out duplicate requests
// Filter out duplicate requests
if ( pindexBegin = = pnode - > pindexLastGetBlocksBegin & & hashEnd = = pnode - > hashLastGetBlocksEnd )
if ( pindexBegin = = pnode - > pindexLastGetBlocksBegin & & hashEnd = = pnode - > hashLastGetBlocksEnd )
return ;
return ;
@ -2948,6 +2962,7 @@ bool LoadBlockIndex()
bool InitBlockIndex ( ) {
bool InitBlockIndex ( ) {
LOCK ( cs_main ) ;
// Check whether we're already initialized
// Check whether we're already initialized
if ( chainActive . Genesis ( ) ! = NULL )
if ( chainActive . Genesis ( ) ! = NULL )
return true ;
return true ;
@ -2983,6 +2998,7 @@ bool InitBlockIndex() {
void PrintBlockTree ( )
void PrintBlockTree ( )
{
{
AssertLockHeld ( cs_main ) ;
// pre-compute tree structure
// pre-compute tree structure
map < CBlockIndex * , vector < CBlockIndex * > > mapNext ;
map < CBlockIndex * , vector < CBlockIndex * > > mapNext ;
for ( map < uint256 , CBlockIndex * > : : iterator mi = mapBlockIndex . begin ( ) ; mi ! = mapBlockIndex . end ( ) ; + + mi )
for ( map < uint256 , CBlockIndex * > : : iterator mi = mapBlockIndex . begin ( ) ; mi ! = mapBlockIndex . end ( ) ; + + mi )
@ -4186,6 +4202,10 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
}
}
}
}
TRY_LOCK ( cs_main , lockMain ) ; // Acquire cs_main for IsInitialBlockDownload() and CNodeState()
if ( ! lockMain )
return true ;
// Address refresh broadcast
// Address refresh broadcast
static int64_t nLastRebroadcast ;
static int64_t nLastRebroadcast ;
if ( ! IsInitialBlockDownload ( ) & & ( GetTime ( ) - nLastRebroadcast > 24 * 60 * 60 ) )
if ( ! IsInitialBlockDownload ( ) & & ( GetTime ( ) - nLastRebroadcast > 24 * 60 * 60 ) )
@ -4236,10 +4256,6 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
pto - > PushMessage ( " addr " , vAddr ) ;
pto - > PushMessage ( " addr " , vAddr ) ;
}
}
TRY_LOCK ( cs_main , lockMain ) ;
if ( ! lockMain )
return true ;
CNodeState & state = * State ( pto - > GetId ( ) ) ;
CNodeState & state = * State ( pto - > GetId ( ) ) ;
if ( state . fShouldBan ) {
if ( state . fShouldBan ) {
if ( pto - > addr . IsLocal ( ) )
if ( pto - > addr . IsLocal ( ) )