diff options
| author | Greg Clayton <gclayton@apple.com> | 2012-10-16 20:20:18 +0000 |
|---|---|---|
| committer | Greg Clayton <gclayton@apple.com> | 2012-10-16 20:20:18 +0000 |
| commit | 743ecf43930d62ba55f58bd30f82ba7de502c0c3 (patch) | |
| tree | 449caa51eeeaf405620b2411661debfff8e6b3ac /lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp | |
| parent | e4ad2a0b96f0d836bf8e4e65b9b786dc2105d966 (diff) | |
| download | bcm5719-llvm-743ecf43930d62ba55f58bd30f82ba7de502c0c3.tar.gz bcm5719-llvm-743ecf43930d62ba55f58bd30f82ba7de502c0c3.zip | |
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
Diffstat (limited to 'lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp')
| -rw-r--r-- | lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp | 54 |
1 files changed, 25 insertions, 29 deletions
diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp index 4daccee945f..46ea84bdf25 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp +++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp @@ -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,13 +1689,25 @@ 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) { if (fd != -1) |

