forked from OSchip/llvm-project
Patch from Matt Kopec:
This patch fixes an issue where if lldb fails to attach to a process (ie. invalid pid) on Linux, the process monitor thread gets stuck waiting for a signal from the attach thread, which never comes due to not being signaled. It also implements StopOpThread which is used for both attach/launch cases as I'm not aware of any special handling needed for the attach case. Also, propagate 'Error' from the Detach function instead of using a bool. llvm-svn: 166055
This commit is contained in:
parent
e4ad2a0b96
commit
743ecf4393
|
@ -843,7 +843,7 @@ WAIT_AGAIN:
|
|||
// Check that the launch was a success.
|
||||
if (!args->m_error.Success())
|
||||
{
|
||||
StopLaunchOpThread();
|
||||
StopOpThread();
|
||||
error = args->m_error;
|
||||
return;
|
||||
}
|
||||
|
@ -898,10 +898,10 @@ WAIT_AGAIN:
|
|||
}
|
||||
}
|
||||
|
||||
// Check that the launch was a success.
|
||||
// Check that the attach was a success.
|
||||
if (!args->m_error.Success())
|
||||
{
|
||||
StopAttachOpThread();
|
||||
StopOpThread();
|
||||
error = args->m_error;
|
||||
return;
|
||||
}
|
||||
|
@ -936,18 +936,6 @@ ProcessMonitor::StartLaunchOpThread(LaunchArgs *args, Error &error)
|
|||
Host::ThreadCreate(g_thread_name, LaunchOpThread, args, &error);
|
||||
}
|
||||
|
||||
void
|
||||
ProcessMonitor::StopLaunchOpThread()
|
||||
{
|
||||
lldb::thread_result_t result;
|
||||
|
||||
if (!IS_VALID_LLDB_HOST_THREAD(m_operation_thread))
|
||||
return;
|
||||
|
||||
Host::ThreadCancel(m_operation_thread, NULL);
|
||||
Host::ThreadJoin(m_operation_thread, &result, NULL);
|
||||
}
|
||||
|
||||
void *
|
||||
ProcessMonitor::LaunchOpThread(void *arg)
|
||||
{
|
||||
|
@ -1142,19 +1130,15 @@ ProcessMonitor::StartAttachOpThread(AttachArgs *args, lldb_private::Error &error
|
|||
Host::ThreadCreate(g_thread_name, AttachOpThread, args, &error);
|
||||
}
|
||||
|
||||
void
|
||||
ProcessMonitor::StopAttachOpThread()
|
||||
{
|
||||
assert(!"Not implemented yet!!!");
|
||||
}
|
||||
|
||||
void *
|
||||
ProcessMonitor::AttachOpThread(void *arg)
|
||||
{
|
||||
AttachArgs *args = static_cast<AttachArgs*>(arg);
|
||||
|
||||
if (!Attach(args))
|
||||
if (!Attach(args)) {
|
||||
sem_post(&args->m_semaphore);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ServeOperation(args);
|
||||
return NULL;
|
||||
|
@ -1665,16 +1649,16 @@ ProcessMonitor::GetEventMessage(lldb::tid_t tid, unsigned long *message)
|
|||
return result;
|
||||
}
|
||||
|
||||
bool
|
||||
lldb_private::Error
|
||||
ProcessMonitor::Detach()
|
||||
{
|
||||
bool result;
|
||||
lldb_private::Error error;
|
||||
DetachOperation op(error);
|
||||
result = error.Success();
|
||||
DoOperation(&op);
|
||||
if (m_pid != LLDB_INVALID_PROCESS_ID) {
|
||||
DetachOperation op(error);
|
||||
DoOperation(&op);
|
||||
}
|
||||
StopMonitor();
|
||||
return result;
|
||||
return error;
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -1705,12 +1689,24 @@ void
|
|||
ProcessMonitor::StopMonitor()
|
||||
{
|
||||
StopMonitoringChildProcess();
|
||||
StopLaunchOpThread();
|
||||
StopOpThread();
|
||||
CloseFD(m_terminal_fd);
|
||||
CloseFD(m_client_fd);
|
||||
CloseFD(m_server_fd);
|
||||
}
|
||||
|
||||
void
|
||||
ProcessMonitor::StopOpThread()
|
||||
{
|
||||
lldb::thread_result_t result;
|
||||
|
||||
if (!IS_VALID_LLDB_HOST_THREAD(m_operation_thread))
|
||||
return;
|
||||
|
||||
Host::ThreadCancel(m_operation_thread, NULL);
|
||||
Host::ThreadJoin(m_operation_thread, &result, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
ProcessMonitor::CloseFD(int &fd)
|
||||
{
|
||||
|
|
|
@ -158,7 +158,7 @@ public:
|
|||
bool
|
||||
BringProcessIntoLimbo();
|
||||
|
||||
bool
|
||||
lldb_private::Error
|
||||
Detach();
|
||||
|
||||
|
||||
|
@ -213,9 +213,6 @@ private:
|
|||
void
|
||||
StartLaunchOpThread(LaunchArgs *args, lldb_private::Error &error);
|
||||
|
||||
void
|
||||
StopLaunchOpThread();
|
||||
|
||||
static void *
|
||||
LaunchOpThread(void *arg);
|
||||
|
||||
|
@ -238,9 +235,6 @@ private:
|
|||
void
|
||||
StartAttachOpThread(AttachArgs *args, lldb_private::Error &error);
|
||||
|
||||
void
|
||||
StopAttachOpThread();
|
||||
|
||||
static void *
|
||||
AttachOpThread(void *args);
|
||||
|
||||
|
@ -287,6 +281,10 @@ private:
|
|||
void
|
||||
StopMonitor();
|
||||
|
||||
/// Stops the operation thread used to attach/launch a process.
|
||||
void
|
||||
StopOpThread();
|
||||
|
||||
void
|
||||
CloseFD(int &fd);
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue