Files
clang-p2996/lldb/source/Host/posix/HostProcessPosix.cpp
Pavel Labath 12c9c4a885 [lldb/host] Remove monitor_signals argument from process monitoring functions
All current callers set the argument to false. monitor_signals=true used
to be used in the Process plugins (which needed to know when the
debugged process gets a signal), but this implementation has several
serious issues, which means that individual process plugins now
orchestrate the monitoring of debugged processes themselves.

This allows us to simplify the implementation (no need to play with
process groups), and the interface (we only catch fatal events, so the
callback is always called just once).

Differential Revision: https://reviews.llvm.org/D120425
2022-02-24 11:12:59 +01:00

67 lines
1.8 KiB
C++

//===-- HostProcessPosix.cpp ----------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "lldb/Host/Host.h"
#include "lldb/Host/FileSystem.h"
#include "lldb/Host/posix/HostProcessPosix.h"
#include "llvm/ADT/STLExtras.h"
#include <climits>
#include <csignal>
#include <unistd.h>
using namespace lldb_private;
static const int kInvalidPosixProcess = 0;
HostProcessPosix::HostProcessPosix()
: HostNativeProcessBase(kInvalidPosixProcess) {}
HostProcessPosix::HostProcessPosix(lldb::process_t process)
: HostNativeProcessBase(process) {}
HostProcessPosix::~HostProcessPosix() = default;
Status HostProcessPosix::Signal(int signo) const {
if (m_process == kInvalidPosixProcess) {
Status error;
error.SetErrorString("HostProcessPosix refers to an invalid process");
return error;
}
return HostProcessPosix::Signal(m_process, signo);
}
Status HostProcessPosix::Signal(lldb::process_t process, int signo) {
Status error;
if (-1 == ::kill(process, signo))
error.SetErrorToErrno();
return error;
}
Status HostProcessPosix::Terminate() { return Signal(SIGKILL); }
lldb::pid_t HostProcessPosix::GetProcessId() const { return m_process; }
bool HostProcessPosix::IsRunning() const {
if (m_process == kInvalidPosixProcess)
return false;
// Send this process the null signal. If it succeeds the process is running.
Status error = Signal(0);
return error.Success();
}
llvm::Expected<HostThread> HostProcessPosix::StartMonitoring(
const Host::MonitorChildProcessCallback &callback) {
return Host::StartMonitoringChildProcess(callback, m_process);
}