xref: /freebsd-src/contrib/llvm-project/lldb/source/Host/posix/HostProcessPosix.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
15ffd83dbSDimitry Andric //===-- HostProcessPosix.cpp ----------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/Host/Host.h"
100b57cec5SDimitry Andric #include "lldb/Host/FileSystem.h"
110b57cec5SDimitry Andric #include "lldb/Host/posix/HostProcessPosix.h"
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
140b57cec5SDimitry Andric 
15fe6060f1SDimitry Andric #include <climits>
160b57cec5SDimitry Andric #include <csignal>
170b57cec5SDimitry Andric #include <unistd.h>
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric using namespace lldb_private;
200b57cec5SDimitry Andric 
21349cc55cSDimitry Andric static const int kInvalidPosixProcess = 0;
220b57cec5SDimitry Andric 
HostProcessPosix()230b57cec5SDimitry Andric HostProcessPosix::HostProcessPosix()
240b57cec5SDimitry Andric     : HostNativeProcessBase(kInvalidPosixProcess) {}
250b57cec5SDimitry Andric 
HostProcessPosix(lldb::process_t process)260b57cec5SDimitry Andric HostProcessPosix::HostProcessPosix(lldb::process_t process)
270b57cec5SDimitry Andric     : HostNativeProcessBase(process) {}
280b57cec5SDimitry Andric 
29fe6060f1SDimitry Andric HostProcessPosix::~HostProcessPosix() = default;
300b57cec5SDimitry Andric 
Signal(int signo) const310b57cec5SDimitry Andric Status HostProcessPosix::Signal(int signo) const {
320b57cec5SDimitry Andric   if (m_process == kInvalidPosixProcess) {
330b57cec5SDimitry Andric     Status error;
340b57cec5SDimitry Andric     error.SetErrorString("HostProcessPosix refers to an invalid process");
350b57cec5SDimitry Andric     return error;
360b57cec5SDimitry Andric   }
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric   return HostProcessPosix::Signal(m_process, signo);
390b57cec5SDimitry Andric }
400b57cec5SDimitry Andric 
Signal(lldb::process_t process,int signo)410b57cec5SDimitry Andric Status HostProcessPosix::Signal(lldb::process_t process, int signo) {
420b57cec5SDimitry Andric   Status error;
430b57cec5SDimitry Andric 
440b57cec5SDimitry Andric   if (-1 == ::kill(process, signo))
450b57cec5SDimitry Andric     error.SetErrorToErrno();
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric   return error;
480b57cec5SDimitry Andric }
490b57cec5SDimitry Andric 
Terminate()500b57cec5SDimitry Andric Status HostProcessPosix::Terminate() { return Signal(SIGKILL); }
510b57cec5SDimitry Andric 
GetProcessId() const520b57cec5SDimitry Andric lldb::pid_t HostProcessPosix::GetProcessId() const { return m_process; }
530b57cec5SDimitry Andric 
IsRunning() const540b57cec5SDimitry Andric bool HostProcessPosix::IsRunning() const {
550b57cec5SDimitry Andric   if (m_process == kInvalidPosixProcess)
560b57cec5SDimitry Andric     return false;
570b57cec5SDimitry Andric 
580b57cec5SDimitry Andric   // Send this process the null signal.  If it succeeds the process is running.
590b57cec5SDimitry Andric   Status error = Signal(0);
600b57cec5SDimitry Andric   return error.Success();
610b57cec5SDimitry Andric }
620b57cec5SDimitry Andric 
StartMonitoring(const Host::MonitorChildProcessCallback & callback)630b57cec5SDimitry Andric llvm::Expected<HostThread> HostProcessPosix::StartMonitoring(
64*81ad6265SDimitry Andric     const Host::MonitorChildProcessCallback &callback) {
65*81ad6265SDimitry Andric   return Host::StartMonitoringChildProcess(callback, m_process);
660b57cec5SDimitry Andric }
67