19 assert(nThreadsServicingQueue == 0);
20 if (stopWhenEmpty)
assert(taskQueue.empty());
27 ++nThreadsServicingQueue;
43 std::chrono::system_clock::time_point timeToWaitFor = taskQueue.begin()->first;
44 if (
newTaskScheduled.wait_until(lock, timeToWaitFor) == std::cv_status::timeout) {
54 Function f = taskQueue.begin()->second;
55 taskQueue.erase(taskQueue.begin());
64 --nThreadsServicingQueue;
68 --nThreadsServicingQueue;
76 taskQueue.insert(std::make_pair(t, f));
83 assert(delta_seconds.count() > 0 && delta_seconds < std::chrono::hours{1});
89 std::multimap<std::chrono::system_clock::time_point, Function> temp_queue;
91 for (
const auto& element : taskQueue) {
92 temp_queue.emplace_hint(temp_queue.cend(), element.first - delta_seconds, element.second);
96 taskQueue = std::move(temp_queue);
115 std::chrono::system_clock::time_point& last)
const
118 size_t result = taskQueue.size();
119 if (!taskQueue.empty()) {
120 first = taskQueue.begin()->first;
121 last = taskQueue.rbegin()->first;
129 return nThreadsServicingQueue;
140 if (m_are_callbacks_running)
return;
141 if (m_callbacks_pending.empty())
return;
148 std::function<void()> callback;
151 if (m_are_callbacks_running)
return;
152 if (m_callbacks_pending.empty())
return;
153 m_are_callbacks_running =
true;
155 callback = std::move(m_callbacks_pending.front());
156 m_callbacks_pending.pop_front();
161 struct RAIICallbacksRunning {
164 ~RAIICallbacksRunning()
168 instance->m_are_callbacks_running =
false;
172 } raiicallbacksrunning(
this);
183 m_callbacks_pending.emplace_back(std::move(func));
191 bool should_continue =
true;
192 while (should_continue) {
195 should_continue = !m_callbacks_pending.empty();
202 return m_callbacks_pending.size();