From 96286afca6afad05c7f879021e438a9cdc578b8b Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Thu, 14 Mar 2013 19:33:48 -0700 Subject: [PATCH 01/17] JS: Add ImmediateOrCancel and FillOrKill to Transaction flags. --- src/js/transaction.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/js/transaction.js b/src/js/transaction.js index ee82d0bb7..c838d212a 100644 --- a/src/js/transaction.js +++ b/src/js/transaction.js @@ -110,6 +110,8 @@ Transaction.fees = { Transaction.flags = { 'OfferCreate' : { 'Passive' : 0x00010000, + 'ImmediateOrCancel' : 0x00020000, + 'FillOrKill' : 0x00040000, }, 'Payment' : { From 1bca0154da4d3f3ec364cb0fc3b36efb0493e9c0 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Thu, 14 Mar 2013 20:38:50 -0700 Subject: [PATCH 02/17] JS: Export Transaction. --- src/js/index.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/js/index.js b/src/js/index.js index 05ec1f842..7f56be200 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -1,10 +1,11 @@ -exports.Remote = require('./remote').Remote; -exports.Amount = require('./amount').Amount; -exports.Currency = require('./currency').Currency; -exports.UInt160 = require('./amount').UInt160; -exports.Seed = require('./amount').Seed; +exports.Remote = require('./remote').Remote; +exports.Amount = require('./amount').Amount; +exports.Currency = require('./currency').Currency; +exports.UInt160 = require('./amount').UInt160; +exports.Seed = require('./amount').Seed; +exports.Transaction = require('./amount').Transaction; -exports.utils = require('./utils'); +exports.utils = require('./utils'); // Important: We do not guarantee any specific version of SJCL or for any // specific features to be included. The version and configuration may change at @@ -13,6 +14,8 @@ exports.utils = require('./utils'); // However, for programs that are tied to a specific version of ripple.js like // the official client, it makes sense to expose the SJCL instance so we don't // have to include it twice. -exports.sjcl = require('../../build/sjcl'); +exports.sjcl = require('../../build/sjcl'); -exports.config = require('./config'); +exports.config = require('./config'); + +// vim:sw=2:sts=2:ts=8:et From 1ceb383eb3abae5c086440f2b3913268276f27df Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Thu, 14 Mar 2013 20:56:22 -0700 Subject: [PATCH 03/17] JS: Fix access to Transaction. --- src/js/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/index.js b/src/js/index.js index 7f56be200..175c27750 100644 --- a/src/js/index.js +++ b/src/js/index.js @@ -3,7 +3,7 @@ exports.Amount = require('./amount').Amount; exports.Currency = require('./currency').Currency; exports.UInt160 = require('./amount').UInt160; exports.Seed = require('./amount').Seed; -exports.Transaction = require('./amount').Transaction; +exports.Transaction = require('./transaction').Transaction; exports.utils = require('./utils'); From a8552ec4f68aa4adaf2ba4ca677c1a409de80fb0 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 15 Mar 2013 01:19:49 -0700 Subject: [PATCH 04/17] Fix a ledger acquire race that caused a crash. --- src/cpp/ripple/LedgerAcquire.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/cpp/ripple/LedgerAcquire.cpp b/src/cpp/ripple/LedgerAcquire.cpp index 1a299fbe8..6d0473307 100644 --- a/src/cpp/ripple/LedgerAcquire.cpp +++ b/src/cpp/ripple/LedgerAcquire.cpp @@ -281,6 +281,7 @@ bool LedgerAcquire::addOnComplete(boost::function void LedgerAcquire::trigger(Peer::ref peer) { + boost::recursive_mutex::scoped_lock sl(mLock); if (mAborted || mComplete || mFailed) { cLog(lsTRACE) << "Trigger on ledger:" << @@ -585,7 +586,8 @@ bool LedgerAcquire::takeBase(const std::string& data) // data must not have hash cLog(lsTRACE) << "got base acquiring ledger " << mHash; #endif boost::recursive_mutex::scoped_lock sl(mLock); - if (mHaveBase) return true; + if (mHaveBase) + return true; mLedger = boost::make_shared(data, false); if (mLedger->getHash() != mHash) { @@ -616,8 +618,11 @@ bool LedgerAcquire::takeBase(const std::string& data) // data must not have hash bool LedgerAcquire::takeTxNode(const std::list& nodeIDs, const std::list< std::vector >& data, SMAddNode& san) { + boost::recursive_mutex::scoped_lock sl(mLock); if (!mHaveBase) return false; + if (mHaveTransactions) + return true; std::list::const_iterator nodeIDit = nodeIDs.begin(); std::list< std::vector >::const_iterator nodeDatait = data.begin(); @@ -657,11 +662,14 @@ bool LedgerAcquire::takeAsNode(const std::list& nodeIDs, cLog(lsTRACE) << "got ASdata (" << nodeIDs.size() <<") acquiring ledger " << mHash; tLog(nodeIDs.size() == 1, lsTRACE) << "got AS node: " << nodeIDs.front(); + boost::recursive_mutex::scoped_lock sl(mLock); if (!mHaveBase) { cLog(lsWARNING) << "Don't have ledger base"; return false; } + if (mHaveState) + return true; std::list::const_iterator nodeIDit = nodeIDs.begin(); std::list< std::vector >::const_iterator nodeDatait = data.begin(); @@ -700,6 +708,7 @@ bool LedgerAcquire::takeAsNode(const std::list& nodeIDs, bool LedgerAcquire::takeAsRootNode(const std::vector& data, SMAddNode& san) { + boost::recursive_mutex::scoped_lock sl(mLock); if (!mHaveBase) return false; AccountStateSF tFilter(mLedger->getLedgerSeq()); @@ -709,6 +718,7 @@ bool LedgerAcquire::takeAsRootNode(const std::vector& data, SMAdd bool LedgerAcquire::takeTxRootNode(const std::vector& data, SMAddNode& san) { + boost::recursive_mutex::scoped_lock sl(mLock); if (!mHaveBase) return false; TransactionStateSF tFilter(mLedger->getLedgerSeq()); From 4322403987562f28a7ba09289a50e914875c4769 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 15 Mar 2013 02:22:54 -0700 Subject: [PATCH 05/17] Fix unrouted log. --- src/cpp/ripple/Ledger.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index bbd127b65..1d9d678fe 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -474,7 +474,7 @@ void Ledger::saveAcceptedLedger(Job&, bool fromConsensus) sql += ")"; } sql += ";"; - Log(lsTRACE) << "ActTx: " << sql; + cLog(lsTRACE) << "ActTx: " << sql; db->executeSQL(sql); // may already be in there } else From 64b2a50e8bed2713e97754f0eb627011dda06dfd Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 15 Mar 2013 02:25:59 -0700 Subject: [PATCH 06/17] Temporarily disable dropCache. --- src/cpp/ripple/Ledger.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index 1d9d678fe..81e2e4578 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -509,8 +509,10 @@ void Ledger::saveAcceptedLedger(Job&, bool fromConsensus) mAccountHash.GetHex() % mTransHash.GetHex())); } +#if 0 if (!fromConsensus) dropCache(); +#endif if (theApp->getJobQueue().getJobCountTotal(jtPUBOLDLEDGER) < 2) theApp->getLedgerMaster().resumeAcquiring(); From 5f35afc6459303fcfa83b2d7faf9c8e49ff507ad Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 15 Mar 2013 02:38:47 -0700 Subject: [PATCH 07/17] This makes more sense. --- src/cpp/ripple/Ledger.cpp | 27 ++++++------------------ src/cpp/ripple/SerializedTransaction.cpp | 5 +++++ src/cpp/ripple/SerializedTransaction.h | 1 + 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index 81e2e4578..72ae3d5a1 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -455,9 +455,9 @@ void Ledger::saveAcceptedLedger(Job&, bool fromConsensus) const std::vector& accts = vt.second.getAffected(); if (!accts.empty()) { - std::string sql = "INSERT OR REPLACE INTO AccountTransactions (TransID, Account, LedgerSeq) VALUES "; + std::string sql = "INSERT INTO AccountTransactions (TransID, Account, LedgerSeq) VALUES "; bool first = true; - for (std::vector::const_iterator it = accts.begin(), end = accts.end(); it != end; ++it) + for (std::vector::const_iterator it = accts.begin(), end = accts.end(); it != end; ++it) { if (!first) sql += ", ('"; @@ -475,27 +475,13 @@ void Ledger::saveAcceptedLedger(Job&, bool fromConsensus) } sql += ";"; cLog(lsTRACE) << "ActTx: " << sql; - db->executeSQL(sql); // may already be in there + db->executeSQL(sql); } else cLog(lsWARNING) << "Transaction in ledger " << mLedgerSeq << " affects no accounts"; - if (SQL_EXISTS(db, boost::str(transExists % txID.GetHex()))) - { - // In Transactions, update LedgerSeq, metadata and Status. - db->executeSQL(boost::str(updateTx - % getLedgerSeq() - % TXN_SQL_VALIDATED - % vt.second.getEscMeta() - % txID.GetHex())); - } - else - { - // Not in Transactions, insert the whole thing.. - db->executeSQL( - SerializedTransaction::getMetaSQLInsertHeader() + - vt.second.getTxn()->getMetaSQL(getLedgerSeq(), vt.second.getEscMeta()) + ";"); - } + db->executeSQL(SerializedTransaction::getMetaSQLInsertReplaceHeader() + + vt.second.getTxn()->getMetaSQL(getLedgerSeq(), vt.second.getEscMeta()) + ";"); } db->executeSQL("COMMIT TRANSACTION;"); } @@ -505,8 +491,7 @@ void Ledger::saveAcceptedLedger(Job&, bool fromConsensus) theApp->getLedgerDB()->getDB()->executeSQL(boost::str(addLedger % getHash().GetHex() % mLedgerSeq % mParentHash.GetHex() % boost::lexical_cast(mTotCoins) % mCloseTime % mParentCloseTime % - mCloseResolution % mCloseFlags % - mAccountHash.GetHex() % mTransHash.GetHex())); + mCloseResolution % mCloseFlags % mAccountHash.GetHex() % mTransHash.GetHex())); } #if 0 diff --git a/src/cpp/ripple/SerializedTransaction.cpp b/src/cpp/ripple/SerializedTransaction.cpp index 7486e0329..c5a1d1445 100644 --- a/src/cpp/ripple/SerializedTransaction.cpp +++ b/src/cpp/ripple/SerializedTransaction.cpp @@ -236,6 +236,11 @@ std::string SerializedTransaction::getMetaSQLInsertHeader() return "INSERT INTO Transactions " + getMetaSQLValueHeader() + " VALUES "; } +std::string SerializedTransaction::getMetaSQLInsertReplaceHeader() +{ + return "INSERT OR REPLACE INTO Transactions " + getMetaSQLValueHeader() + " VALUES "; +} + std::string SerializedTransaction::getSQL(uint32 inLedger, char status) const { Serializer s; diff --git a/src/cpp/ripple/SerializedTransaction.h b/src/cpp/ripple/SerializedTransaction.h index 8727f19be..5dfc24f27 100644 --- a/src/cpp/ripple/SerializedTransaction.h +++ b/src/cpp/ripple/SerializedTransaction.h @@ -82,6 +82,7 @@ public: // SQL Functions with metadata static std::string getMetaSQLValueHeader(); static std::string getMetaSQLInsertHeader(); + static std::string getMetaSQLInsertReplaceHeader(); std::string getMetaSQL(uint32 inLedger, const std::string& escapedMetaData) const; std::string getMetaSQL(Serializer rawTxn, uint32 inLedger, char status, const std::string& escapedMetaData) const; From 7a76cfe7da3ceb5d2fc5487afa81a5936b87850f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 15 Mar 2013 16:54:27 -0700 Subject: [PATCH 08/17] Fix handling of some edge auto-detect SSL cases. This should fix the Dart issue. --- src/cpp/ripple/AutoSocket.h | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cpp/ripple/AutoSocket.h b/src/cpp/ripple/AutoSocket.h index 1de55e021..7e40e7a6d 100644 --- a/src/cpp/ripple/AutoSocket.h +++ b/src/cpp/ripple/AutoSocket.h @@ -103,7 +103,8 @@ public: else { // autodetect mSocket->next_layer().async_receive(basio::buffer(mBuffer), basio::socket_base::message_peek, - boost::bind(&AutoSocket::handle_autodetect, this, cbFunc, basio::placeholders::error)); + boost::bind(&AutoSocket::handle_autodetect, this, cbFunc, + basio::placeholders::error, basio::placeholders::bytes_transferred)); } } @@ -205,7 +206,7 @@ public: } protected: - void handle_autodetect(callback cbFunc, const error_code& ec) + void handle_autodetect(callback cbFunc, const error_code& ec, size_t bytesTransferred) { if (ec) { @@ -213,15 +214,17 @@ protected: cbFunc(ec); } else if ((mBuffer[0] < 127) && (mBuffer[0] > 31) && - (mBuffer[1] < 127) && (mBuffer[1] > 31) && - (mBuffer[2] < 127) && (mBuffer[2] > 31) && - (mBuffer[3] < 127) && (mBuffer[3] > 31)) + ((bytesTransferred < 2) || ((mBuffer[1] < 127) && (mBuffer[1] > 31))) && + ((bytesTransferred < 3) || ((mBuffer[2] < 127) && (mBuffer[2] > 31))) && + ((bytesTransferred < 4) || ((mBuffer[3] < 127) && (mBuffer[3] > 31)))) { // not ssl + Log(lsTRACE, AutoSocketPartition) << "non-SSL"; mSecure = false; cbFunc(ec); } else { // ssl + Log(lsTRACE, AutoSocketPartition) << "SSL"; mSecure = true; mSocket->async_handshake(ssl_socket::server, cbFunc); } From e392366c63a43c88452ab16e4fa9ac1b8941751b Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 15 Mar 2013 22:34:55 -0700 Subject: [PATCH 09/17] Get ledger acquire work off the main thread and out of the master lock. Prioritize ledger acquire work appripriately. This should help prevent the server from becoming overly sluggish while acquiring ledgers. Still todo: Finish all pending receive operations before sending out any data requests. --- src/cpp/ripple/JobQueue.cpp | 1 + src/cpp/ripple/JobQueue.h | 21 ++++++++++--------- src/cpp/ripple/LedgerAcquire.cpp | 36 +++++++++++++++++++++----------- src/cpp/ripple/LedgerAcquire.h | 2 +- src/cpp/ripple/Peer.cpp | 13 ++++++------ src/cpp/ripple/Peer.h | 2 +- 6 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/cpp/ripple/JobQueue.cpp b/src/cpp/ripple/JobQueue.cpp index 904af7e8e..45114723b 100644 --- a/src/cpp/ripple/JobQueue.cpp +++ b/src/cpp/ripple/JobQueue.cpp @@ -39,6 +39,7 @@ const char* Job::toString(JobType t) case jtVALIDATION_ut: return "untrustedValidation"; case jtPROOFWORK: return "proofOfWork"; case jtPROPOSAL_ut: return "untrustedProposal"; + case jtLEDGER_DATA: return "ledgerData"; case jtCLIENT: return "clientCommand"; case jtTRANSACTION: return "transaction"; case jtPUBLEDGER: return "publishNewLedger"; diff --git a/src/cpp/ripple/JobQueue.h b/src/cpp/ripple/JobQueue.h index bf439cc6e..673499529 100644 --- a/src/cpp/ripple/JobQueue.h +++ b/src/cpp/ripple/JobQueue.h @@ -25,16 +25,17 @@ enum JobType jtVALIDATION_ut = 2, // A validation from an untrusted source jtPROOFWORK = 3, // A proof of work demand from another server jtPROPOSAL_ut = 4, // A proposal from an untrusted source - jtCLIENT = 5, // A websocket command from the client - jtTRANSACTION = 6, // A transaction received from the network - jtPUBLEDGER = 7, // Publish a fully-accepted ledger - jtWAL = 8, // Write-ahead logging - jtVALIDATION_t = 9, // A validation from a trusted source - jtWRITE = 10, // Write out hashed objects - jtTRANSACTION_l = 11, // A local transaction - jtPROPOSAL_t = 12, // A proposal from a trusted source - jtADMIN = 13, // An administrative operation - jtDEATH = 14, // job of death, used internally + jtLEDGER_DATA = 5, // Received data for a ledger we're acquiring + jtCLIENT = 6, // A websocket command from the client + jtTRANSACTION = 7, // A transaction received from the network + jtPUBLEDGER = 8, // Publish a fully-accepted ledger + jtWAL = 9, // Write-ahead logging + jtVALIDATION_t = 10, // A validation from a trusted source + jtWRITE = 11, // Write out hashed objects + jtTRANSACTION_l = 12, // A local transaction + jtPROPOSAL_t = 13, // A proposal from a trusted source + jtADMIN = 14, // An administrative operation + jtDEATH = 15, // job of death, used internally // special types not dispatched by the job pool jtPEER = 24, diff --git a/src/cpp/ripple/LedgerAcquire.cpp b/src/cpp/ripple/LedgerAcquire.cpp index 6d0473307..0dc34887e 100644 --- a/src/cpp/ripple/LedgerAcquire.cpp +++ b/src/cpp/ripple/LedgerAcquire.cpp @@ -477,6 +477,7 @@ void LedgerAcquire::trigger(Peer::ref peer) { cLog(lsDEBUG) << "Done:" << (mComplete ? " complete" : "") << (mFailed ? " failed " : " ") << mLedger->getLedgerSeq(); + sl.unlock(); done(); } } @@ -830,13 +831,19 @@ void LedgerAcquireMaster::dropLedger(const uint256& hash) mLedgers.erase(hash); } -SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer::ref peer) +void LedgerAcquireMaster::gotLedgerData(Job&, boost::shared_ptr packet_ptr, + boost::weak_ptr wPeer) { + ripple::TMLedgerData& packet = *packet_ptr; + Peer::pointer peer = wPeer.lock(); + if (!peer) + return; + uint256 hash; if (packet.ledgerhash().size() != 32) { - std::cerr << "Acquire error" << std::endl; - return SMAddNode::invalid(); + peer->punishPeer(LT_InvalidRequest); + return; } memcpy(hash.begin(), packet.ledgerhash().data(), 32); cLog(lsTRACE) << "Got data (" << packet.nodes().size() << ") for acquiring ledger: " << hash; @@ -845,7 +852,8 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer: if (!ledger) { cLog(lsINFO) << "Got data for ledger we're not acquiring"; - return SMAddNode(); + peer->punishPeer(LT_InvalidRequest); + return; } if (packet.type() == ripple::liBASE) @@ -853,12 +861,14 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer: if (packet.nodes_size() < 1) { cLog(lsWARNING) << "Got empty base data"; - return SMAddNode::invalid(); + peer->punishPeer(LT_InvalidRequest); + return; } if (!ledger->takeBase(packet.nodes(0).nodedata())) { cLog(lsWARNING) << "Got invalid base data"; - return SMAddNode::invalid(); + peer->punishPeer(LT_InvalidRequest); + return; } SMAddNode san = SMAddNode::useful(); if ((packet.nodes().size() > 1) && !ledger->takeAsRootNode(strCopy(packet.nodes(1).nodedata()), san)) @@ -871,7 +881,7 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer: } if (!san.isInvalid()) ledger->trigger(peer); - return san; + return; } if ((packet.type() == ripple::liTX_NODE) || (packet.type() == ripple::liAS_NODE)) @@ -882,7 +892,8 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer: if (packet.nodes().size() <= 0) { cLog(lsINFO) << "Got response with no nodes"; - return SMAddNode::invalid(); + peer->punishPeer(LT_InvalidRequest); + return; } for (int i = 0; i < packet.nodes().size(); ++i) { @@ -890,7 +901,8 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer: if (!node.has_nodeid() || !node.has_nodedata()) { cLog(lsWARNING) << "Got bad node"; - return SMAddNode::invalid(); + peer->punishPeer(LT_InvalidRequest); + return; } nodeIDs.push_back(SHAMapNode(node.nodeid().data(), node.nodeid().size())); @@ -902,12 +914,12 @@ SMAddNode LedgerAcquireMaster::gotLedgerData(ripple::TMLedgerData& packet, Peer: else ledger->takeAsNode(nodeIDs, nodeData, ret); if (!ret.isInvalid()) - ledger->trigger(peer); - return ret; + ledger->trigger(peer); + return; } cLog(lsWARNING) << "Not sure what ledger data we got"; - return SMAddNode::invalid(); + peer->punishPeer(LT_InvalidRequest); } void LedgerAcquireMaster::sweep() diff --git a/src/cpp/ripple/LedgerAcquire.h b/src/cpp/ripple/LedgerAcquire.h index 28c8434a0..78ab42994 100644 --- a/src/cpp/ripple/LedgerAcquire.h +++ b/src/cpp/ripple/LedgerAcquire.h @@ -147,7 +147,7 @@ public: LedgerAcquire::pointer find(const uint256& hash); bool hasLedger(const uint256& ledgerHash); void dropLedger(const uint256& ledgerHash); - SMAddNode gotLedgerData(ripple::TMLedgerData& packet, Peer::ref); + void gotLedgerData(Job&, boost::shared_ptr packet, boost::weak_ptr peer); int getFetchCount(int& timeoutCount); void logFailure(const uint256& h) { mRecentFailures.add(h); } diff --git a/src/cpp/ripple/Peer.cpp b/src/cpp/ripple/Peer.cpp index d13e1bce6..51cb14a49 100644 --- a/src/cpp/ripple/Peer.cpp +++ b/src/cpp/ripple/Peer.cpp @@ -590,8 +590,8 @@ void Peer::processReadBuffer() case ripple::mtLEDGER_DATA: { event->reName("Peer::ledgerdata"); - ripple::TMLedgerData msg; - if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + boost::shared_ptr msg = boost::make_shared(); + if (msg->ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) recvLedger(msg); else cLog(lsWARNING) << "parse error: " << type; @@ -1606,8 +1606,9 @@ void Peer::recvGetLedger(ripple::TMGetLedger& packet) sendPacket(oPacket, true); } -void Peer::recvLedger(ripple::TMLedgerData& packet) +void Peer::recvLedger(const boost::shared_ptr& packet_ptr) { + ripple::TMLedgerData& packet = *packet_ptr; if (packet.nodes().size() <= 0) { cLog(lsWARNING) << "Ledger/TXset data with no nodes"; @@ -1664,9 +1665,9 @@ void Peer::recvLedger(ripple::TMLedgerData& packet) return; } - SMAddNode san = theApp->getMasterLedgerAcquire().gotLedgerData(packet, shared_from_this()); - if (san.isInvalid()) - punishPeer(LT_UnwantedData); + theApp->getJobQueue().addJob(jtLEDGER_DATA, "gotLedgerData", + boost::bind(&LedgerAcquireMaster::gotLedgerData, &theApp->getMasterLedgerAcquire(), + _1, packet_ptr, boost::weak_ptr(shared_from_this()))); } bool Peer::hasLedger(const uint256& hash) const diff --git a/src/cpp/ripple/Peer.h b/src/cpp/ripple/Peer.h index a8fef6b6f..1244a5170 100644 --- a/src/cpp/ripple/Peer.h +++ b/src/cpp/ripple/Peer.h @@ -99,7 +99,7 @@ protected: void recvGetAccount(ripple::TMGetAccount& packet); void recvAccount(ripple::TMAccount& packet); void recvGetLedger(ripple::TMGetLedger& packet); - void recvLedger(ripple::TMLedgerData& packet); + void recvLedger(const boost::shared_ptr& packet); void recvStatus(ripple::TMStatusChange& packet); void recvPropose(const boost::shared_ptr& packet); void recvHaveTxSet(ripple::TMHaveTransactionSet& packet); From f222544048b7bd9b70ada61e0300e9a02338e265 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 15 Mar 2013 22:50:26 -0700 Subject: [PATCH 10/17] Do the same thing for timer entry. --- src/cpp/ripple/LedgerAcquire.cpp | 7 ++++++- src/cpp/ripple/LedgerAcquire.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/cpp/ripple/LedgerAcquire.cpp b/src/cpp/ripple/LedgerAcquire.cpp index 0dc34887e..7db1a20af 100644 --- a/src/cpp/ripple/LedgerAcquire.cpp +++ b/src/cpp/ripple/LedgerAcquire.cpp @@ -48,6 +48,7 @@ void PeerSet::setTimer() void PeerSet::invokeOnTimer() { + boost::recursive_mutex::scoped_lock sl(mLock); if (isDone()) return; @@ -71,8 +72,12 @@ void PeerSet::TimerEntry(boost::weak_ptr wptr, const boost::system::err { if (result == boost::asio::error::operation_aborted) return; + theApp->getJobQueue().addJob(jtLEDGER_DATA, "timerEntry", + boost::bind(&PeerSet::TimerJobEntry, _1, wptr)); +} - ScopedLock sl(theApp->getMasterLock()); +void PeerSet::TimerJobEntry(Job&, boost::weak_ptr wptr) +{ boost::shared_ptr ptr = wptr.lock(); if (ptr) ptr->invokeOnTimer(); diff --git a/src/cpp/ripple/LedgerAcquire.h b/src/cpp/ripple/LedgerAcquire.h index 78ab42994..cb38f797f 100644 --- a/src/cpp/ripple/LedgerAcquire.h +++ b/src/cpp/ripple/LedgerAcquire.h @@ -75,6 +75,7 @@ protected: private: static void TimerEntry(boost::weak_ptr, const boost::system::error_code& result); + static void TimerJobEntry(Job&, boost::weak_ptr); }; class LedgerAcquire : From e310b49353dc4d4a34f40b662195b3c3d36e3b59 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 16 Mar 2013 00:21:44 -0700 Subject: [PATCH 11/17] Fix parsing of split headers. --- src/cpp/websocketpp/src/roles/server.hpp | 45 ++++++++++++++++-------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/src/cpp/websocketpp/src/roles/server.hpp b/src/cpp/websocketpp/src/roles/server.hpp index 7042792bd..f77397d55 100644 --- a/src/cpp/websocketpp/src/roles/server.hpp +++ b/src/cpp/websocketpp/src/roles/server.hpp @@ -55,33 +55,41 @@ namespace websocketpp { typedef boost::asio::buffers_iterator bufIterator; -static std::pair match_header(bufIterator begin, bufIterator end) +static std::pair match_header(boost::shared_ptr string, + bufIterator nBegin, bufIterator nEnd) { + if (nBegin == nEnd) + return std::make_pair(nEnd, false); + + (*string) += std::string(nBegin, nEnd); + std::string::const_iterator begin = string->begin(); + std::string::const_iterator end = string->end(); + static const std::string eol_match = "\n"; - static const std::string header_match = "\n\r\n"; - static const std::string alt_header_match = "\n\n"; + static const std::string header_match = "\r\n\r\n"; static const std::string flash_match = ""; // Do we have a complete HTTP request - bufIterator it = std::search(begin, end, header_match.begin(), header_match.end()); + std::string::const_iterator it = std::search(begin, end, header_match.begin(), header_match.end()); if (it != end) - return std::make_pair(it + header_match.size(), true); - it = std::search(begin, end, alt_header_match.begin(), alt_header_match.end()); - if (it != end) - return std::make_pair(it + alt_header_match.size(), true); + { + int leftOver = (end - (it + header_match.size())); + return std::make_pair(nEnd - leftOver, true); + } // If we don't have a flash policy request, we're done it = std::search(begin, end, flash_match.begin(), flash_match.end()); if (it == end) // No match - return std::make_pair(end, false); + return std::make_pair(nEnd, false); // If we have a line ending before the flash policy request, treat as http - bufIterator it2 = std::search(begin, end, eol_match.begin(), eol_match.end()); + std::string::const_iterator it2 = std::search(begin, end, eol_match.begin(), eol_match.end()); if ((it2 != end) && (it2 < it)) - return std::make_pair(end, false); + return std::make_pair(nEnd, false); // Treat as flash policy request - return std::make_pair(it + flash_match.size(), true); + int leftOver = (end - (it + flash_match.size())); + return std::make_pair(nEnd - leftOver, true); } // Forward declarations @@ -170,7 +178,7 @@ public: // initializes the websocket connection void async_init(); - void handle_read_request(const boost::system::error_code& error, + void handle_read_request(boost::shared_ptr, const boost::system::error_code& error, std::size_t bytes_transferred); void handle_short_key3(const boost::system::error_code& error, std::size_t bytes_transferred); @@ -543,12 +551,14 @@ void server::connection::async_init() { m_connection.register_timeout(5000,fail::status::TIMEOUT_WS, "Timeout on WebSocket handshake"); + boost::shared_ptr stringPtr = boost::make_shared(); m_connection.get_socket().async_read_until( m_connection.buffer(), - match_header, + boost::bind(&match_header, stringPtr, _1, _2), m_connection.get_strand().wrap(boost::bind( &type::handle_read_request, m_connection.shared_from_this(), + stringPtr, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred )) @@ -562,6 +572,7 @@ void server::connection::async_init() { template template void server::connection::handle_read_request( + boost::shared_ptr header, const boost::system::error_code& error, std::size_t /*bytes_transferred*/) { if (error) { @@ -571,9 +582,11 @@ void server::connection::handle_read_request( m_connection.terminate(false); return; } + + m_connection.buffer().consume(header->size()); try { - std::istream request(&m_connection.buffer()); + std::istringstream request(*header); if (!m_request.parse_complete(request)) { // not a valid HTTP request/response @@ -607,6 +620,8 @@ void server::connection::handle_read_request( //m_endpoint.m_alog.at(log::alevel::DEBUG_HANDSHAKE) << m_request.raw() << log::endl; std::string h = m_request.header("Upgrade"); + if (h.empty()) + h = m_request.header("upgrade"); if (boost::ifind_first(h,"websocket")) { // Version is stored in the Sec-WebSocket-Version header for all // versions after draft Hybi 00/Hixie 76. The absense of a version From 51320d8746c3f47b7c314c6aa09b211d04afcae1 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 16 Mar 2013 01:08:55 -0700 Subject: [PATCH 12/17] Whitespace fix. --- src/cpp/ripple/SHAMapNodes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/SHAMapNodes.cpp b/src/cpp/ripple/SHAMapNodes.cpp index f7efa455c..ace6a10e1 100644 --- a/src/cpp/ripple/SHAMapNodes.cpp +++ b/src/cpp/ripple/SHAMapNodes.cpp @@ -288,7 +288,7 @@ SHAMapTreeNode::SHAMapTreeNode(const SHAMapNode& id, const std::vector Date: Sat, 16 Mar 2013 01:09:34 -0700 Subject: [PATCH 13/17] Fix case sensitive header issues. --- src/cpp/websocketpp/src/http/parser.hpp | 22 +++++++++++++++------- src/cpp/websocketpp/src/roles/server.hpp | 2 -- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/cpp/websocketpp/src/http/parser.hpp b/src/cpp/websocketpp/src/http/parser.hpp index f79a3753c..e6b2636a3 100644 --- a/src/cpp/websocketpp/src/http/parser.hpp +++ b/src/cpp/websocketpp/src/http/parser.hpp @@ -50,6 +50,14 @@ namespace parser { typedef std::map header_list; +static std::string tolower(const std::string& in) +{ + std::string out = in; + for (int i = 0; i < out.size(); ++i) + if (isupper(out[i])) + out[i] = ::tolower(out[i]); + return out; +} class parser { public: @@ -69,7 +77,7 @@ public: } std::string header(const std::string& key) const { - header_list::const_iterator h = m_headers.find(key); + header_list::const_iterator h = m_headers.find(tolower(key)); if (h == m_headers.end()) { return ""; @@ -80,21 +88,21 @@ public: // multiple calls to add header will result in values aggregating. // use replace_header if you do not want this behavior. - void add_header(const std::string &key,const std::string &val) { + void add_header(const std::string &key, const std::string &val) { // TODO: prevent use of reserved headers? if (this->header(key) == "") { - m_headers[key] = val; + m_headers[tolower(key)] = val; } else { - m_headers[key] += ", " + val; + m_headers[tolower(key)] += ", " + val; } } - void replace_header(const std::string &key,const std::string &val) { - m_headers[key] = val; + void replace_header(const std::string &key, const std::string &val) { + m_headers[tolower(key)] = val; } void remove_header(const std::string &key) { - m_headers.erase(key); + m_headers.erase(tolower(key)); } protected: bool parse_headers(std::istream& s) { diff --git a/src/cpp/websocketpp/src/roles/server.hpp b/src/cpp/websocketpp/src/roles/server.hpp index f77397d55..f45f51e38 100644 --- a/src/cpp/websocketpp/src/roles/server.hpp +++ b/src/cpp/websocketpp/src/roles/server.hpp @@ -620,8 +620,6 @@ void server::connection::handle_read_request( //m_endpoint.m_alog.at(log::alevel::DEBUG_HANDSHAKE) << m_request.raw() << log::endl; std::string h = m_request.header("Upgrade"); - if (h.empty()) - h = m_request.header("upgrade"); if (boost::ifind_first(h,"websocket")) { // Version is stored in the Sec-WebSocket-Version header for all // versions after draft Hybi 00/Hixie 76. The absense of a version From 9db1711d38112b1c8033c7af80f3eec133db510d Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 16 Mar 2013 01:55:57 -0700 Subject: [PATCH 14/17] Preprocessor likes spaces between some tokens. --- src/cpp/ripple/Config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/Config.cpp b/src/cpp/ripple/Config.cpp index f26e9274b..8d7abeb31 100644 --- a/src/cpp/ripple/Config.cpp +++ b/src/cpp/ripple/Config.cpp @@ -314,7 +314,7 @@ void Config::load() Json::Value jvCommand; if (!jrReader.parse(strJson, jvCommand)) - throw std::runtime_error(boost::str(boost::format("Couldn't parse ["SECTION_RPC_STARTUP"] command: %s") % strJson)); + throw std::runtime_error(boost::str(boost::format("Couldn't parse [" SECTION_RPC_STARTUP "] command: %s") % strJson)); jvArray.append(jvCommand); } From 2c7bbc0ea8d4c61b4f6f96ac0aa2f5f35fea724f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 16 Mar 2013 01:57:59 -0700 Subject: [PATCH 15/17] Preprocessor fix. --- src/cpp/ripple/UniqueNodeList.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpp/ripple/UniqueNodeList.cpp b/src/cpp/ripple/UniqueNodeList.cpp index 6a1c22e93..5928fb5a9 100644 --- a/src/cpp/ripple/UniqueNodeList.cpp +++ b/src/cpp/ripple/UniqueNodeList.cpp @@ -669,7 +669,7 @@ void UniqueNodeList::processIps(const std::string& strSite, const RippleAddress& else { cLog(lsTRACE) - << str(boost::format("Validator: '%s' ["SECTION_IPS"]: rejecting '%s'") + << str(boost::format("Validator: '%s' [" SECTION_IPS "]: rejecting '%s'") % strSite % strReferral); } } From 606dff758c71f14571b36d738da3958d8219f177 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 16 Mar 2013 02:38:05 -0700 Subject: [PATCH 16/17] Support compiling with C++11 rules. Compile C++11 by default. This gives us some significant performance boosts when containers and binds. --- SConstruct | 2 +- src/cpp/ripple/Amount.cpp | 2 +- src/cpp/ripple/HashedObject.cpp | 2 +- src/cpp/ripple/LoadMonitor.h | 4 +- src/cpp/ripple/RPCHandler.cpp | 2 +- src/cpp/ripple/SerializedObject.cpp | 50 +++++++++++----------- src/cpp/ripple/SerializedObject.h | 24 +++++------ src/cpp/ripple/SerializedTransaction.cpp | 2 +- src/cpp/ripple/SerializedTypes.cpp | 2 +- src/cpp/ripple/SerializedTypes.h | 54 ++++++++++++------------ src/cpp/ripple/TransactionEngine.cpp | 2 +- src/cpp/ripple/TransactionMeta.cpp | 2 +- src/cpp/ripple/Transactor.cpp | 18 ++++---- src/cpp/ripple/Transactor.h | 5 ++- src/cpp/ripple/utils.h | 13 ++++++ 15 files changed, 100 insertions(+), 84 deletions(-) diff --git a/SConstruct b/SConstruct index bc057ada7..f944d7799 100644 --- a/SConstruct +++ b/SConstruct @@ -100,7 +100,7 @@ BOOSTFLAGS = ['-DBOOST_TEST_DYN_LINK', '-DBOOST_FILESYSTEM_NO_DEPRECATED'] env.Append(LINKFLAGS = ['-rdynamic', '-pthread']) env.Append(CCFLAGS = ['-pthread', '-Wall', '-Wno-sign-compare', '-Wno-char-subscripts', '-DSQLITE_THREADSAFE=1']) -env.Append(CXXFLAGS = ['-O0', '-pthread', '-Wno-invalid-offsetof', '-Wformat']+BOOSTFLAGS+DEBUGFLAGS) +env.Append(CXXFLAGS = ['-O0', '-std=c++11', '-pthread', '-Wno-invalid-offsetof', '-Wformat']+BOOSTFLAGS+DEBUGFLAGS) if OSX: env.Append(LINKFLAGS = ['-L/usr/local/opt/openssl/lib']) diff --git a/src/cpp/ripple/Amount.cpp b/src/cpp/ripple/Amount.cpp index 9b9530eb7..2232fae78 100644 --- a/src/cpp/ripple/Amount.cpp +++ b/src/cpp/ripple/Amount.cpp @@ -1187,7 +1187,7 @@ STAmount STAmount::getPay(const STAmount& offerOut, const STAmount& offerIn, con STAmount STAmount::deserialize(SerializerIterator& it) { - std::auto_ptr s(dynamic_cast(construct(it, sfGeneric))); + UPTR_T s(dynamic_cast(construct(it, sfGeneric))); STAmount ret(*s); return ret; } diff --git a/src/cpp/ripple/HashedObject.cpp b/src/cpp/ripple/HashedObject.cpp index 91f98d751..aea25c3b0 100644 --- a/src/cpp/ripple/HashedObject.cpp +++ b/src/cpp/ripple/HashedObject.cpp @@ -261,7 +261,7 @@ HashedObject::pointer HashedObjectStore::retrieve(const uint256& hash) int HashedObjectStore::import(const std::string& file) { cLog(lsWARNING) << "Hash import from \"" << file << "\"."; - std::auto_ptr importDB(new SqliteDatabase(file.c_str())); + UPTR_T importDB(new SqliteDatabase(file.c_str())); importDB->connect(); int countYes = 0, countNo = 0; diff --git a/src/cpp/ripple/LoadMonitor.h b/src/cpp/ripple/LoadMonitor.h index db662b9c9..f97c2fb3c 100644 --- a/src/cpp/ripple/LoadMonitor.h +++ b/src/cpp/ripple/LoadMonitor.h @@ -6,7 +6,9 @@ #include #include +#include "utils.h" #include "types.h" + extern int upTime(); // Monitors load levels and response times @@ -54,7 +56,7 @@ class LoadEvent { public: typedef boost::shared_ptr pointer; - typedef std::auto_ptr autoptr; + typedef UPTR_T autoptr; protected: LoadMonitor& mMonitor; diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 280a0ccb3..d642e05e4 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -270,7 +270,7 @@ Json::Value RPCHandler::transactionSign(Json::Value jvRequest, bool bSubmit) return rpcError(rpcSRC_ACT_NOT_FOUND); } - std::auto_ptr sopTrans; + UPTR_T sopTrans; try { diff --git a/src/cpp/ripple/SerializedObject.cpp b/src/cpp/ripple/SerializedObject.cpp index bf8ee4326..497b2fb7d 100644 --- a/src/cpp/ripple/SerializedObject.cpp +++ b/src/cpp/ripple/SerializedObject.cpp @@ -17,56 +17,56 @@ SETUP_LOG(); DECLARE_INSTANCE(SerializedObject); DECLARE_INSTANCE(SerializedArray); -std::auto_ptr STObject::makeDefaultObject(SerializedTypeID id, SField::ref name) +UPTR_T STObject::makeDefaultObject(SerializedTypeID id, SField::ref name) { assert((id == STI_NOTPRESENT) || (id == name.fieldType)); switch(id) { case STI_NOTPRESENT: - return std::auto_ptr(new SerializedType(name)); + return UPTR_T(new SerializedType(name)); case STI_UINT8: - return std::auto_ptr(new STUInt8(name)); + return UPTR_T(new STUInt8(name)); case STI_UINT16: - return std::auto_ptr(new STUInt16(name)); + return UPTR_T(new STUInt16(name)); case STI_UINT32: - return std::auto_ptr(new STUInt32(name)); + return UPTR_T(new STUInt32(name)); case STI_UINT64: - return std::auto_ptr(new STUInt64(name)); + return UPTR_T(new STUInt64(name)); case STI_AMOUNT: - return std::auto_ptr(new STAmount(name)); + return UPTR_T(new STAmount(name)); case STI_HASH128: - return std::auto_ptr(new STHash128(name)); + return UPTR_T(new STHash128(name)); case STI_HASH160: - return std::auto_ptr(new STHash160(name)); + return UPTR_T(new STHash160(name)); case STI_HASH256: - return std::auto_ptr(new STHash256(name)); + return UPTR_T(new STHash256(name)); case STI_VECTOR256: - return std::auto_ptr(new STVector256(name)); + return UPTR_T(new STVector256(name)); case STI_VL: - return std::auto_ptr(new STVariableLength(name)); + return UPTR_T(new STVariableLength(name)); case STI_ACCOUNT: - return std::auto_ptr(new STAccount(name)); + return UPTR_T(new STAccount(name)); case STI_PATHSET: - return std::auto_ptr(new STPathSet(name)); + return UPTR_T(new STPathSet(name)); case STI_OBJECT: - return std::auto_ptr(new STObject(name)); + return UPTR_T(new STObject(name)); case STI_ARRAY: - return std::auto_ptr(new STArray(name)); + return UPTR_T(new STArray(name)); default: cLog(lsFATAL) << "Object type: " << lexical_cast_i(id); @@ -75,7 +75,7 @@ std::auto_ptr STObject::makeDefaultObject(SerializedTypeID id, S } } -std::auto_ptr STObject::makeDeserializedObject(SerializedTypeID id, SField::ref name, +UPTR_T STObject::makeDeserializedObject(SerializedTypeID id, SField::ref name, SerializerIterator& sit, int depth) { switch(id) @@ -192,7 +192,7 @@ bool STObject::setType(const SOTemplate &type) << elem->e_field.fieldName; valid = false; } - newData.push_back(makeNonPresentObject(elem->e_field)); + newData.push_back(makeNonPresentObject(elem->e_field).release()); } } @@ -252,10 +252,10 @@ bool STObject::set(SerializerIterator& sit, int depth) return false; } -std::auto_ptr STObject::deserialize(SerializerIterator& sit, SField::ref name) +UPTR_T STObject::deserialize(SerializerIterator& sit, SField::ref name) { STObject *o; - std::auto_ptr object(o = new STObject(name)); + UPTR_T object(o = new STObject(name)); o->set(sit, 1); return object; } @@ -482,7 +482,7 @@ SerializedType* STObject::makeFieldPresent(SField::ref field) SerializedType* f = getPIndex(index); if (f->getSType() != STI_NOTPRESENT) return f; - mData.replace(index, makeDefaultObject(f->getFName())); + mData.replace(index, makeDefaultObject(f->getFName()).release()); return getPIndex(index); } @@ -496,7 +496,7 @@ void STObject::makeFieldAbsent(SField::ref field) if (f.getSType() == STI_NOTPRESENT) return; - mData.replace(index, makeNonPresentObject(f.getFName())); + mData.replace(index, makeNonPresentObject(f.getFName()).release()); } bool STObject::delField(SField::ref field) @@ -957,7 +957,7 @@ void STArray::sort(bool (*compare)(const STObject&, const STObject&)) value.sort(compare); } -std::auto_ptr STObject::parseJson(const Json::Value& object, SField::ref inName, int depth) +UPTR_T STObject::parseJson(const Json::Value& object, SField::ref inName, int depth) { if (!object.isObject()) throw std::runtime_error("Value is not an object"); @@ -1219,7 +1219,7 @@ std::auto_ptr STObject::parseJson(const Json::Value& object, SField::r throw std::runtime_error("Inner value is not an object"); if (depth > 64) throw std::runtime_error("Json nest depth exceeded"); - data.push_back(parseJson(value, field, depth + 1)); + data.push_back(parseJson(value, field, depth + 1).release()); break; case STI_ARRAY: @@ -1238,7 +1238,7 @@ std::auto_ptr STObject::parseJson(const Json::Value& object, SField::r } } - return std::auto_ptr(new STObject(*name, data)); + return UPTR_T(new STObject(*name, data)); } BOOST_AUTO_TEST_SUITE(SerializedObject) diff --git a/src/cpp/ripple/SerializedObject.h b/src/cpp/ripple/SerializedObject.h index 8638d4e9e..67d76fabd 100644 --- a/src/cpp/ripple/SerializedObject.h +++ b/src/cpp/ripple/SerializedObject.h @@ -58,13 +58,13 @@ public: STObject(const SOTemplate& type, SerializerIterator& sit, SField::ref name) : SerializedType(name) { set(sit); setType(type); } - std::auto_ptr oClone() const { return std::auto_ptr(new STObject(*this)); } + UPTR_T oClone() const { return UPTR_T(new STObject(*this)); } - static std::auto_ptr parseJson(const Json::Value& value, SField::ref name = sfGeneric, int depth = 0); + static UPTR_T parseJson(const Json::Value& value, SField::ref name = sfGeneric, int depth = 0); virtual ~STObject() { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name); + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name); bool setType(const SOTemplate& type); bool isValidForType(); @@ -85,8 +85,8 @@ public: std::string getText() const; virtual Json::Value getJson(int options) const; - int addObject(const SerializedType& t) { mData.push_back(t.clone()); return mData.size() - 1; } - int giveObject(std::auto_ptr t) { mData.push_back(t); return mData.size() - 1; } + int addObject(const SerializedType& t) { mData.push_back(t.clone().release()); return mData.size() - 1; } + int giveObject(UPTR_T t) { mData.push_back(t.release()); return mData.size() - 1; } int giveObject(SerializedType* t) { mData.push_back(t); return mData.size() - 1; } const boost::ptr_vector& peekData() const { return mData; } boost::ptr_vector& peekData() { return mData; } @@ -157,13 +157,13 @@ public: bool delField(SField::ref field); void delField(int index); - static std::auto_ptr makeDefaultObject(SerializedTypeID id, SField::ref name); - static std::auto_ptr makeDeserializedObject(SerializedTypeID id, SField::ref name, + static UPTR_T makeDefaultObject(SerializedTypeID id, SField::ref name); + static UPTR_T makeDeserializedObject(SerializedTypeID id, SField::ref name, SerializerIterator&, int depth); - static std::auto_ptr makeNonPresentObject(SField::ref name) + static UPTR_T makeNonPresentObject(SField::ref name) { return makeDefaultObject(STI_NOTPRESENT, name); } - static std::auto_ptr makeDefaultObject(SField::ref name) + static UPTR_T makeDefaultObject(SField::ref name) { return makeDefaultObject(name.fieldType, name); } // field iterator stuff @@ -221,14 +221,14 @@ public: STArray(SField::ref f, const vector& v) : SerializedType(f), value(v) { ; } STArray(vector& v) : value(v) { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } const vector& getValue() const { return value; } vector& getValue() { return value; } // vector-like functions - void push_back(const STObject& object) { value.push_back(object.oClone()); } + void push_back(const STObject& object) { value.push_back(object.oClone().release()); } STObject& operator[](int j) { return value[j]; } const STObject& operator[](int j) const { return value[j]; } iterator begin() { return value.begin(); } diff --git a/src/cpp/ripple/SerializedTransaction.cpp b/src/cpp/ripple/SerializedTransaction.cpp index c5a1d1445..e79b3f6a5 100644 --- a/src/cpp/ripple/SerializedTransaction.cpp +++ b/src/cpp/ripple/SerializedTransaction.cpp @@ -305,7 +305,7 @@ BOOST_AUTO_TEST_CASE( STrans_test ) Log(lsFATAL) << copy.getJson(0); BOOST_FAIL("Transaction fails serialize/deserialize test"); } - std::auto_ptr new_obj = STObject::parseJson(j.getJson(0), sfGeneric); + UPTR_T new_obj = STObject::parseJson(j.getJson(0), sfGeneric); if (new_obj.get() == NULL) BOOST_FAIL("Unable to build object from json"); if (STObject(j) != *new_obj) diff --git a/src/cpp/ripple/SerializedTypes.cpp b/src/cpp/ripple/SerializedTypes.cpp index 3b5b75229..2e6cf1d47 100644 --- a/src/cpp/ripple/SerializedTypes.cpp +++ b/src/cpp/ripple/SerializedTypes.cpp @@ -286,7 +286,7 @@ STVector256* STVector256::construct(SerializerIterator& u, SField::ref name) { std::vector data = u.getVL(); - std::auto_ptr vec(new STVector256(name)); + UPTR_T vec(new STVector256(name)); int count = data.size() / (256 / 8); vec->mValue.reserve(count); diff --git a/src/cpp/ripple/SerializedTypes.h b/src/cpp/ripple/SerializedTypes.h index 30cb3b8fb..96306a79f 100644 --- a/src/cpp/ripple/SerializedTypes.h +++ b/src/cpp/ripple/SerializedTypes.h @@ -58,15 +58,15 @@ public: SerializedType(SField::ref n) : fName(&n) { assert(fName); } virtual ~SerializedType() { ; } - static std::auto_ptr deserialize(SField::ref name) - { return std::auto_ptr(new SerializedType(name)); } + static UPTR_T deserialize(SField::ref name) + { return UPTR_T(new SerializedType(name)); } void setFName(SField::ref n) { fName = &n; assert(fName); } SField::ref getFName() const { return *fName; } std::string getName() const { return fName->fieldName; } virtual SerializedTypeID getSType() const { return STI_NOTPRESENT; } - std::auto_ptr clone() const { return std::auto_ptr(duplicate()); } + UPTR_T clone() const { return UPTR_T(duplicate()); } virtual std::string getFullText() const; virtual std::string getText() const // just the value @@ -107,8 +107,8 @@ public: STUInt8(unsigned char v = 0) : value(v) { ; } STUInt8(SField::ref n, unsigned char v = 0) : SerializedType(n), value(v) { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } SerializedTypeID getSType() const { return STI_UINT8; } std::string getText() const; @@ -135,8 +135,8 @@ public: STUInt16(uint16 v = 0) : value(v) { ; } STUInt16(SField::ref n, uint16 v = 0) : SerializedType(n), value(v) { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } SerializedTypeID getSType() const { return STI_UINT16; } std::string getText() const; @@ -163,8 +163,8 @@ public: STUInt32(uint32 v = 0) : value(v) { ; } STUInt32(SField::ref n, uint32 v = 0) : SerializedType(n), value(v) { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } SerializedTypeID getSType() const { return STI_UINT32; } std::string getText() const; @@ -191,8 +191,8 @@ public: STUInt64(uint64 v = 0) : value(v) { ; } STUInt64(SField::ref n, uint64 v = 0) : SerializedType(n), value(v) { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } SerializedTypeID getSType() const { return STI_UINT64; } std::string getText() const; @@ -331,8 +331,8 @@ public: static STAmount createFromInt64(SField::ref n, int64 v); - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } bool bSetJson(const Json::Value& jvSource); @@ -493,8 +493,8 @@ public: STHash128(SField::ref n, const std::string &v) : SerializedType(n) { value.SetHex(v); } STHash128(SField::ref n) : SerializedType(n) { ; } STHash128() { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } SerializedTypeID getSType() const { return STI_HASH128; } virtual std::string getText() const; @@ -524,8 +524,8 @@ public: STHash160(SField::ref n, const std::string &v) : SerializedType(n) { value.SetHex(v); } STHash160(SField::ref n) : SerializedType(n) { ; } STHash160() { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } SerializedTypeID getSType() const { return STI_HASH160; } virtual std::string getText() const; @@ -555,8 +555,8 @@ public: STHash256(SField::ref n, const std::string &v) : SerializedType(n) { value.SetHex(v); } STHash256(SField::ref n) : SerializedType(n) { ; } STHash256() { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } SerializedTypeID getSType() const { return STI_HASH256; } std::string getText() const; @@ -585,8 +585,8 @@ public: STVariableLength(SField::ref n) : SerializedType(n) { ; } STVariableLength(SerializerIterator&, SField::ref name = sfGeneric); STVariableLength() { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } virtual SerializedTypeID getSType() const { return STI_VL; } virtual std::string getText() const; @@ -615,8 +615,8 @@ public: STAccount(SField::ref n, const uint160& v); STAccount(SField::ref n) : STVariableLength(n) { ; } STAccount() { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } SerializedTypeID getSType() const { return STI_ACCOUNT; } std::string getText() const; @@ -770,8 +770,8 @@ public: STPathSet(SField::ref n) : SerializedType(n) { ; } STPathSet(const std::vector& v) : value(v) { ; } STPathSet(SField::ref n, const std::vector& v) : SerializedType(n), value(v) { ; } - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } // std::string getText() const; void add(Serializer& s) const; @@ -848,8 +848,8 @@ public: SerializedTypeID getSType() const { return STI_VECTOR256; } void add(Serializer& s) const; - static std::auto_ptr deserialize(SerializerIterator& sit, SField::ref name) - { return std::auto_ptr(construct(sit, name)); } + static UPTR_T deserialize(SerializerIterator& sit, SField::ref name) + { return UPTR_T(construct(sit, name)); } const std::vector& peekValue() const { return mValue; } std::vector& peekValue() { return mValue; } diff --git a/src/cpp/ripple/TransactionEngine.cpp b/src/cpp/ripple/TransactionEngine.cpp index a14f9e346..1e0beac41 100644 --- a/src/cpp/ripple/TransactionEngine.cpp +++ b/src/cpp/ripple/TransactionEngine.cpp @@ -93,7 +93,7 @@ TER TransactionEngine::applyTransaction(const SerializedTransaction& txn, Transa } #endif - std::auto_ptr transactor = Transactor::makeTransactor(txn,params,this); + UPTR_T transactor = Transactor::makeTransactor(txn,params,this); if (transactor.get() != NULL) { uint256 txID = txn.getTransactionID(); diff --git a/src/cpp/ripple/TransactionMeta.cpp b/src/cpp/ripple/TransactionMeta.cpp index 99ea1e4c3..0f7bab5b2 100644 --- a/src/cpp/ripple/TransactionMeta.cpp +++ b/src/cpp/ripple/TransactionMeta.cpp @@ -17,7 +17,7 @@ TransactionMetaSet::TransactionMetaSet(const uint256& txid, uint32 ledger, const Serializer s(vec); SerializerIterator sit(s); - std::auto_ptr pobj = STObject::deserialize(sit, sfAffectedNodes); + UPTR_T pobj = STObject::deserialize(sit, sfAffectedNodes); STObject *obj = static_cast(pobj.get()); if (!obj) throw std::runtime_error("bad metadata"); diff --git a/src/cpp/ripple/Transactor.cpp b/src/cpp/ripple/Transactor.cpp index 4b65dd7fd..7534546d5 100644 --- a/src/cpp/ripple/Transactor.cpp +++ b/src/cpp/ripple/Transactor.cpp @@ -11,26 +11,26 @@ SETUP_LOG(); -std::auto_ptr Transactor::makeTransactor(const SerializedTransaction& txn,TransactionEngineParams params, TransactionEngine* engine) +UPTR_T Transactor::makeTransactor(const SerializedTransaction& txn,TransactionEngineParams params, TransactionEngine* engine) { switch(txn.getTxnType()) { case ttPAYMENT: - return std::auto_ptr(new PaymentTransactor(txn, params, engine)); + return UPTR_T(new PaymentTransactor(txn, params, engine)); case ttACCOUNT_SET: - return std::auto_ptr(new AccountSetTransactor(txn, params, engine)); + return UPTR_T(new AccountSetTransactor(txn, params, engine)); case ttREGULAR_KEY_SET: - return std::auto_ptr(new RegularKeySetTransactor(txn, params, engine)); + return UPTR_T(new RegularKeySetTransactor(txn, params, engine)); case ttTRUST_SET: - return std::auto_ptr(new TrustSetTransactor(txn, params, engine)); + return UPTR_T(new TrustSetTransactor(txn, params, engine)); case ttOFFER_CREATE: - return std::auto_ptr(new OfferCreateTransactor(txn, params, engine)); + return UPTR_T(new OfferCreateTransactor(txn, params, engine)); case ttOFFER_CANCEL: - return std::auto_ptr(new OfferCancelTransactor(txn, params, engine)); + return UPTR_T(new OfferCancelTransactor(txn, params, engine)); case ttWALLET_ADD: - return std::auto_ptr(new WalletAddTransactor(txn, params, engine)); + return UPTR_T(new WalletAddTransactor(txn, params, engine)); default: - return std::auto_ptr(); + return UPTR_T(); } } diff --git a/src/cpp/ripple/Transactor.h b/src/cpp/ripple/Transactor.h index 8a2d276d3..f530b6f9c 100644 --- a/src/cpp/ripple/Transactor.h +++ b/src/cpp/ripple/Transactor.h @@ -1,10 +1,11 @@ #ifndef __TRANSACTOR__ #define __TRANSACTOR__ +#include + #include "SerializedTransaction.h" #include "TransactionErr.h" #include "TransactionEngine.h" -#include class Transactor { @@ -38,7 +39,7 @@ protected: public: typedef boost::shared_ptr pointer; - static std::auto_ptr makeTransactor(const SerializedTransaction& txn,TransactionEngineParams params, TransactionEngine* engine); + static UPTR_T makeTransactor(const SerializedTransaction& txn,TransactionEngineParams params, TransactionEngine* engine); TER apply(); }; diff --git a/src/cpp/ripple/utils.h b/src/cpp/ripple/utils.h index 77ae2f26f..9938a26d3 100644 --- a/src/cpp/ripple/utils.h +++ b/src/cpp/ripple/utils.h @@ -286,6 +286,19 @@ template T range_check_cast(const U& value, const T& min bool parseUrl(const std::string& strUrl, std::string& strScheme, std::string& strDomain, int& iPort, std::string& strPath); +#if (!defined(FORCE_NO_C11X) && (__cplusplus > 201100L)) || defined(FORCE_C11X) + +#define C11X +#define UPTR_T std::unique_ptr +#define MOVE_P(p) std::move(p) + +#else + +#define UPTR_T std::auto_ptr +#define MOVE_P(p) (p) + +#endif + #endif // vim:ts=4 From b9456c8fd74431b3c3c75e5e2c7e9193f2b32f86 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 16 Mar 2013 03:27:43 -0700 Subject: [PATCH 17/17] Except when interacting with boost, use std::function and std::bind when C++11 is available. See: http://stackoverflow.com/questions/14617835 --- src/cpp/ripple/HashedObject.cpp | 2 +- src/cpp/ripple/JobQueue.cpp | 4 ++-- src/cpp/ripple/JobQueue.h | 8 ++++---- src/cpp/ripple/Ledger.cpp | 2 +- src/cpp/ripple/LedgerAcquire.cpp | 17 ++++++++--------- src/cpp/ripple/LedgerAcquire.h | 6 +++--- src/cpp/ripple/LedgerEntrySet.cpp | 6 +++--- src/cpp/ripple/LedgerEntrySet.h | 3 +-- src/cpp/ripple/LedgerMaster.cpp | 6 +++--- src/cpp/ripple/LedgerMaster.h | 2 +- src/cpp/ripple/NetworkOPs.cpp | 3 +-- src/cpp/ripple/OfferCreateTransactor.cpp | 4 ++-- src/cpp/ripple/Peer.cpp | 14 +++++++------- src/cpp/ripple/TransactionQueue.h | 2 +- src/cpp/ripple/ValidationCollection.cpp | 2 +- src/cpp/ripple/WSHandler.h | 4 ++-- src/cpp/ripple/utils.h | 23 +++++++++++++++++++---- 17 files changed, 60 insertions(+), 48 deletions(-) diff --git a/src/cpp/ripple/HashedObject.cpp b/src/cpp/ripple/HashedObject.cpp index aea25c3b0..7e97602a8 100644 --- a/src/cpp/ripple/HashedObject.cpp +++ b/src/cpp/ripple/HashedObject.cpp @@ -52,7 +52,7 @@ bool HashedObjectStore::store(HashedObjectType type, uint32 index, { mWritePending = true; theApp->getJobQueue().addJob(jtWRITE, "HashedObject::store", - boost::bind(&HashedObjectStore::bulkWrite, this)); + BIND_TYPE(&HashedObjectStore::bulkWrite, this)); } } // else diff --git a/src/cpp/ripple/JobQueue.cpp b/src/cpp/ripple/JobQueue.cpp index 45114723b..8e2d618a6 100644 --- a/src/cpp/ripple/JobQueue.cpp +++ b/src/cpp/ripple/JobQueue.cpp @@ -97,7 +97,7 @@ bool Job::operator<=(const Job& j) const return mJobIndex <= j.mJobIndex; } -void JobQueue::addJob(JobType type, const std::string& name, const boost::function& jobFunc) +void JobQueue::addJob(JobType type, const std::string& name, const FUNCTION_TYPE& jobFunc) { assert(type != jtINVALID); @@ -246,7 +246,7 @@ void JobQueue::setThreadCount(int c) while (mThreadCount < c) { ++mThreadCount; - boost::thread(boost::bind(&JobQueue::threadEntry, this)).detach(); + boost::thread(BIND_TYPE(&JobQueue::threadEntry, this)).detach(); } while (mThreadCount > c) { diff --git a/src/cpp/ripple/JobQueue.h b/src/cpp/ripple/JobQueue.h index 673499529..705744db6 100644 --- a/src/cpp/ripple/JobQueue.h +++ b/src/cpp/ripple/JobQueue.h @@ -7,8 +7,8 @@ #include #include -#include #include +#include #include "../json/value.h" @@ -52,7 +52,7 @@ class Job protected: JobType mType; uint64 mJobIndex; - boost::function mJob; + FUNCTION_TYPE mJob; LoadEvent::pointer mLoadMonitor; std::string mName; @@ -63,7 +63,7 @@ public: Job(JobType type, uint64 index) : mType(type), mJobIndex(index) { ; } - Job(JobType type, const std::string& name, uint64 index, LoadMonitor& lm, const boost::function& job) + Job(JobType type, const std::string& name, uint64 index, LoadMonitor& lm, const FUNCTION_TYPE& job) : mType(type), mJobIndex(index), mJob(job), mName(name) { mLoadMonitor = boost::make_shared(boost::ref(lm), name, false); @@ -102,7 +102,7 @@ public: JobQueue(); - void addJob(JobType type, const std::string& name, const boost::function& job); + void addJob(JobType type, const std::string& name, const FUNCTION_TYPE& job); int getJobCount(JobType t); // Jobs waiting at this priority int getJobCountTotal(JobType t); // Jobs waiting plus running at this priority diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index 72ae3d5a1..2d689156e 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -1540,7 +1540,7 @@ void Ledger::pendSave(bool fromConsensus) theApp->getJobQueue().addJob(fromConsensus ? jtPUBLEDGER : jtPUBOLDLEDGER, fromConsensus ? "Ledger::pendSave" : "Ledger::pendOldSave", - boost::bind(&Ledger::saveAcceptedLedger, shared_from_this(), _1, fromConsensus)); + BIND_TYPE(&Ledger::saveAcceptedLedger, shared_from_this(), P_1, fromConsensus)); } diff --git a/src/cpp/ripple/LedgerAcquire.cpp b/src/cpp/ripple/LedgerAcquire.cpp index 7db1a20af..e6da90f82 100644 --- a/src/cpp/ripple/LedgerAcquire.cpp +++ b/src/cpp/ripple/LedgerAcquire.cpp @@ -3,7 +3,6 @@ #include #include -#include #include "Application.h" #include "Log.h" @@ -72,14 +71,14 @@ void PeerSet::TimerEntry(boost::weak_ptr wptr, const boost::system::err { if (result == boost::asio::error::operation_aborted) return; - theApp->getJobQueue().addJob(jtLEDGER_DATA, "timerEntry", - boost::bind(&PeerSet::TimerJobEntry, _1, wptr)); -} - -void PeerSet::TimerJobEntry(Job&, boost::weak_ptr wptr) -{ boost::shared_ptr ptr = wptr.lock(); if (ptr) + theApp->getJobQueue().addJob(jtLEDGER_DATA, "timerEntry", + BIND_TYPE(&PeerSet::TimerJobEntry, P_1, ptr)); +} + +void PeerSet::TimerJobEntry(Job&, boost::shared_ptr ptr) +{ ptr->invokeOnTimer(); } @@ -254,7 +253,7 @@ void LedgerAcquire::done() assert(isComplete() || isFailed()); - std::vector< boost::function > triggers; + std::vector< FUNCTION_TYPE > triggers; { boost::recursive_mutex::scoped_lock sl(mLock); triggers.swap(mOnComplete); @@ -275,7 +274,7 @@ void LedgerAcquire::done() triggers[i](shared_from_this()); } -bool LedgerAcquire::addOnComplete(boost::function trigger) +bool LedgerAcquire::addOnComplete(FUNCTION_TYPE trigger) { boost::recursive_mutex::scoped_lock sl(mLock); if (isDone()) diff --git a/src/cpp/ripple/LedgerAcquire.h b/src/cpp/ripple/LedgerAcquire.h index cb38f797f..c255ef6b7 100644 --- a/src/cpp/ripple/LedgerAcquire.h +++ b/src/cpp/ripple/LedgerAcquire.h @@ -75,7 +75,7 @@ protected: private: static void TimerEntry(boost::weak_ptr, const boost::system::error_code& result); - static void TimerJobEntry(Job&, boost::weak_ptr); + static void TimerJobEntry(Job&, boost::shared_ptr); }; class LedgerAcquire : @@ -91,7 +91,7 @@ protected: std::set mRecentTXNodes; std::set mRecentASNodes; - std::vector< boost::function > mOnComplete; + std::vector< FUNCTION_TYPE > mOnComplete; void done(); void onTimer(bool progress); @@ -112,7 +112,7 @@ public: void abort() { mAborted = true; } bool setAccept() { if (mAccept) return false; mAccept = true; return true; } - bool addOnComplete(boost::function); + bool addOnComplete(FUNCTION_TYPE); bool takeBase(const std::string& data); bool takeTxNode(const std::list& IDs, const std::list >& data, diff --git a/src/cpp/ripple/LedgerEntrySet.cpp b/src/cpp/ripple/LedgerEntrySet.cpp index b7e414140..cdf9d30f3 100644 --- a/src/cpp/ripple/LedgerEntrySet.cpp +++ b/src/cpp/ripple/LedgerEntrySet.cpp @@ -529,7 +529,7 @@ TER LedgerEntrySet::dirAdd( uint64& uNodeDir, const uint256& uRootIndex, const uint256& uLedgerIndex, - boost::function fDescriber) + FUNCTION_TYPE fDescriber) { cLog(lsDEBUG) << boost::str(boost::format("dirAdd: uRootIndex=%s uLedgerIndex=%s") @@ -1195,7 +1195,7 @@ TER LedgerEntrySet::trustCreate( uLowNode, Ledger::getOwnerDirIndex(uLowAccountID), sleRippleState->getIndex(), - boost::bind(&Ledger::ownerDirDescriber, _1, uLowAccountID)); + BIND_TYPE(&Ledger::ownerDirDescriber, P_1, uLowAccountID)); if (tesSUCCESS == terResult) { @@ -1203,7 +1203,7 @@ TER LedgerEntrySet::trustCreate( uHighNode, Ledger::getOwnerDirIndex(uHighAccountID), sleRippleState->getIndex(), - boost::bind(&Ledger::ownerDirDescriber, _1, uHighAccountID)); + BIND_TYPE(&Ledger::ownerDirDescriber, P_1, uHighAccountID)); } if (tesSUCCESS == terResult) diff --git a/src/cpp/ripple/LedgerEntrySet.h b/src/cpp/ripple/LedgerEntrySet.h index 32b641e45..c326cc538 100644 --- a/src/cpp/ripple/LedgerEntrySet.h +++ b/src/cpp/ripple/LedgerEntrySet.h @@ -2,7 +2,6 @@ #define __LEDGERENTRYSET__ #include -#include #include "SerializedLedger.h" #include "TransactionMeta.h" @@ -106,7 +105,7 @@ public: uint64& uNodeDir, // Node of entry. const uint256& uRootIndex, const uint256& uLedgerIndex, - boost::function fDescriber); + FUNCTION_TYPE fDescriber); TER dirDelete( const bool bKeepRoot, diff --git a/src/cpp/ripple/LedgerMaster.cpp b/src/cpp/ripple/LedgerMaster.cpp index 892d70822..6aa52fa9b 100644 --- a/src/cpp/ripple/LedgerMaster.cpp +++ b/src/cpp/ripple/LedgerMaster.cpp @@ -197,7 +197,7 @@ bool LedgerMaster::acquireMissingLedger(Ledger::ref origLedger, const uint256& l { cLog(lsTRACE) << "Ledger hash found in database"; theApp->getJobQueue().addJob(jtPUBOLDLEDGER, "LedgerMaster::asyncAccept", - boost::bind(&LedgerMaster::asyncAccept, this, ledger)); + BIND_TYPE(&LedgerMaster::asyncAccept, this, ledger)); return true; } @@ -224,7 +224,7 @@ bool LedgerMaster::acquireMissingLedger(Ledger::ref origLedger, const uint256& l mMissingSeq = ledgerSeq; if (mMissingLedger->setAccept()) { - if (!mMissingLedger->addOnComplete(boost::bind(&LedgerMaster::missingAcquireComplete, this, _1))) + if (!mMissingLedger->addOnComplete(BIND_TYPE(&LedgerMaster::missingAcquireComplete, this, P_1))) theApp->getIOService().post(boost::bind(&LedgerMaster::missingAcquireComplete, this, mMissingLedger)); } @@ -554,7 +554,7 @@ void LedgerMaster::tryPublish() theApp->getOPs().clearNeedNetworkLedger(); mPubThread = true; theApp->getJobQueue().addJob(jtPUBLEDGER, "Ledger::pubThread", - boost::bind(&LedgerMaster::pubThread, this)); + BIND_TYPE(&LedgerMaster::pubThread, this)); } } diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index dfc8ef3aa..d2dc0c2d5 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -18,7 +18,7 @@ class LedgerMaster { public: - typedef boost::function callback; + typedef FUNCTION_TYPE callback; protected: boost::recursive_mutex mLock; diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 9bc3745b6..67c2a8908 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1,7 +1,6 @@ #include "NetworkOPs.h" -#include #include #include "utils.h" @@ -1380,7 +1379,7 @@ void NetworkOPs::reportFeeChange() (theApp->getFeeTrack().getLoadFactor() == mLastLoadFactor)) return; - theApp->getJobQueue().addJob(jtCLIENT, "reportFeeChange->pubServer", boost::bind(&NetworkOPs::pubServer, this)); + theApp->getJobQueue().addJob(jtCLIENT, "reportFeeChange->pubServer", BIND_TYPE(&NetworkOPs::pubServer, this)); } Json::Value NetworkOPs::transJson(const SerializedTransaction& stTxn, TER terResult, bool bValidated, diff --git a/src/cpp/ripple/OfferCreateTransactor.cpp b/src/cpp/ripple/OfferCreateTransactor.cpp index f3251c065..afff90699 100644 --- a/src/cpp/ripple/OfferCreateTransactor.cpp +++ b/src/cpp/ripple/OfferCreateTransactor.cpp @@ -534,7 +534,7 @@ TER OfferCreateTransactor::doApply() // Add offer to owner's directory. terResult = lesActive.dirAdd(uOwnerNode, Ledger::getOwnerDirIndex(mTxnAccountID), uLedgerIndex, - boost::bind(&Ledger::qualityDirDescriber, _1, saTakerPays.getCurrency(), uPaysIssuerID, + BIND_TYPE(&Ledger::qualityDirDescriber, P_1, saTakerPays.getCurrency(), uPaysIssuerID, saTakerGets.getCurrency(), uGetsIssuerID, uRate)); @@ -555,7 +555,7 @@ TER OfferCreateTransactor::doApply() // Add offer to order book. terResult = lesActive.dirAdd(uBookNode, uDirectory, uLedgerIndex, - boost::bind(&Ledger::qualityDirDescriber, _1, saTakerPays.getCurrency(), uPaysIssuerID, + BIND_TYPE(&Ledger::qualityDirDescriber, P_1, saTakerPays.getCurrency(), uPaysIssuerID, saTakerGets.getCurrency(), uGetsIssuerID, uRate)); } diff --git a/src/cpp/ripple/Peer.cpp b/src/cpp/ripple/Peer.cpp index 51cb14a49..752b9c0e1 100644 --- a/src/cpp/ripple/Peer.cpp +++ b/src/cpp/ripple/Peer.cpp @@ -870,7 +870,7 @@ void Peer::recvTransaction(ripple::TMTransaction& packet) } theApp->getJobQueue().addJob(jtTRANSACTION, "recvTransction->checkTransaction", - boost::bind(&checkTransaction, _1, flags, stx, boost::weak_ptr(shared_from_this()))); + BIND_TYPE(&checkTransaction, P_1, flags, stx, boost::weak_ptr(shared_from_this()))); #ifndef TRUST_NETWORK } @@ -931,7 +931,7 @@ static void checkPropose(Job& job, boost::shared_ptr packe if (isTrusted) { theApp->getJobQueue().addJob(jtPROPOSAL_t, "trustedProposal", - boost::bind(&NetworkOPs::processTrustedProposal, &theApp->getOPs(), + BIND_TYPE(&NetworkOPs::processTrustedProposal, &theApp->getOPs(), proposal, packet, nodePublic, prevLedger, sigGood)); } else if (sigGood && (prevLedger == consensusLCL)) @@ -1002,7 +1002,7 @@ void Peer::recvPropose(const boost::shared_ptr& packet) set.proposeseq(), proposeHash, set.closetime(), signerPublic, suppression); theApp->getJobQueue().addJob(isTrusted ? jtPROPOSAL_t : jtPROPOSAL_ut, "recvPropose->checkPropose", - boost::bind(&checkPropose, _1, packet, proposal, consensusLCL, + BIND_TYPE(&checkPropose, P_1, packet, proposal, consensusLCL, mNodePublic, boost::weak_ptr(shared_from_this()))); } @@ -1078,7 +1078,7 @@ void Peer::recvValidation(const boost::shared_ptr& packet) bool isTrusted = theApp->getUNL().nodeInUNL(val->getSignerPublic()); theApp->getJobQueue().addJob(isTrusted ? jtVALIDATION_t : jtVALIDATION_ut, "recvValidation->checkValidation", - boost::bind(&checkValidation, _1, val, signingHash, isTrusted, packet, + BIND_TYPE(&checkValidation, P_1, val, signingHash, isTrusted, packet, boost::weak_ptr(shared_from_this()))); } #ifndef TRUST_NETWORK @@ -1315,7 +1315,7 @@ void Peer::recvProofWork(ripple::TMProofWork& packet) } theApp->getJobQueue().addJob(jtPROOFWORK, "recvProof->doProof", - boost::bind(&Peer::doProofOfWork, _1, boost::weak_ptr(shared_from_this()), pow)); + BIND_TYPE(&Peer::doProofOfWork, P_1, boost::weak_ptr(shared_from_this()), pow)); return; } @@ -1666,8 +1666,8 @@ void Peer::recvLedger(const boost::shared_ptr& packet_ptr) } theApp->getJobQueue().addJob(jtLEDGER_DATA, "gotLedgerData", - boost::bind(&LedgerAcquireMaster::gotLedgerData, &theApp->getMasterLedgerAcquire(), - _1, packet_ptr, boost::weak_ptr(shared_from_this()))); + BIND_TYPE(&LedgerAcquireMaster::gotLedgerData, &theApp->getMasterLedgerAcquire(), + P_1, packet_ptr, boost::weak_ptr(shared_from_this()))); } bool Peer::hasLedger(const uint256& hash) const diff --git a/src/cpp/ripple/TransactionQueue.h b/src/cpp/ripple/TransactionQueue.h index 5f8ef6914..ae7c997de 100644 --- a/src/cpp/ripple/TransactionQueue.h +++ b/src/cpp/ripple/TransactionQueue.h @@ -21,7 +21,7 @@ class TXQEntry public: typedef boost::shared_ptr pointer; typedef const boost::shared_ptr& ref; - typedef boost::function stCallback; // must complete immediately + typedef FUNCTION_TYPE stCallback; // must complete immediately protected: Transaction::pointer mTxn; diff --git a/src/cpp/ripple/ValidationCollection.cpp b/src/cpp/ripple/ValidationCollection.cpp index cdbb2818e..a3bdb951b 100644 --- a/src/cpp/ripple/ValidationCollection.cpp +++ b/src/cpp/ripple/ValidationCollection.cpp @@ -297,7 +297,7 @@ void ValidationCollection::condWrite() return; mWriting = true; theApp->getJobQueue().addJob(jtWRITE, "ValidationCollection::doWrite", - boost::bind(&ValidationCollection::doWrite, this, _1)); + BIND_TYPE(&ValidationCollection::doWrite, this, P_1)); } void ValidationCollection::doWrite(Job&) diff --git a/src/cpp/ripple/WSHandler.h b/src/cpp/ripple/WSHandler.h index 32976f714..1f2d2f59b 100644 --- a/src/cpp/ripple/WSHandler.h +++ b/src/cpp/ripple/WSHandler.h @@ -153,13 +153,13 @@ public: // Must be done without holding the websocket send lock theApp->getJobQueue().addJob(jtCLIENT, "WSClient::destroy", - boost::bind(&WSConnection::destroy, ptr)); + BIND_TYPE(&WSConnection::destroy, ptr)); } void on_message(connection_ptr cpClient, message_ptr mpMessage) { theApp->getJobQueue().addJob(jtCLIENT, "WSClient::command", - boost::bind(&WSServerHandler::do_message, this, _1, cpClient, mpMessage)); + BIND_TYPE(&WSServerHandler::do_message, this, P_1, cpClient, mpMessage)); } void do_message(Job& job, connection_ptr cpClient, message_ptr mpMessage) diff --git a/src/cpp/ripple/utils.h b/src/cpp/ripple/utils.h index 9938a26d3..6dcea2520 100644 --- a/src/cpp/ripple/utils.h +++ b/src/cpp/ripple/utils.h @@ -289,13 +289,28 @@ bool parseUrl(const std::string& strUrl, std::string& strScheme, std::string& st #if (!defined(FORCE_NO_C11X) && (__cplusplus > 201100L)) || defined(FORCE_C11X) #define C11X -#define UPTR_T std::unique_ptr -#define MOVE_P(p) std::move(p) +#include +#define UPTR_T std::unique_ptr +#define MOVE_P(p) std::move(p) +#define BIND_TYPE std::bind +#define FUNCTION_TYPE std::function +#define P_1 std::placeholders::_1 +#define P_2 std::placeholders::_2 +#define P_3 std::placeholders::_3 +#define P_4 std::placeholders::_4 #else -#define UPTR_T std::auto_ptr -#define MOVE_P(p) (p) +#include +#include +#define UPTR_T std::auto_ptr +#define MOVE_P(p) (p) +#define BIND_TYPE boost::bind +#define FUNCTION_TYPE boost::function +#define P_1 _1 +#define P_2 _2 +#define P_3 _3 +#define P_4 _4 #endif