diff --git a/src/LedgerAcquire.cpp b/src/LedgerAcquire.cpp index 2100641b21..d90e3d2d88 100644 --- a/src/LedgerAcquire.cpp +++ b/src/LedgerAcquire.cpp @@ -1,12 +1,17 @@ -#include "boost/foreach.hpp" -#include "boost/make_shared.hpp" - -#include "Application.h" #include "LedgerAcquire.h" +#include +#include +#include + +#include "Application.h" + +#define LEDGER_ACQUIRE_TIMEOUT 2 + LedgerAcquire::LedgerAcquire(const uint256& hash) : mHash(hash), - mComplete(false), mFailed(false), mHaveBase(false), mHaveState(false), mHaveTransactions(false) + mComplete(false), mFailed(false), mHaveBase(false), mHaveState(false), mHaveTransactions(false), + mTimer(theApp->getIOService()) { #ifdef DEBUG std::cerr << "Acquiring ledger " << mHash.GetHex() << std::endl; @@ -29,15 +34,18 @@ void LedgerAcquire::done() triggers[i](shared_from_this()); } -void LedgerAcquire::setTimer() +void LedgerAcquire::resetTimer() { - // WRITEME + mTimer.expires_from_now(boost::posix_time::seconds(LEDGER_ACQUIRE_TIMEOUT)); + mTimer.async_wait(boost::bind(&LedgerAcquire::timerEntry, + boost::weak_ptr(shared_from_this()), boost::asio::placeholders::error)); } -void LedgerAcquire::timerEntry(boost::weak_ptr wptr) +void LedgerAcquire::timerEntry(boost::weak_ptr wptr, const boost::system::error_code& result) { + if (result == boost::asio::error::operation_aborted) return; LedgerAcquire::pointer ptr = wptr.lock(); - if (ptr) ptr->trigger(true); + if (!!ptr) ptr->trigger(); } void LedgerAcquire::addOnComplete(boost::function trigger) @@ -47,7 +55,7 @@ void LedgerAcquire::addOnComplete(boost::function mLock.unlock(); } -void LedgerAcquire::trigger(bool timer) +void LedgerAcquire::trigger() { #ifdef DEBUG std::cerr << "Trigger acquiring ledger " << mHash.GetHex() << std::endl; @@ -151,8 +159,8 @@ void LedgerAcquire::trigger(bool timer) if (mComplete || mFailed) done(); - else if (timer) - setTimer(); + else + resetTimer(); } void LedgerAcquire::sendRequest(boost::shared_ptr tmGL) @@ -286,12 +294,10 @@ LedgerAcquire::pointer LedgerAcquireMaster::findCreate(const uint256& hash) { boost::mutex::scoped_lock sl(mLock); LedgerAcquire::pointer& ptr = mLedgers[hash]; - if (ptr) - { - ptr->trigger(); - return ptr; - } + if (ptr) return ptr; ptr = boost::make_shared(hash); + assert(mLedgers[hash] == ptr); + ptr->resetTimer(); // Cannot call in constructor return ptr; } diff --git a/src/LedgerAcquire.h b/src/LedgerAcquire.h index 40456a6bab..05bac39be7 100644 --- a/src/LedgerAcquire.h +++ b/src/LedgerAcquire.h @@ -4,8 +4,10 @@ #include #include -#include "boost/enable_shared_from_this.hpp" -#include "boost/function.hpp" +#include +#include +#include +#include #include "Ledger.h" #include "Peer.h" @@ -21,16 +23,18 @@ protected: Ledger::pointer mLedger; uint256 mHash; bool mComplete, mFailed, mHaveBase, mHaveState, mHaveTransactions; + + boost::asio::deadline_timer mTimer; + std::vector< boost::function > mOnComplete; std::list > mPeers; // peers known to have this ledger void done(); - void trigger(bool timer); + void trigger(); - static void timerEntry(boost::weak_ptr); + static void timerEntry(boost::weak_ptr, const boost::system::error_code&); void sendRequest(boost::shared_ptr message); - void setTimer(); public: LedgerAcquire(const uint256& hash); @@ -42,7 +46,6 @@ public: bool isAcctStComplete() const { return mHaveState; } bool isTransComplete() const { return mHaveTransactions; } Ledger::pointer getLedger() { return mLedger; } - void trigger() { trigger(false); } void addOnComplete(boost::function); @@ -51,6 +54,7 @@ public: bool takeBase(const std::string& data); bool takeTxNode(const std::list& IDs, const std::list >& data); bool takeAsNode(const std::list& IDs, const std::list >& data); + void resetTimer(); }; class LedgerAcquireMaster