diff --git a/src/cpp/ripple/JobQueue.cpp b/src/cpp/ripple/JobQueue.cpp index cc2aadb40b..3dc9386d0e 100644 --- a/src/cpp/ripple/JobQueue.cpp +++ b/src/cpp/ripple/JobQueue.cpp @@ -256,16 +256,18 @@ void JobQueue::threadEntry() break; std::set::iterator it = mJobSet.begin(); - Job job(*it); - mJobSet.erase(it); - --mJobCounts[job.getType()]; + { + Job job(*it); + mJobSet.erase(it); + --mJobCounts[job.getType()]; - if (job.getType() == jtDEATH) - break; + if (job.getType() == jtDEATH) + break; - sl.unlock(); - cLog(lsTRACE) << "Doing " << Job::toString(job.getType()) << " job"; - job.doJob(); + sl.unlock(); + cLog(lsTRACE) << "Doing " << Job::toString(job.getType()) << " job"; + job.doJob(); + } // must destroy job without holding lock sl.lock(); } --mThreadCount; diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 728d18d278..dcd526c842 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -1696,12 +1696,14 @@ bool NetworkOPs::subLedger(InfoSub::ref isrListener, Json::Value& jvResult) jvResult["reserve_base"] = Json::UInt(lpClosed->getReserve(0)); jvResult["reserve_inc"] = Json::UInt(lpClosed->getReserveInc()); + boost::recursive_mutex::scoped_lock sl(mMonitorLock); return mSubLedger.insert(std::make_pair(isrListener->getSeq(), isrListener)).second; } // <-- bool: true=erased, false=was not there bool NetworkOPs::unsubLedger(uint64 uSeq) { + boost::recursive_mutex::scoped_lock sl(mMonitorLock); return !!mSubLedger.erase(uSeq); } @@ -1722,36 +1724,42 @@ bool NetworkOPs::subServer(InfoSub::ref isrListener, Json::Value& jvResult) jvResult["load_base"] = theApp->getFeeTrack().getLoadBase(); jvResult["load_factor"] = theApp->getFeeTrack().getLoadFactor(); + boost::recursive_mutex::scoped_lock sl(mMonitorLock); return mSubServer.insert(std::make_pair(isrListener->getSeq(), isrListener)).second; } // <-- bool: true=erased, false=was not there bool NetworkOPs::unsubServer(uint64 uSeq) { + boost::recursive_mutex::scoped_lock sl(mMonitorLock); return !!mSubServer.erase(uSeq); } // <-- bool: true=added, false=already there bool NetworkOPs::subTransactions(InfoSub::ref isrListener) { + boost::recursive_mutex::scoped_lock sl(mMonitorLock); return mSubTransactions.insert(std::make_pair(isrListener->getSeq(), isrListener)).second; } // <-- bool: true=erased, false=was not there bool NetworkOPs::unsubTransactions(uint64 uSeq) { + boost::recursive_mutex::scoped_lock sl(mMonitorLock); return !!mSubTransactions.erase(uSeq); } // <-- bool: true=added, false=already there bool NetworkOPs::subRTTransactions(InfoSub::ref isrListener) { + boost::recursive_mutex::scoped_lock sl(mMonitorLock); return mSubTransactions.insert(std::make_pair(isrListener->getSeq(), isrListener)).second; } // <-- bool: true=erased, false=was not there bool NetworkOPs::unsubRTTransactions(uint64 uSeq) { + boost::recursive_mutex::scoped_lock sl(mMonitorLock); return !!mSubTransactions.erase(uSeq); }