| 1 | //===-- MainLoopBase.cpp --------------------------------------------------===// |
|---|---|
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #include "lldb/Host/MainLoopBase.h" |
| 10 | #include <chrono> |
| 11 | |
| 12 | using namespace lldb; |
| 13 | using namespace lldb_private; |
| 14 | |
| 15 | void MainLoopBase::AddCallback(const Callback &callback, TimePoint point) { |
| 16 | bool interrupt_needed; |
| 17 | { |
| 18 | std::lock_guard<std::mutex> lock{m_callback_mutex}; |
| 19 | // We need to interrupt the main thread if this callback is scheduled to |
| 20 | // execute at an earlier time than the earliest callback registered so far. |
| 21 | interrupt_needed = m_callbacks.empty() || point < m_callbacks.top().first; |
| 22 | m_callbacks.emplace(args&: point, args: callback); |
| 23 | } |
| 24 | if (interrupt_needed) |
| 25 | Interrupt(); |
| 26 | } |
| 27 | |
| 28 | void MainLoopBase::ProcessCallbacks() { |
| 29 | while (true) { |
| 30 | Callback callback; |
| 31 | { |
| 32 | std::lock_guard<std::mutex> lock{m_callback_mutex}; |
| 33 | if (m_callbacks.empty() || |
| 34 | std::chrono::steady_clock::now() < m_callbacks.top().first) |
| 35 | return; |
| 36 | callback = std::move(m_callbacks.top().second); |
| 37 | m_callbacks.pop(); |
| 38 | } |
| 39 | |
| 40 | callback(*this); |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | std::optional<MainLoopBase::TimePoint> MainLoopBase::GetNextWakeupTime() { |
| 45 | std::lock_guard<std::mutex> lock(m_callback_mutex); |
| 46 | if (m_callbacks.empty()) |
| 47 | return std::nullopt; |
| 48 | return m_callbacks.top().first; |
| 49 | } |
| 50 |
