xref: /openbsd-src/gnu/llvm/lldb/source/Host/posix/HostProcessPosix.cpp (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1dda28197Spatrick //===-- HostProcessPosix.cpp ----------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick 
9061da546Spatrick #include "lldb/Host/Host.h"
10061da546Spatrick #include "lldb/Host/FileSystem.h"
11061da546Spatrick #include "lldb/Host/posix/HostProcessPosix.h"
12061da546Spatrick 
13061da546Spatrick #include "llvm/ADT/STLExtras.h"
14061da546Spatrick 
15be691f3bSpatrick #include <climits>
16061da546Spatrick #include <csignal>
17061da546Spatrick #include <unistd.h>
18061da546Spatrick 
19061da546Spatrick using namespace lldb_private;
20061da546Spatrick 
21*f6aab3d8Srobert static const int kInvalidPosixProcess = 0;
22061da546Spatrick 
HostProcessPosix()23061da546Spatrick HostProcessPosix::HostProcessPosix()
24061da546Spatrick     : HostNativeProcessBase(kInvalidPosixProcess) {}
25061da546Spatrick 
HostProcessPosix(lldb::process_t process)26061da546Spatrick HostProcessPosix::HostProcessPosix(lldb::process_t process)
27061da546Spatrick     : HostNativeProcessBase(process) {}
28061da546Spatrick 
29be691f3bSpatrick HostProcessPosix::~HostProcessPosix() = default;
30061da546Spatrick 
Signal(int signo) const31061da546Spatrick Status HostProcessPosix::Signal(int signo) const {
32061da546Spatrick   if (m_process == kInvalidPosixProcess) {
33061da546Spatrick     Status error;
34061da546Spatrick     error.SetErrorString("HostProcessPosix refers to an invalid process");
35061da546Spatrick     return error;
36061da546Spatrick   }
37061da546Spatrick 
38061da546Spatrick   return HostProcessPosix::Signal(m_process, signo);
39061da546Spatrick }
40061da546Spatrick 
Signal(lldb::process_t process,int signo)41061da546Spatrick Status HostProcessPosix::Signal(lldb::process_t process, int signo) {
42061da546Spatrick   Status error;
43061da546Spatrick 
44061da546Spatrick   if (-1 == ::kill(process, signo))
45061da546Spatrick     error.SetErrorToErrno();
46061da546Spatrick 
47061da546Spatrick   return error;
48061da546Spatrick }
49061da546Spatrick 
Terminate()50061da546Spatrick Status HostProcessPosix::Terminate() { return Signal(SIGKILL); }
51061da546Spatrick 
GetProcessId() const52061da546Spatrick lldb::pid_t HostProcessPosix::GetProcessId() const { return m_process; }
53061da546Spatrick 
IsRunning() const54061da546Spatrick bool HostProcessPosix::IsRunning() const {
55061da546Spatrick   if (m_process == kInvalidPosixProcess)
56061da546Spatrick     return false;
57061da546Spatrick 
58061da546Spatrick   // Send this process the null signal.  If it succeeds the process is running.
59061da546Spatrick   Status error = Signal(0);
60061da546Spatrick   return error.Success();
61061da546Spatrick }
62061da546Spatrick 
StartMonitoring(const Host::MonitorChildProcessCallback & callback)63061da546Spatrick llvm::Expected<HostThread> HostProcessPosix::StartMonitoring(
64*f6aab3d8Srobert     const Host::MonitorChildProcessCallback &callback) {
65*f6aab3d8Srobert   return Host::StartMonitoringChildProcess(callback, m_process);
66061da546Spatrick }
67