Browse Source

Make sure we re-acquire lock if a task throws

0.13
Casey Rodarmor 9 years ago
parent
commit
fb08d92312
  1. 6
      src/scheduler.cpp

6
src/scheduler.cpp

@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
#include <assert.h>
#include <boost/bind.hpp>
#include <boost/thread/reverse_lock.hpp>
#include <utility>
CScheduler::CScheduler() : nThreadsServicingQueue(0), stopRequested(false), stopWhenEmpty(false)
@ -65,11 +66,12 @@ void CScheduler::serviceQueue() @@ -65,11 +66,12 @@ void CScheduler::serviceQueue()
Function f = taskQueue.begin()->second;
taskQueue.erase(taskQueue.begin());
{
// Unlock before calling f, so it can reschedule itself or another task
// without deadlocking:
lock.unlock();
boost::reverse_lock<boost::unique_lock<boost::mutex> > rlock(lock);
f();
lock.lock();
}
} catch (...) {
--nThreadsServicingQueue;
throw;

Loading…
Cancel
Save