| //===-- Progress.cpp ------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "lldb/Core/Progress.h" |
| |
| #include "lldb/Core/Debugger.h" |
| #include "lldb/Utility/StreamString.h" |
| |
| using namespace lldb; |
| using namespace lldb_private; |
| |
| std::atomic<uint64_t> Progress::g_id(0); |
| |
| Progress::Progress(std::string title, uint64_t total, |
| lldb_private::Debugger *debugger) |
| : m_title(title), m_id(++g_id), m_completed(0), m_total(total) { |
| assert(total > 0); |
| if (debugger) |
| m_debugger_id = debugger->GetID(); |
| std::lock_guard<std::mutex> guard(m_mutex); |
| ReportProgress(); |
| } |
| |
| Progress::~Progress() { |
| // Make sure to always report progress completed when this object is |
| // destructed so it indicates the progress dialog/activity should go away. |
| std::lock_guard<std::mutex> guard(m_mutex); |
| if (!m_completed) { |
| m_completed = m_total; |
| ReportProgress(); |
| } |
| } |
| |
| void Progress::Increment(uint64_t amount) { |
| if (amount > 0) { |
| std::lock_guard<std::mutex> guard(m_mutex); |
| // Watch out for unsigned overflow and make sure we don't increment too |
| // much and exceed m_total. |
| if (amount > (m_total - m_completed)) |
| m_completed = m_total; |
| else |
| m_completed += amount; |
| ReportProgress(); |
| } |
| } |
| |
| void Progress::ReportProgress() { |
| if (!m_complete) { |
| // Make sure we only send one notification that indicates the progress is |
| // complete. |
| m_complete = m_completed == m_total; |
| Debugger::ReportProgress(m_id, m_title, m_completed, m_total, |
| m_debugger_id); |
| } |
| } |