21 assert(nThreadsServicingQueue == 0);
22 if (stopWhenEmpty)
assert(taskQueue.empty());
30 ++nThreadsServicingQueue;
46 std::chrono::system_clock::time_point timeToWaitFor = taskQueue.begin()->first;
47 if (
newTaskScheduled.wait_until(lock, timeToWaitFor) == std::cv_status::timeout) {
57 Function f = taskQueue.begin()->second;
58 taskQueue.erase(taskQueue.begin());
67 --nThreadsServicingQueue;
71 --nThreadsServicingQueue;
79 taskQueue.insert(std::make_pair(
t, f));
86 assert(delta_seconds > 0s && delta_seconds <= 1h);
92 std::multimap<std::chrono::system_clock::time_point, Function> temp_queue;
94 for (
const auto& element : taskQueue) {
95 temp_queue.emplace_hint(temp_queue.cend(), element.first - delta_seconds, element.second);
99 taskQueue = std::move(temp_queue);
118 std::chrono::system_clock::time_point& last)
const
121 size_t result = taskQueue.size();
122 if (!taskQueue.empty()) {
123 first = taskQueue.begin()->first;
124 last = taskQueue.rbegin()->first;
132 return nThreadsServicingQueue;
143 if (m_are_callbacks_running)
return;
144 if (m_callbacks_pending.empty())
return;
151 std::function<void()> callback;
154 if (m_are_callbacks_running)
return;
155 if (m_callbacks_pending.empty())
return;
156 m_are_callbacks_running =
true;
158 callback = std::move(m_callbacks_pending.front());
159 m_callbacks_pending.pop_front();
164 struct RAIICallbacksRunning {
167 ~RAIICallbacksRunning()
171 instance->m_are_callbacks_running =
false;
175 } raiicallbacksrunning(
this);
186 m_callbacks_pending.emplace_back(std::move(func));
194 bool should_continue =
true;
195 while (should_continue) {
198 should_continue = !m_callbacks_pending.empty();
205 return m_callbacks_pending.size();