Merge branch 'master' of https://github.com/bitcoin/bitcoin
Conflicts: .gitignore
This commit is contained in:
24
src/main.cpp
24
src/main.cpp
@@ -820,7 +820,7 @@ bool CTransaction::ConnectInputs(CTxDB& txdb, map<uint256, CTxIndex>& mapTestPoo
|
||||
// Read txindex
|
||||
CTxIndex txindex;
|
||||
bool fFound = true;
|
||||
if (fMiner && mapTestPool.count(prevout.hash))
|
||||
if ((fBlock || fMiner) && mapTestPool.count(prevout.hash))
|
||||
{
|
||||
// Get txindex from current proposed changes
|
||||
txindex = mapTestPool[prevout.hash];
|
||||
@@ -880,12 +880,7 @@ bool CTransaction::ConnectInputs(CTxDB& txdb, map<uint256, CTxIndex>& mapTestPoo
|
||||
txindex.vSpent[prevout.n] = posThisTx;
|
||||
|
||||
// Write back
|
||||
if (fBlock)
|
||||
{
|
||||
if (!txdb.UpdateTxIndex(prevout.hash, txindex))
|
||||
return error("ConnectInputs() : UpdateTxIndex failed");
|
||||
}
|
||||
else if (fMiner)
|
||||
if (fBlock || fMiner)
|
||||
{
|
||||
mapTestPool[prevout.hash] = txindex;
|
||||
}
|
||||
@@ -907,9 +902,8 @@ bool CTransaction::ConnectInputs(CTxDB& txdb, map<uint256, CTxIndex>& mapTestPoo
|
||||
|
||||
if (fBlock)
|
||||
{
|
||||
// Add transaction to disk index
|
||||
if (!txdb.AddTxIndex(*this, posThisTx, pindexBlock->nHeight))
|
||||
return error("ConnectInputs() : AddTxPos failed");
|
||||
// Add transaction to changes
|
||||
mapTestPool[GetHash()] = CTxIndex(posThisTx, vout.size());
|
||||
}
|
||||
else if (fMiner)
|
||||
{
|
||||
@@ -998,16 +992,22 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex)
|
||||
//// issue here: it doesn't know the version
|
||||
unsigned int nTxPos = pindex->nBlockPos + ::GetSerializeSize(CBlock(), SER_DISK) - 1 + GetSizeOfCompactSize(vtx.size());
|
||||
|
||||
map<uint256, CTxIndex> mapUnused;
|
||||
map<uint256, CTxIndex> mapQueuedChanges;
|
||||
int64 nFees = 0;
|
||||
BOOST_FOREACH(CTransaction& tx, vtx)
|
||||
{
|
||||
CDiskTxPos posThisTx(pindex->nFile, pindex->nBlockPos, nTxPos);
|
||||
nTxPos += ::GetSerializeSize(tx, SER_DISK);
|
||||
|
||||
if (!tx.ConnectInputs(txdb, mapUnused, posThisTx, pindex, nFees, true, false))
|
||||
if (!tx.ConnectInputs(txdb, mapQueuedChanges, posThisTx, pindex, nFees, true, false))
|
||||
return false;
|
||||
}
|
||||
// Write queued txindex changes
|
||||
for (map<uint256, CTxIndex>::iterator mi = mapQueuedChanges.begin(); mi != mapQueuedChanges.end(); ++mi)
|
||||
{
|
||||
if (!txdb.UpdateTxIndex((*mi).first, (*mi).second))
|
||||
return error("ConnectBlock() : UpdateTxIndex failed");
|
||||
}
|
||||
|
||||
if (vtx[0].GetValueOut() > GetBlockValue(pindex->nHeight, nFees))
|
||||
return false;
|
||||
|
||||
36
src/net.cpp
36
src/net.cpp
@@ -443,6 +443,10 @@ bool AddAddress(CAddress addr, int64 nTimePenalty, CAddrDB *pAddrDB)
|
||||
if (addr.ip == addrLocalHost.ip)
|
||||
return false;
|
||||
addr.nTime = max((int64)0, (int64)addr.nTime - nTimePenalty);
|
||||
bool fUpdated = false;
|
||||
bool fNew = false;
|
||||
CAddress addrFound = addr;
|
||||
|
||||
CRITICAL_BLOCK(cs_mapAddresses)
|
||||
{
|
||||
map<vector<unsigned char>, CAddress>::iterator it = mapAddresses.find(addr.GetKey());
|
||||
@@ -451,16 +455,12 @@ bool AddAddress(CAddress addr, int64 nTimePenalty, CAddrDB *pAddrDB)
|
||||
// New address
|
||||
printf("AddAddress(%s)\n", addr.ToString().c_str());
|
||||
mapAddresses.insert(make_pair(addr.GetKey(), addr));
|
||||
if (pAddrDB)
|
||||
pAddrDB->WriteAddress(addr);
|
||||
else
|
||||
CAddrDB().WriteAddress(addr);
|
||||
return true;
|
||||
fUpdated = true;
|
||||
fNew = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool fUpdated = false;
|
||||
CAddress& addrFound = (*it).second;
|
||||
addrFound = (*it).second;
|
||||
if ((addrFound.nServices | addr.nServices) != addrFound.nServices)
|
||||
{
|
||||
// Services have been added
|
||||
@@ -475,16 +475,22 @@ bool AddAddress(CAddress addr, int64 nTimePenalty, CAddrDB *pAddrDB)
|
||||
addrFound.nTime = addr.nTime;
|
||||
fUpdated = true;
|
||||
}
|
||||
if (fUpdated)
|
||||
{
|
||||
if (pAddrDB)
|
||||
pAddrDB->WriteAddress(addrFound);
|
||||
else
|
||||
CAddrDB().WriteAddress(addrFound);
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
// There is a nasty deadlock bug if this is done inside the cs_mapAddresses
|
||||
// CRITICAL_BLOCK:
|
||||
// Thread 1: begin db transaction (locks inside-db-mutex)
|
||||
// then AddAddress (locks cs_mapAddresses)
|
||||
// Thread 2: AddAddress (locks cs_mapAddresses)
|
||||
// ... then db operation hangs waiting for inside-db-mutex
|
||||
if (fUpdated)
|
||||
{
|
||||
if (pAddrDB)
|
||||
pAddrDB->WriteAddress(addrFound);
|
||||
else
|
||||
CAddrDB().WriteAddress(addrFound);
|
||||
}
|
||||
return fNew;
|
||||
}
|
||||
|
||||
void AddressCurrentlyConnected(const CAddress& addr)
|
||||
|
||||
@@ -1805,7 +1805,11 @@ void SetStartOnSystemStartup(bool fAutoStart)
|
||||
{
|
||||
if (!fAutoStart)
|
||||
{
|
||||
#if defined(BOOST_FILESYSTEM_VERSION) && BOOST_FILESYSTEM_VERSION >= 3
|
||||
unlink(GetAutostartFilePath().string().c_str());
|
||||
#else
|
||||
unlink(GetAutostartFilePath().native_file_string().c_str());
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user