
LLDB can often appear deadlocked to users that use IDEs when it is indexing DWARF, or parsing symbol tables. These long running operations can make a debug session appear to be doing nothing even though a lot of work is going on inside LLDB. This patch adds a public API to allow clients to listen to debugger events that report progress and will allow UI to create an activity window or display that can show users what is going on and keep them informed of expensive operations that are going on inside LLDB. Differential Revision: https://reviews.llvm.org/D97739
61 lines
1.8 KiB
C++
61 lines
1.8 KiB
C++
//===-- 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);
|
|
}
|
|
}
|