backport wakeup fix
This commit is contained in:
parent
60a3d11df2
commit
a35385a5c0
1 changed files with 14 additions and 2 deletions
|
@ -64,9 +64,21 @@ void CScheduler::serviceQueue()
|
||||||
// Explicitly use a template here to avoid hitting that overload.
|
// Explicitly use a template here to avoid hitting that overload.
|
||||||
while (!shouldStop() && !taskQueue.empty()) {
|
while (!shouldStop() && !taskQueue.empty()) {
|
||||||
boost::chrono::system_clock::time_point timeToWaitFor = taskQueue.begin()->first;
|
boost::chrono::system_clock::time_point timeToWaitFor = taskQueue.begin()->first;
|
||||||
if (newTaskScheduled.wait_until<>(lock, timeToWaitFor) == boost::cv_status::timeout)
|
try {
|
||||||
|
if (newTaskScheduled.wait_until<>(lock, timeToWaitFor) == boost::cv_status::timeout) {
|
||||||
break; // Exit loop after timeout, it means we reached the time of the event
|
break; // Exit loop after timeout, it means we reached the time of the event
|
||||||
}
|
}
|
||||||
|
} catch (boost::thread_interrupted) {
|
||||||
|
// We need to make sure we don't ignore this, or the thread won't end
|
||||||
|
throw;
|
||||||
|
} catch (...) {
|
||||||
|
// Some boost versions have a bug that can cause a time prior to system boot (or wake from sleep) to throw an exception instead of return timeout
|
||||||
|
// See https://github.com/boostorg/thread/issues/308
|
||||||
|
// Check if the time has passed and, if so, break gracefully
|
||||||
|
if (timeToWaitFor <= boost::chrono::system_clock::now()) break;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
// If there are multiple threads, the queue can empty while we're waiting (another
|
// If there are multiple threads, the queue can empty while we're waiting (another
|
||||||
// thread may service the task we were waiting on).
|
// thread may service the task we were waiting on).
|
||||||
|
|
Loading…
Reference in a new issue