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:
Greg Clayton 2012-10-16 20:20:18 +00:00
parent e4ad2a0b96
commit 743ecf4393
2 changed files with 30 additions and 36 deletions

View File

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

View File

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