mirror of
https://github.com/intel/llvm.git
synced 2026-01-18 07:57:36 +08:00
Prevent LLGS from crashing when exiting - make NativeProcessLinux to wait until ThreadStateCoordinator is fully stopped before entering ~NativeProcessLinux.
http://reviews.llvm.org/D7692 llvm-svn: 229875
This commit is contained in:
@@ -283,6 +283,10 @@ namespace lldb_private
|
||||
bool
|
||||
UnregisterNativeDelegate (NativeDelegate &native_delegate);
|
||||
|
||||
// Called before termination of NativeProcessProtocol's instance.
|
||||
virtual void
|
||||
Terminate ();
|
||||
|
||||
protected:
|
||||
lldb::pid_t m_pid;
|
||||
|
||||
|
||||
@@ -435,3 +435,9 @@ NativeProcessProtocol::DoStopIDBumped (uint32_t /* newBumpId */)
|
||||
{
|
||||
// Default implementation does nothing.
|
||||
}
|
||||
|
||||
void
|
||||
NativeProcessProtocol::Terminate ()
|
||||
{
|
||||
// Default implementation does nothing.
|
||||
}
|
||||
|
||||
@@ -1453,7 +1453,8 @@ WAIT_AGAIN:
|
||||
}
|
||||
}
|
||||
|
||||
NativeProcessLinux::~NativeProcessLinux()
|
||||
void
|
||||
NativeProcessLinux::Terminate ()
|
||||
{
|
||||
StopMonitor();
|
||||
}
|
||||
@@ -3637,6 +3638,7 @@ NativeProcessLinux::StopCoordinatorThread()
|
||||
// Tell the coordinator we're done. This will cause the coordinator
|
||||
// run loop thread to exit when the processing queue hits this message.
|
||||
m_coordinator_up->StopCoordinator ();
|
||||
m_coordinator_thread.Join (nullptr);
|
||||
}
|
||||
|
||||
bool
|
||||
|
||||
@@ -61,12 +61,6 @@ namespace lldb_private
|
||||
lldb_private::NativeProcessProtocol::NativeDelegate &native_delegate,
|
||||
NativeProcessProtocolSP &native_process_sp);
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// Public Instance Methods
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
~NativeProcessLinux() override;
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// NativeProcessProtocol Interface
|
||||
// ---------------------------------------------------------------------
|
||||
@@ -118,6 +112,9 @@ namespace lldb_private
|
||||
void
|
||||
DoStopIDBumped (uint32_t newBumpId) override;
|
||||
|
||||
void
|
||||
Terminate () override;
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// Interface used by NativeRegisterContext-derived classes.
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
@@ -270,13 +270,17 @@ NativeThreadLinux::SetRunning ()
|
||||
// then this is a new thread. So set all existing watchpoints.
|
||||
if (m_watchpoint_index_map.empty())
|
||||
{
|
||||
const auto &watchpoint_map = GetProcess()->GetWatchpointMap();
|
||||
if (watchpoint_map.empty()) return;
|
||||
GetRegisterContext()->ClearAllHardwareWatchpoints();
|
||||
for (const auto &pair : watchpoint_map)
|
||||
const auto process_sp = GetProcess();
|
||||
if (process_sp)
|
||||
{
|
||||
const auto& wp = pair.second;
|
||||
SetWatchpoint(wp.m_addr, wp.m_size, wp.m_watch_flags, wp.m_hardware);
|
||||
const auto &watchpoint_map = process_sp->GetWatchpointMap();
|
||||
if (watchpoint_map.empty()) return;
|
||||
GetRegisterContext()->ClearAllHardwareWatchpoints();
|
||||
for (const auto &pair : watchpoint_map)
|
||||
{
|
||||
const auto& wp = pair.second;
|
||||
SetWatchpoint(wp.m_addr, wp.m_size, wp.m_watch_flags, wp.m_hardware);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,6 +99,13 @@ GDBRemoteCommunicationServerLLGS::GDBRemoteCommunicationServerLLGS(
|
||||
//----------------------------------------------------------------------
|
||||
GDBRemoteCommunicationServerLLGS::~GDBRemoteCommunicationServerLLGS()
|
||||
{
|
||||
Mutex::Locker locker (m_debugged_process_mutex);
|
||||
|
||||
if (m_debugged_process_sp)
|
||||
{
|
||||
m_debugged_process_sp->Terminate ();
|
||||
m_debugged_process_sp.reset ();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user