From 87bd9ed78f84e68a79cdedb4eb163605bd2702ca Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sun, 3 Mar 2013 05:54:40 -0800 Subject: [PATCH] Quick and dirty fix for deadlock. We have code that holds the ioMutex and acquires the mPeerLock but also code that holds the mPeerLock but acquires the ioMutex. --- src/cpp/ripple/ConnectionPool.cpp | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/src/cpp/ripple/ConnectionPool.cpp b/src/cpp/ripple/ConnectionPool.cpp index 7bbfc9e15..3d184d4cd 100644 --- a/src/cpp/ripple/ConnectionPool.cpp +++ b/src/cpp/ripple/ConnectionPool.cpp @@ -235,14 +235,10 @@ void ConnectionPool::policyHandler(const boost::system::error_code& ecResult) int ConnectionPool::relayMessage(Peer* fromPeer, const PackedMessage::pointer& msg) { int sentTo = 0; - boost::recursive_mutex::scoped_lock sl(mPeerLock); - - BOOST_FOREACH(const vtConMap& pair, mConnectedMap) + std::vector peerVector = getPeerVector(); + BOOST_FOREACH(Peer::ref peer, peerVector) { - Peer::ref peer = pair.second; - if (!peer) - std::cerr << "CP::RM null peer in list" << std::endl; - else if ((!fromPeer || !(peer.get() == fromPeer)) && peer->isConnected()) + if ((!fromPeer || !(peer.get() == fromPeer)) && peer->isConnected()) { ++sentTo; peer->sendPacket(msg); @@ -254,11 +250,9 @@ int ConnectionPool::relayMessage(Peer* fromPeer, const PackedMessage::pointer& m void ConnectionPool::relayMessageBut(const std::set& fromPeers, const PackedMessage::pointer& msg) { // Relay message to all but the specified peers - boost::recursive_mutex::scoped_lock sl(mPeerLock); - - BOOST_FOREACH(const vtConMap& pair, mConnectedMap) + std::vector peerVector = getPeerVector(); + BOOST_FOREACH(Peer::ref peer, peerVector) { - Peer::ref peer = pair.second; if (peer->isConnected() && (fromPeers.count(peer->getPeerId()) == 0)) peer->sendPacket(msg); } @@ -267,13 +261,11 @@ void ConnectionPool::relayMessageBut(const std::set& fromPeers, const Pa void ConnectionPool::relayMessageTo(const std::set& fromPeers, const PackedMessage::pointer& msg) { // Relay message to the specified peers - boost::recursive_mutex::scoped_lock sl(mPeerLock); - - BOOST_FOREACH(const uint64& peerID, fromPeers) + std::vector peerVector = getPeerVector(); + BOOST_FOREACH(Peer::ref peer, peerVector) { - const boost::unordered_map::iterator& it = mPeerIdMap.find(peerID); - if ((it != mPeerIdMap.end()) && it->second->isConnected()) - it->second->sendPacket(msg); + if (peer->isConnected() && (fromPeers.count(peer->getPeerId()) != 0)) + peer->sendPacket(msg); } }