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:
Oleksiy Vyalov
2015-02-19 17:58:04 +00:00
parent f08a3ccf50
commit 8bc34f4d96
6 changed files with 33 additions and 13 deletions

View File

@@ -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;

View File

@@ -435,3 +435,9 @@ NativeProcessProtocol::DoStopIDBumped (uint32_t /* newBumpId */)
{
// Default implementation does nothing.
}
void
NativeProcessProtocol::Terminate ()
{
// Default implementation does nothing.
}

View File

@@ -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

View File

@@ -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.
// ---------------------------------------------------------------------

View File

@@ -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);
}
}
}
}

View File

@@ -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