From a67756703c97c56319db332514f07cd8a5c39f2e Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Thu, 14 Jun 2012 09:29:55 -0700 Subject: [PATCH 1/4] Get rid of more references to boost trivial. --- src/Application.cpp | 2 -- src/Peer.cpp | 1 - src/PeerDoor.cpp | 1 - src/RPCDoor.cpp | 1 - 4 files changed, 5 deletions(-) diff --git a/src/Application.cpp b/src/Application.cpp index cb1e6547c5..cf6809392a 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -1,8 +1,6 @@ #include -//#include - #include "../database/SqliteDatabase.h" #include "Application.h" diff --git a/src/Peer.cpp b/src/Peer.cpp index 54e6f2d0c4..72d2719531 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -5,7 +5,6 @@ #include #include #include -//#include #include "../json/writer.h" diff --git a/src/PeerDoor.cpp b/src/PeerDoor.cpp index b10e17110d..3ed7a6bd02 100644 --- a/src/PeerDoor.cpp +++ b/src/PeerDoor.cpp @@ -5,7 +5,6 @@ #include #include -//#include #include "Application.h" #include "Config.h" diff --git a/src/RPCDoor.cpp b/src/RPCDoor.cpp index 510e46f48c..b3ea1eaac0 100644 --- a/src/RPCDoor.cpp +++ b/src/RPCDoor.cpp @@ -2,7 +2,6 @@ #include "Application.h" #include "Config.h" #include -//#include #include using namespace std; From 834ecf9b5b4fa442342c74f774b59b29afca58fb Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Thu, 14 Jun 2012 11:50:26 -0700 Subject: [PATCH 2/4] Import websocketpp. --- .gitmodules | 3 +++ websocketpp | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 websocketpp diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..81a8a9de01 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "websocketpp"] + path = websocketpp + url = https://github.com/zaphoyd/websocketpp.git diff --git a/websocketpp b/websocketpp new file mode 160000 index 0000000000..f78b9df4ad --- /dev/null +++ b/websocketpp @@ -0,0 +1 @@ +Subproject commit f78b9df4adbc354f5fdf8c2c8b9e76549f977cb8 From e26c8f93cf9874913c5f040c14c57e1526b41650 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Thu, 14 Jun 2012 16:50:45 -0700 Subject: [PATCH 3/4] Add websocketpp to build. --- SConstruct | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/SConstruct b/SConstruct index c8277446ed..b6e2809475 100644 --- a/SConstruct +++ b/SConstruct @@ -24,7 +24,7 @@ env.Replace(CTAGS = CTAGS, CTAGSOPTIONS = '--tag-relative') # # Put objects files in their own directory. # -for dir in ['src', 'database', 'json', 'util']: +for dir in ['src', 'database', 'json', 'websocketpp']: VariantDir('obj/'+dir, dir, duplicate=0) # Use openssl @@ -49,10 +49,21 @@ env.Append(LINKFLAGS = ['-rdynamic', '-pthread']) env.Append(CCFLAGS = ['-pthread', '-Wall', '-Wno-sign-compare', '-Wno-char-subscripts', '-DSQLITE_THREADSAFE']) env.Append(CXXFLAGS = ['-O0', '-pthread', '-Wno-invalid-offsetof', '-Wformat']+BOOSTFLAGS+DEBUGFLAGS) -DB_SRCS = glob.glob('database/*.c') + glob.glob('database/*.cpp') -JSON_SRCS = glob.glob('json/*.cpp') -NEWCOIN_SRCS = glob.glob('src/*.cpp') -PROTO_SRCS = env.Protoc([], 'src/newcoin.proto', PROTOCOUTDIR='obj', PROTOCPYTHONOUTDIR=None) +DB_SRCS = glob.glob('database/*.c') + glob.glob('database/*.cpp') +JSON_SRCS = glob.glob('json/*.cpp') +WEBSOCKETPP_SRCS = [ + 'websocketpp/src/base64/base64.cpp', + 'websocketpp/src/md5/md5.c', + 'websocketpp/src/messages/data.cpp', + 'websocketpp/src/network_utilities.cpp', + 'websocketpp/src/processors/hybi_header.cpp', + 'websocketpp/src/processors/hybi_util.cpp', + 'websocketpp/src/sha1/sha1.cpp', + 'websocketpp/src/uri.cpp' + ] + +NEWCOIN_SRCS = glob.glob('src/*.cpp') +PROTO_SRCS = env.Protoc([], 'src/newcoin.proto', PROTOCOUTDIR='obj', PROTOCPYTHONOUTDIR=None) env.Clean(PROTO_SRCS, 'site_scons/site_tools/protoc.pyc') @@ -62,7 +73,7 @@ UNUSED_SRCS = ['src/HttpReply.cpp', 'src/ValidationCollection.cpp'] for file in UNUSED_SRCS: NEWCOIN_SRCS.remove(file) -NEWCOIN_SRCS += DB_SRCS + JSON_SRCS +NEWCOIN_SRCS += DB_SRCS + JSON_SRCS + WEBSOCKETPP_SRCS # Derive the object files from the source files. NEWCOIN_OBJS = [] From 83640b987a79b7c7e31fe0228aed84d0ed224133 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Thu, 14 Jun 2012 16:51:46 -0700 Subject: [PATCH 4/4] Add more locking to ConnectionPool. --- src/ConnectionPool.cpp | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/src/ConnectionPool.cpp b/src/ConnectionPool.cpp index 11f32f587f..cc42b41a61 100644 --- a/src/ConnectionPool.cpp +++ b/src/ConnectionPool.cpp @@ -66,18 +66,22 @@ bool ConnectionPool::savePeer(const std::string& strIp, int iPort,char code) Database* db = theApp->getWalletDB()->getDB(); std::string ipPort=db->escape(str(boost::format("%s %d") % strIp % iPort)); - + ScopedLock sl(theApp->getWalletDB()->getDBLock()); std::string sql=str(boost::format("SELECT count(*) FROM PeerIps WHERE IpPort=%s;") % ipPort); - if(db->executeSQL(sql) && db->startIterRows()) + if (db->executeSQL(sql) && db->startIterRows()) { - if( db->getInt(0)==0) + if ( db->getInt(0)==0) { db->executeSQL(str(boost::format("INSERT INTO PeerIps (IpPort,Score,Source) values (%s,0,'%c');") % ipPort % code)); return true; }// else we already had this peer - }else std::cout << "Error saving Peer" << std::endl; - + } + else + { + std::cout << "Error saving Peer" << std::endl; + } + return false; } @@ -86,15 +90,19 @@ bool ConnectionPool::peerAvailable(std::string& strIp, int& iPort) Database* db = theApp->getWalletDB()->getDB(); std::vector vstrIpPort; - vstrIpPort.reserve(mIpMap.size()); - - pipPeer ipPeer; - BOOST_FOREACH(ipPeer, mIpMap) { - std::string& strIp = ipPeer.first.first; - int iPort = ipPeer.first.second; + boost::mutex::scoped_lock sl(mPeerLock); + pipPeer ipPeer; - vstrIpPort.push_back(db->escape(str(boost::format("%s %d") % strIp % iPort))); + vstrIpPort.reserve(mIpMap.size()); + + BOOST_FOREACH(ipPeer, mIpMap) + { + std::string& strIp = ipPeer.first.first; + int iPort = ipPeer.first.second; + + vstrIpPort.push_back(db->escape(str(boost::format("%s %d") % strIp % iPort))); + } } std::string strIpPort; @@ -158,6 +166,8 @@ void ConnectionPool::policyEnforce() // XXX Broken: also don't send a message to a peer if we got it from the peer. void ConnectionPool::relayMessage(Peer* fromPeer, PackedMessage::pointer msg) { + boost::mutex::scoped_lock sl(mPeerLock); + BOOST_FOREACH(naPeer pair, mConnectedMap) { Peer::pointer peer = pair.second; @@ -244,6 +254,8 @@ Json::Value ConnectionPool::getPeersJson() { Json::Value ret(Json::arrayValue); + boost::mutex::scoped_lock sl(mPeerLock); + BOOST_FOREACH(naPeer pair, mConnectedMap) { Peer::pointer peer = pair.second; @@ -258,6 +270,9 @@ Json::Value ConnectionPool::getPeersJson() std::vector ConnectionPool::getPeerVector() { std::vector ret; + + boost::mutex::scoped_lock sl(mPeerLock); + ret.reserve(mConnectedMap.size()); BOOST_FOREACH(naPeer pair, mConnectedMap) @@ -283,6 +298,8 @@ bool ConnectionPool::peerConnected(Peer::pointer peer, const NewcoinAddress& na) } else { + boost::mutex::scoped_lock sl(mPeerLock); + mConnectedMap[na] = peer; bSuccess = true; }