From c984f83eb67b011de0d182ca93514a8119dcd4f9 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 1 Mar 2013 18:27:07 -0800 Subject: [PATCH] Fix for job destruction race condition. --- src/cpp/ripple/JobQueue.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/cpp/ripple/JobQueue.cpp b/src/cpp/ripple/JobQueue.cpp index cc2aadb40..3dc9386d0 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;