ProcessMonitor & RegisterContextPOSIXProcessMonitor_powerpc::GetMonitor() { ProcessSP base = CalculateProcess(); ProcessFreeBSD *process = static_cast<ProcessFreeBSD*>(base.get()); return process->GetMonitor(); }
void FreeBSDThread::WillResume(lldb::StateType resume_state) { Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_THREAD)); if (log) log->Printf("tid %" PRIu64 " resume_state = %s", GetID(), lldb_private::StateAsCString(resume_state)); ProcessSP process_sp(GetProcess()); ProcessFreeBSD *process = static_cast<ProcessFreeBSD *>(process_sp.get()); int signo = GetResumeSignal(); bool signo_valid = process->GetUnixSignals()->SignalIsValid(signo); switch (resume_state) { case eStateSuspended: case eStateStopped: process->m_suspend_tids.push_back(GetID()); break; case eStateRunning: process->m_run_tids.push_back(GetID()); if (signo_valid) process->m_resume_signo = signo; break; case eStateStepping: process->m_step_tids.push_back(GetID()); if (signo_valid) process->m_resume_signo = signo; break; default: break; } }
bool ProcessMonitor::MonitorCallback(void *callback_baton, lldb::pid_t pid, bool exited, int signal, int status) { ProcessMessage message; ProcessMonitor *monitor = static_cast<ProcessMonitor*>(callback_baton); ProcessFreeBSD *process = monitor->m_process; bool stop_monitoring; siginfo_t info; if (!monitor->GetSignalInfo(pid, &info)) stop_monitoring = true; // pid is gone. Bail. else { switch (info.si_signo) { case SIGTRAP: message = MonitorSIGTRAP(monitor, &info, pid); break; default: message = MonitorSignal(monitor, &info, pid); break; } process->SendMessage(message); stop_monitoring = message.GetKind() == ProcessMessage::eExitMessage; } return stop_monitoring; }
bool ProcessMonitor::MonitorCallback(void *callback_baton, lldb::pid_t pid, bool exited, int signal, int status) { ProcessMessage message; ProcessMonitor *monitor = static_cast<ProcessMonitor*>(callback_baton); ProcessFreeBSD *process = monitor->m_process; assert(process); bool stop_monitoring; struct ptrace_lwpinfo plwp; int ptrace_err; Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS)); if (exited) { if (log) log->Printf ("ProcessMonitor::%s() got exit signal, tid = %" PRIu64, __FUNCTION__, pid); message = ProcessMessage::Exit(pid, status); process->SendMessage(message); return pid == process->GetID(); } if (!monitor->GetLwpInfo(pid, &plwp, ptrace_err)) stop_monitoring = true; // pid is gone. Bail. else { switch (plwp.pl_siginfo.si_signo) { case SIGTRAP: message = MonitorSIGTRAP(monitor, &plwp.pl_siginfo, plwp.pl_lwpid); break; default: message = MonitorSignal(monitor, &plwp.pl_siginfo, plwp.pl_lwpid); break; } process->SendMessage(message); stop_monitoring = message.GetKind() == ProcessMessage::eExitMessage; } return stop_monitoring; }