From 7552f9eacf9d9823820f47cd3d66fdd3fb5f7db3 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 20 Feb 2013 09:33:09 -0800 Subject: [PATCH] Some optimizations. --- src/cpp/ripple/Ledger.h | 1 + src/cpp/ripple/RPCHandler.cpp | 5 +++++ src/cpp/ripple/ScopedLock.h | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/Ledger.h b/src/cpp/ripple/Ledger.h index cf09383ac7..20da8705f6 100644 --- a/src/cpp/ripple/Ledger.h +++ b/src/cpp/ripple/Ledger.h @@ -133,6 +133,7 @@ public: bool isClosed() { return mClosed; } bool isAccepted() { return mAccepted; } bool isImmutable() { return mImmutable; } + bool isFixed() { return mClosed || mImmutable; } // ledger signature operations void addRaw(Serializer &s) const; diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 2fea3c24ae..ff105ea849 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -899,6 +899,8 @@ Json::Value RPCHandler::doAccountLines(Json::Value jvRequest) if (!lpLedger) return jvResult; + ScopedUnlock su(theApp->getMasterLock(), lpLedger->isFixed()); + if (!jvRequest.isMember("account")) return rpcError(rpcINVALID_PARAMS); @@ -926,6 +928,7 @@ Json::Value RPCHandler::doAccountLines(Json::Value jvRequest) jvResult["account"] = raAccount.humanAccountID(); + // XXX This is wrong, we do access the current ledger and do need to worry about changes. // We access a committed ledger and need not worry about changes. @@ -977,6 +980,8 @@ Json::Value RPCHandler::doAccountOffers(Json::Value jvRequest) if (!lpLedger) return jvResult; + ScopedUnlock su(theApp->getMasterLock(), lpLedger->isClosed() || lpLedger->isImmutable()); + if (!jvRequest.isMember("account")) return rpcError(rpcINVALID_PARAMS); diff --git a/src/cpp/ripple/ScopedLock.h b/src/cpp/ripple/ScopedLock.h index e0859fd774..e1a1fe9225 100644 --- a/src/cpp/ripple/ScopedLock.h +++ b/src/cpp/ripple/ScopedLock.h @@ -29,11 +29,39 @@ public: class ScopedUnlock { protected: + bool mUnlocked; boost::recursive_mutex& mMutex; public: - ScopedUnlock(boost::recursive_mutex& mutex) : mMutex(mutex) { mMutex.unlock(); } - ~ScopedUnlock() { mMutex.lock(); } + ScopedUnlock(boost::recursive_mutex& mutex, bool unlock = true) : mUnlocked(unlock), mMutex(mutex) + { + if (unlock) + mMutex.unlock(); + } + + ~ScopedUnlock() + { + if (mUnlocked) + mMutex.lock(); + } + + void lock() + { + if (mUnlocked) + { + mMutex.lock(); + mUnlocked = false; + } + } + + void unlock() + { + if (!mUnlocked) + { + mUnlocked = true; + mMutex.unlock(); + } + } private: ScopedUnlock(const ScopedUnlock&); // no implementation