Fix a deadlock.

This commit is contained in:
JoelKatz
2013-01-11 15:50:18 -08:00
parent 9880b23e7f
commit 9d0264a603

View File

@@ -363,28 +363,28 @@ void Peer::handleReadHeader(const boost::system::error_code& error)
void Peer::handleReadBody(const boost::system::error_code& error) void Peer::handleReadBody(const boost::system::error_code& error)
{ {
boost::recursive_mutex::scoped_lock sl(ioMutex); {
boost::recursive_mutex::scoped_lock sl(ioMutex);
if (mDetaching) if (mDetaching)
{ {
// Drop data or error if detaching. return;
nothing(); }
} else if (error)
else if (!error) {
{ cLog(lsINFO) << "Peer: Body: Error: " << ADDRESS(this) << ": " << error.category().name() << ": " << error.message() << ": " << error;
processReadBuffer(); boost::recursive_mutex::scoped_lock sl(theApp->getMasterLock());
startReadHeader(); detach("hrb");
} return;
else }
{
cLog(lsINFO) << "Peer: Body: Error: " << ADDRESS(this) << ": " << error.category().name() << ": " << error.message() << ": " << error;
boost::recursive_mutex::scoped_lock sl(theApp->getMasterLock());
detach("hrb");
} }
processReadBuffer();
startReadHeader();
} }
void Peer::processReadBuffer() void Peer::processReadBuffer()
{ { // must not hold peer lock
int type = PackedMessage::getType(mReadbuf); int type = PackedMessage::getType(mReadbuf);
#ifdef DEBUG #ifdef DEBUG
// std::cerr << "PRB(" << type << "), len=" << (mReadbuf.size()-HEADER_SIZE) << std::endl; // std::cerr << "PRB(" << type << "), len=" << (mReadbuf.size()-HEADER_SIZE) << std::endl;