From a75a7547b4ea104208e222e521f44471ba7669e5 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Fri, 24 Oct 2014 17:11:23 -0700 Subject: Deadlock fix... --- testnet/SimNetSocketManager.cpp | 20 ++++++++++++-------- testnet/SimNetSocketManager.hpp | 6 +++--- 2 files changed, 15 insertions(+), 11 deletions(-) (limited to 'testnet') diff --git a/testnet/SimNetSocketManager.cpp b/testnet/SimNetSocketManager.cpp index c75c864f..a520f5ca 100644 --- a/testnet/SimNetSocketManager.cpp +++ b/testnet/SimNetSocketManager.cpp @@ -73,23 +73,27 @@ bool SimNetSocketManager::send(const InetAddress &to,bool tcp,bool autoConnectTc void SimNetSocketManager::poll(unsigned long timeout,void (*handler)(const SharedPtr &,void *,const InetAddress &,Buffer &),void *arg) { + std::vector< std::pair< InetAddress,Buffer > > inb; + { Mutex::Lock _l(_inbox_m); - while (!_inbox.empty()) { - handler(_mySocket,arg,_inbox.front().first,_inbox.front().second); - _inbox.pop(); - } + inb = _inbox; + _inbox.clear(); } + for(std::vector< std::pair< InetAddress,Buffer > >::iterator i(inb.begin());i!=inb.end();++i) + handler(_mySocket,arg,i->first,i->second); + if (timeout) _waitCond.wait(timeout); else _waitCond.wait(); + { Mutex::Lock _l(_inbox_m); - while (!_inbox.empty()) { - handler(_mySocket,arg,_inbox.front().first,_inbox.front().second); - _inbox.pop(); - } + inb = _inbox; + _inbox.clear(); } + for(std::vector< std::pair< InetAddress,Buffer > >::iterator i(inb.begin());i!=inb.end();++i) + handler(_mySocket,arg,i->first,i->second); } void SimNetSocketManager::whack() diff --git a/testnet/SimNetSocketManager.hpp b/testnet/SimNetSocketManager.hpp index 69f49556..82092b78 100644 --- a/testnet/SimNetSocketManager.hpp +++ b/testnet/SimNetSocketManager.hpp @@ -30,7 +30,7 @@ #include #include -#include +#include #include "../node/Constants.hpp" #include "../node/SocketManager.hpp" @@ -98,7 +98,7 @@ public: { { Mutex::Lock _l(_inbox_m); - _inbox.push(std::pair< InetAddress,Buffer >(from,Buffer(data,len))); + _inbox.push_back(std::pair< InetAddress,Buffer >(from,Buffer(data,len))); } _waitCond.signal(); } @@ -116,7 +116,7 @@ private: SharedPtr _mySocket; TransferStats _totals; - std::queue< std::pair< InetAddress,Buffer > > _inbox; + std::vector< std::pair< InetAddress,Buffer > > _inbox; Mutex _inbox_m; std::map< InetAddress,TransferStats > _stats; -- cgit v1.2.3