180814287SRaphael Isemann //===-- HostProcessPosix.cpp ----------------------------------------------===//
24e82ec9cSZachary Turner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64e82ec9cSZachary Turner //
74e82ec9cSZachary Turner //===----------------------------------------------------------------------===//
84e82ec9cSZachary Turner 
9172d37d3SZachary Turner #include "lldb/Host/Host.h"
104e82ec9cSZachary Turner #include "lldb/Host/FileSystem.h"
11b9c1b51eSKate Stone #include "lldb/Host/posix/HostProcessPosix.h"
124e82ec9cSZachary Turner 
134e82ec9cSZachary Turner #include "llvm/ADT/STLExtras.h"
144e82ec9cSZachary Turner 
1576e47d48SRaphael Isemann #include <climits>
16b6dbe9a9SPavel Labath #include <csignal>
17b6dbe9a9SPavel Labath #include <unistd.h>
184e82ec9cSZachary Turner 
194e82ec9cSZachary Turner using namespace lldb_private;
204e82ec9cSZachary Turner 
2193c1b3caSPavel Labath static const int kInvalidPosixProcess = 0;
220b9bab48SZachary Turner 
HostProcessPosix()234e82ec9cSZachary Turner HostProcessPosix::HostProcessPosix()
24b9c1b51eSKate Stone     : HostNativeProcessBase(kInvalidPosixProcess) {}
254e82ec9cSZachary Turner 
HostProcessPosix(lldb::process_t process)26d4007783SZachary Turner HostProcessPosix::HostProcessPosix(lldb::process_t process)
27b9c1b51eSKate Stone     : HostNativeProcessBase(process) {}
28d4007783SZachary Turner 
29fd2433e1SJonas Devlieghere HostProcessPosix::~HostProcessPosix() = default;
304e82ec9cSZachary Turner 
Signal(int signo) const3197206d57SZachary Turner Status HostProcessPosix::Signal(int signo) const {
32b9c1b51eSKate Stone   if (m_process == kInvalidPosixProcess) {
3397206d57SZachary Turner     Status error;
344e82ec9cSZachary Turner     error.SetErrorString("HostProcessPosix refers to an invalid process");
354e82ec9cSZachary Turner     return error;
364e82ec9cSZachary Turner   }
374e82ec9cSZachary Turner 
38f5e4f37cSZachary Turner   return HostProcessPosix::Signal(m_process, signo);
394e82ec9cSZachary Turner }
404e82ec9cSZachary Turner 
Signal(lldb::process_t process,int signo)4197206d57SZachary Turner Status HostProcessPosix::Signal(lldb::process_t process, int signo) {
4297206d57SZachary Turner   Status error;
434e82ec9cSZachary Turner 
44f5e4f37cSZachary Turner   if (-1 == ::kill(process, signo))
454e82ec9cSZachary Turner     error.SetErrorToErrno();
464e82ec9cSZachary Turner 
474e82ec9cSZachary Turner   return error;
484e82ec9cSZachary Turner }
494e82ec9cSZachary Turner 
Terminate()5097206d57SZachary Turner Status HostProcessPosix::Terminate() { return Signal(SIGKILL); }
51f5e4f37cSZachary Turner 
GetProcessId() const52b9c1b51eSKate Stone lldb::pid_t HostProcessPosix::GetProcessId() const { return m_process; }
534e82ec9cSZachary Turner 
IsRunning() const54b9c1b51eSKate Stone bool HostProcessPosix::IsRunning() const {
55c76a4452SZachary Turner   if (m_process == kInvalidPosixProcess)
56c76a4452SZachary Turner     return false;
57c76a4452SZachary Turner 
584e82ec9cSZachary Turner   // Send this process the null signal.  If it succeeds the process is running.
5997206d57SZachary Turner   Status error = Signal(0);
604e82ec9cSZachary Turner   return error.Success();
614e82ec9cSZachary Turner }
62172d37d3SZachary Turner 
StartMonitoring(const Host::MonitorChildProcessCallback & callback)6323d10f7aSFangrui Song llvm::Expected<HostThread> HostProcessPosix::StartMonitoring(
64*12c9c4a8SPavel Labath     const Host::MonitorChildProcessCallback &callback) {
65*12c9c4a8SPavel Labath   return Host::StartMonitoringChildProcess(callback, m_process);
66172d37d3SZachary Turner }
67