[Lldb-commits] [lldb] 355c791 - [lldb] [llgs] Convert m_debugged_processes into a map of structs
Michał Górny via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 14 06:41:56 PDT 2022
Author: Michał Górny
Date: 2022-07-14T15:32:19+02:00
New Revision: 355c7916336fb4922946a8cfc174dbdb514dddb5
URL: https://github.com/llvm/llvm-project/commit/355c7916336fb4922946a8cfc174dbdb514dddb5
DIFF: https://github.com/llvm/llvm-project/commit/355c7916336fb4922946a8cfc174dbdb514dddb5.diff
LOG: [lldb] [llgs] Convert m_debugged_processes into a map of structs
Convert the m_debugged_processes map from NativeProcessProtocol pointers
to structs, and combine the additional set(s) holding the additional
process properties into a flag field inside this struct. This is
desirable since there are more properties to come and having a single
structure with all information should be cleaner and more efficient than
using multiple sets for that.
Suggested by Pavel Labath in D128893.
Differential Revision: https://reviews.llvm.org/D129652
Added:
Modified:
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
index 63174ef55219..7ddb4c80e16d 100644
--- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.cpp
@@ -290,7 +290,9 @@ Status GDBRemoteCommunicationServerLLGS::LaunchProcess() {
if (!process_or)
return Status(process_or.takeError());
m_continue_process = m_current_process = process_or->get();
- m_debugged_processes[m_current_process->GetID()] = std::move(*process_or);
+ m_debugged_processes.emplace(
+ m_current_process->GetID(),
+ DebuggedProcess{std::move(*process_or), DebuggedProcess::Flag{}});
}
SetEnabledExtensions(*m_current_process);
@@ -361,7 +363,9 @@ Status GDBRemoteCommunicationServerLLGS::AttachToProcess(lldb::pid_t pid) {
return status;
}
m_continue_process = m_current_process = process_or->get();
- m_debugged_processes[m_current_process->GetID()] = std::move(*process_or);
+ m_debugged_processes.emplace(
+ m_current_process->GetID(),
+ DebuggedProcess{std::move(*process_or), DebuggedProcess::Flag{}});
SetEnabledExtensions(*m_current_process);
// Setup stdout/stderr mapping from inferior.
@@ -489,12 +493,14 @@ GDBRemoteCommunicationServerLLGS::SendWResponse(
*wait_status);
// If the process was killed through vKill, return "OK".
- if (m_vkilled_processes.find(process->GetID()) != m_vkilled_processes.end())
+ if (bool(m_debugged_processes.at(process->GetID()).flags &
+ DebuggedProcess::Flag::vkilled))
return SendOKResponse();
StreamGDBRemote response;
response.Format("{0:g}", *wait_status);
- if (bool(m_extensions_supported & NativeProcessProtocol::Extension::multiprocess))
+ if (bool(m_extensions_supported &
+ NativeProcessProtocol::Extension::multiprocess))
response.Format(";process:{0:x-}", process->GetID());
if (m_non_stop)
return SendNotificationPacketNoLock("Stop", m_stop_notification_queue,
@@ -1045,14 +1051,14 @@ void GDBRemoteCommunicationServerLLGS::HandleInferiorState_Exited(
lldb::pid_t pid = process->GetID();
m_mainloop.AddPendingCallback([this, pid](MainLoopBase &loop) {
- m_debugged_processes.erase(pid);
- auto vkill_it = m_vkilled_processes.find(pid);
- if (vkill_it != m_vkilled_processes.end())
- m_vkilled_processes.erase(vkill_it);
+ auto find_it = m_debugged_processes.find(pid);
+ assert(find_it != m_debugged_processes.end());
+ bool vkilled = bool(find_it->second.flags & DebuggedProcess::Flag::vkilled);
+ m_debugged_processes.erase(find_it);
// Terminate the main loop only if vKill has not been used.
// When running in non-stop mode, wait for the vStopped to clear
// the notification queue.
- else if (m_debugged_processes.empty() && !m_non_stop) {
+ if (m_debugged_processes.empty() && !m_non_stop && !vkilled) {
// Close the pipe to the inferior terminal i/o if we launched it and set
// one up.
MaybeCloseInferiorTerminalConnection();
@@ -1147,7 +1153,9 @@ void GDBRemoteCommunicationServerLLGS::NewSubprocess(
lldb::pid_t child_pid = child_process->GetID();
assert(child_pid != LLDB_INVALID_PROCESS_ID);
assert(m_debugged_processes.find(child_pid) == m_debugged_processes.end());
- m_debugged_processes[child_pid] = std::move(child_process);
+ m_debugged_processes.emplace(
+ child_pid,
+ DebuggedProcess{std::move(child_process), DebuggedProcess::Flag{}});
}
void GDBRemoteCommunicationServerLLGS::DataAvailableCallback() {
@@ -1432,7 +1440,7 @@ GDBRemoteCommunicationServerLLGS::Handle_k(StringExtractorGDBRemote &packet) {
for (auto it = m_debugged_processes.begin(); it != m_debugged_processes.end();
++it) {
LLDB_LOG(log, "Killing process {0}", it->first);
- Status error = it->second->Kill();
+ Status error = it->second.process_up->Kill();
if (error.Fail())
LLDB_LOG(log, "Failed to kill debugged process {0}: {1}", it->first,
error);
@@ -1460,12 +1468,12 @@ GDBRemoteCommunicationServerLLGS::Handle_vKill(
if (it == m_debugged_processes.end())
return SendErrorResponse(42);
- Status error = it->second->Kill();
+ Status error = it->second.process_up->Kill();
if (error.Fail())
return SendErrorResponse(error.ToError());
// OK response is sent when the process dies.
- m_vkilled_processes.insert(pid);
+ it->second.flags |= DebuggedProcess::Flag::vkilled;
return PacketResult::Success;
}
@@ -1770,7 +1778,7 @@ GDBRemoteCommunicationServerLLGS::Handle_vCont(
return SendErrorResponse(GDBRemoteServerError::eErrorResume);
}
- Status error = process_it->second->Resume(x.second);
+ Status error = process_it->second.process_up->Resume(x.second);
if (error.Fail()) {
LLDB_LOG(log, "vCont failed for process {0}: {1}", x.first, error);
return SendErrorResponse(GDBRemoteServerError::eErrorResume);
@@ -1998,7 +2006,7 @@ GDBRemoteCommunicationServerLLGS::Handle_qfThreadInfo(
StreamGDBRemote response;
for (auto &pid_ptr : m_debugged_processes)
- AddProcessThreads(response, *pid_ptr.second, had_any);
+ AddProcessThreads(response, *pid_ptr.second.process_up, had_any);
if (!had_any)
return SendOKResponse();
@@ -2284,7 +2292,8 @@ GDBRemoteCommunicationServerLLGS::Handle_H(StringExtractorGDBRemote &packet) {
// Ensure we have the given thread when not specifying -1 (all threads) or 0
// (any thread).
if (tid != LLDB_INVALID_THREAD_ID && tid != 0) {
- NativeThreadProtocol *thread = new_process_it->second->GetThreadByID(tid);
+ NativeThreadProtocol *thread =
+ new_process_it->second.process_up->GetThreadByID(tid);
if (!thread) {
LLDB_LOGF(log,
"GDBRemoteCommunicationServerLLGS::%s failed, tid %" PRIu64
@@ -2297,12 +2306,12 @@ GDBRemoteCommunicationServerLLGS::Handle_H(StringExtractorGDBRemote &packet) {
// Now switch the given process and thread type.
switch (h_variant) {
case 'g':
- m_current_process = new_process_it->second.get();
+ m_current_process = new_process_it->second.process_up.get();
SetCurrentThreadID(tid);
break;
case 'c':
- m_continue_process = new_process_it->second.get();
+ m_continue_process = new_process_it->second.process_up.get();
SetContinueThreadID(tid);
break;
@@ -3466,12 +3475,12 @@ GDBRemoteCommunicationServerLLGS::Handle_D(StringExtractorGDBRemote &packet) {
LLDB_LOGF(log,
"GDBRemoteCommunicationServerLLGS::%s detaching %" PRId64,
__FUNCTION__, it->first);
- if (llvm::Error e = it->second->Detach().ToError())
+ if (llvm::Error e = it->second.process_up->Detach().ToError())
detach_error = llvm::joinErrors(std::move(detach_error), std::move(e));
else {
- if (it->second.get() == m_current_process)
+ if (it->second.process_up.get() == m_current_process)
m_current_process = nullptr;
- if (it->second.get() == m_continue_process)
+ if (it->second.process_up.get() == m_continue_process)
m_continue_process = nullptr;
it = m_debugged_processes.erase(it);
detached = true;
@@ -3907,7 +3916,7 @@ GDBRemoteCommunicationServerLLGS::Handle_T(StringExtractorGDBRemote &packet) {
return SendErrorResponse(1);
// Check the thread ID
- if (!new_process_it->second->GetThreadByID(tid))
+ if (!new_process_it->second.process_up->GetThreadByID(tid))
return SendErrorResponse(2);
return SendOKResponse();
@@ -4108,7 +4117,7 @@ std::vector<std::string> GDBRemoteCommunicationServerLLGS::HandleFeatures(
ret.push_back("vfork-events+");
for (auto &x : m_debugged_processes)
- SetEnabledExtensions(*x.second);
+ SetEnabledExtensions(*x.second.process_up);
return ret;
}
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h
index 5187a953f957..cdbda0e9ca8a 100644
--- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h
+++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServerLLGS.h
@@ -85,6 +85,17 @@ class GDBRemoteCommunicationServerLLGS
Status InitializeConnection(std::unique_ptr<Connection> connection);
+ struct DebuggedProcess {
+ enum class Flag {
+ vkilled = (1u << 0),
+
+ LLVM_MARK_AS_BITMASK_ENUM(vkilled)
+ };
+
+ std::unique_ptr<NativeProcessProtocol> process_up;
+ Flag flags;
+ };
+
protected:
MainLoop &m_mainloop;
MainLoop::ReadHandleUP m_network_handle_up;
@@ -94,9 +105,7 @@ class GDBRemoteCommunicationServerLLGS
NativeProcessProtocol *m_current_process;
NativeProcessProtocol *m_continue_process;
std::recursive_mutex m_debugged_process_mutex;
- std::unordered_map<lldb::pid_t, std::unique_ptr<NativeProcessProtocol>>
- m_debugged_processes;
- std::unordered_set<lldb::pid_t> m_vkilled_processes;
+ std::unordered_map<lldb::pid_t, DebuggedProcess> m_debugged_processes;
Communication m_stdio_communication;
MainLoop::ReadHandleUP m_stdio_handle_up;
More information about the lldb-commits
mailing list