mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-18 22:35:39 +01:00
Some fixes to CNetMessage processing
* Change CNode::vRecvMsg to be a deque instead of a vector (less copying) * Make sure to acquire cs_vRecvMsg in CNode::CloseSocketDisconnect (as it may be called without that lock).
This commit is contained in:
committed by
Pieter Wuille
parent
b9ff2970b9
commit
967f24590b
28
src/main.cpp
28
src/main.cpp
@@ -3708,8 +3708,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
// requires LOCK(cs_vRecvMsg)
|
||||
bool ProcessMessages(CNode* pfrom)
|
||||
{
|
||||
if (pfrom->vRecvMsg.empty())
|
||||
return true;
|
||||
//if (fDebug)
|
||||
// printf("ProcessMessages(%zu messages)\n", pfrom->vRecvMsg.size());
|
||||
|
||||
@@ -3721,29 +3719,34 @@ bool ProcessMessages(CNode* pfrom)
|
||||
// (4) checksum
|
||||
// (x) data
|
||||
//
|
||||
bool fOk = true;
|
||||
|
||||
unsigned int nMsgPos = 0;
|
||||
for (; nMsgPos < pfrom->vRecvMsg.size(); nMsgPos++)
|
||||
{
|
||||
std::deque<CNetMessage>::iterator it = pfrom->vRecvMsg.begin();
|
||||
while (it != pfrom->vRecvMsg.end()) {
|
||||
// Don't bother if send buffer is too full to respond anyway
|
||||
if (pfrom->vSend.size() >= SendBufferSize())
|
||||
break;
|
||||
|
||||
// get next message; end, if an incomplete message is found
|
||||
CNetMessage& msg = pfrom->vRecvMsg[nMsgPos];
|
||||
// get next message
|
||||
CNetMessage& msg = *it;
|
||||
|
||||
//if (fDebug)
|
||||
// printf("ProcessMessages(message %u msgsz, %zu bytes, complete:%s)\n",
|
||||
// msg.hdr.nMessageSize, msg.vRecv.size(),
|
||||
// msg.complete() ? "Y" : "N");
|
||||
|
||||
// end, if an incomplete message is found
|
||||
if (!msg.complete())
|
||||
break;
|
||||
|
||||
// at this point, any failure means we can delete the current message
|
||||
it++;
|
||||
|
||||
// Scan for message start
|
||||
if (memcmp(msg.hdr.pchMessageStart, pchMessageStart, sizeof(pchMessageStart)) != 0) {
|
||||
printf("\n\nPROCESSMESSAGE: INVALID MESSAGESTART\n\n");
|
||||
return false;
|
||||
fOk = false;
|
||||
break;
|
||||
}
|
||||
|
||||
// Read header
|
||||
@@ -3779,7 +3782,7 @@ bool ProcessMessages(CNode* pfrom)
|
||||
fRet = ProcessMessage(pfrom, strCommand, vRecv);
|
||||
}
|
||||
if (fShutdown)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
catch (std::ios_base::failure& e)
|
||||
{
|
||||
@@ -3808,11 +3811,8 @@ bool ProcessMessages(CNode* pfrom)
|
||||
printf("ProcessMessage(%s, %u bytes) FAILED\n", strCommand.c_str(), nMessageSize);
|
||||
}
|
||||
|
||||
// remove processed messages; one incomplete message may remain
|
||||
if (nMsgPos > 0)
|
||||
pfrom->vRecvMsg.erase(pfrom->vRecvMsg.begin(),
|
||||
pfrom->vRecvMsg.begin() + nMsgPos);
|
||||
return true;
|
||||
pfrom->vRecvMsg.erase(pfrom->vRecvMsg.begin(), it);
|
||||
return fOk;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user