diff options
Diffstat (limited to 'lldb/source/Plugins/Process/Linux')
| -rw-r--r-- | lldb/source/Plugins/Process/Linux/ProcessLinux.cpp | 12 | ||||
| -rw-r--r-- | lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp | 40 | ||||
| -rw-r--r-- | lldb/source/Plugins/Process/Linux/ProcessMonitor.h | 12 |
3 files changed, 47 insertions, 17 deletions
diff --git a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp index 6a0c54c36ad..2171a6dbb2f 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp +++ b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp @@ -87,7 +87,6 @@ ProcessLinux::ProcessLinux(Target& target, Listener &listener) m_in_limbo(false), m_exit_now(false) { - #if 0 // FIXME: Putting this code in the ctor and saving the byte order in a // member variable is a hack to avoid const qual issues in GetByteOrder. @@ -152,7 +151,6 @@ ProcessLinux::DoLaunch (Module *module, SetPrivateState(eStateLaunching); - uint32_t launch_flags = launch_info.GetFlags().Get(); const char *stdin_path = NULL; const char *stdout_path = NULL; const char *stderr_path = NULL; @@ -270,7 +268,13 @@ ProcessLinux::DoHalt(bool &caused_stop) Error ProcessLinux::DoDetach() { - return Error(1, eErrorTypeGeneric); + Error error; + + error = m_monitor->Detach(); + if (error.Success()) + SetPrivateState(eStateDetached); + + return error; } Error @@ -388,7 +392,7 @@ bool ProcessLinux::IsAlive() { StateType state = GetPrivateState(); - return state != eStateExited && state != eStateInvalid; + return state != eStateDetached && state != eStateExited && state != eStateInvalid; } size_t diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp index 2a844623080..c154c5555db 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp +++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp @@ -722,6 +722,30 @@ KillOperation::Execute(ProcessMonitor *monitor) m_result = true; } +//------------------------------------------------------------------------------ +/// @class KillOperation +/// @brief Implements ProcessMonitor::BringProcessIntoLimbo. +class DetachOperation : public Operation +{ +public: + DetachOperation(Error &result) : m_error(result) { } + + void Execute(ProcessMonitor *monitor); + +private: + Error &m_error; +}; + +void +DetachOperation::Execute(ProcessMonitor *monitor) +{ + lldb::pid_t pid = monitor->GetPID(); + + if (ptrace(PT_DETACH, pid, NULL, 0) < 0) + m_error.SetErrorToErrno(); + +} + ProcessMonitor::OperationArgs::OperationArgs(ProcessMonitor *monitor) : m_monitor(monitor) { @@ -1220,7 +1244,7 @@ ProcessMonitor::MonitorCallback(void *callback_baton, ProcessMessage ProcessMonitor::MonitorSIGTRAP(ProcessMonitor *monitor, - const struct siginfo *info, lldb::pid_t pid) + const siginfo_t *info, lldb::pid_t pid) { ProcessMessage message; @@ -1261,7 +1285,7 @@ ProcessMonitor::MonitorSIGTRAP(ProcessMonitor *monitor, ProcessMessage ProcessMonitor::MonitorSignal(ProcessMonitor *monitor, - const struct siginfo *info, lldb::pid_t pid) + const siginfo_t *info, lldb::pid_t pid) { ProcessMessage message; int signo = info->si_signo; @@ -1312,7 +1336,7 @@ ProcessMonitor::MonitorSignal(ProcessMonitor *monitor, } ProcessMessage::CrashReason -ProcessMonitor::GetCrashReasonForSIGSEGV(const struct siginfo *info) +ProcessMonitor::GetCrashReasonForSIGSEGV(const siginfo_t *info) { ProcessMessage::CrashReason reason; assert(info->si_signo == SIGSEGV); @@ -1336,7 +1360,7 @@ ProcessMonitor::GetCrashReasonForSIGSEGV(const struct siginfo *info) } ProcessMessage::CrashReason -ProcessMonitor::GetCrashReasonForSIGILL(const struct siginfo *info) +ProcessMonitor::GetCrashReasonForSIGILL(const siginfo_t *info) { ProcessMessage::CrashReason reason; assert(info->si_signo == SIGILL); @@ -1378,7 +1402,7 @@ ProcessMonitor::GetCrashReasonForSIGILL(const struct siginfo *info) } ProcessMessage::CrashReason -ProcessMonitor::GetCrashReasonForSIGFPE(const struct siginfo *info) +ProcessMonitor::GetCrashReasonForSIGFPE(const siginfo_t *info) { ProcessMessage::CrashReason reason; assert(info->si_signo == SIGFPE); @@ -1420,7 +1444,7 @@ ProcessMonitor::GetCrashReasonForSIGFPE(const struct siginfo *info) } ProcessMessage::CrashReason -ProcessMonitor::GetCrashReasonForSIGBUS(const struct siginfo *info) +ProcessMonitor::GetCrashReasonForSIGBUS(const siginfo_t *info) { ProcessMessage::CrashReason reason; assert(info->si_signo == SIGBUS); @@ -1646,7 +1670,9 @@ bool ProcessMonitor::Detach() { bool result; - KillOperation op(result); + lldb_private::Error error; + DetachOperation op(error); + result = error.Success(); DoOperation(&op); StopMonitor(); return result; diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.h b/lldb/source/Plugins/Process/Linux/ProcessMonitor.h index ba6a76d7ab5..fdccb67745a 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.h +++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.h @@ -257,23 +257,23 @@ private: static ProcessMessage MonitorSIGTRAP(ProcessMonitor *monitor, - const struct siginfo *info, lldb::pid_t pid); + const siginfo_t *info, lldb::pid_t pid); static ProcessMessage MonitorSignal(ProcessMonitor *monitor, - const struct siginfo *info, lldb::pid_t pid); + const siginfo_t *info, lldb::pid_t pid); static ProcessMessage::CrashReason - GetCrashReasonForSIGSEGV(const struct siginfo *info); + GetCrashReasonForSIGSEGV(const siginfo_t *info); static ProcessMessage::CrashReason - GetCrashReasonForSIGILL(const struct siginfo *info); + GetCrashReasonForSIGILL(const siginfo_t *info); static ProcessMessage::CrashReason - GetCrashReasonForSIGFPE(const struct siginfo *info); + GetCrashReasonForSIGFPE(const siginfo_t *info); static ProcessMessage::CrashReason - GetCrashReasonForSIGBUS(const struct siginfo *info); + GetCrashReasonForSIGBUS(const siginfo_t *info); void DoOperation(Operation *op); |

