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 TurnerHostProcessPosix::HostProcessPosix() 24b9c1b51eSKate Stone : HostNativeProcessBase(kInvalidPosixProcess) {} 254e82ec9cSZachary Turner HostProcessPosix(lldb::process_t process)26d4007783SZachary TurnerHostProcessPosix::HostProcessPosix(lldb::process_t process) 27b9c1b51eSKate Stone : HostNativeProcessBase(process) {} 28d4007783SZachary Turner 29fd2433e1SJonas Devlieghere HostProcessPosix::~HostProcessPosix() = default; 304e82ec9cSZachary Turner Signal(int signo) const3197206d57SZachary TurnerStatus 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 TurnerStatus 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 TurnerStatus HostProcessPosix::Terminate() { return Signal(SIGKILL); } 51f5e4f37cSZachary Turner GetProcessId() const52b9c1b51eSKate Stonelldb::pid_t HostProcessPosix::GetProcessId() const { return m_process; } 534e82ec9cSZachary Turner IsRunning() const54b9c1b51eSKate Stonebool 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 Songllvm::Expected<HostThread> HostProcessPosix::StartMonitoring( 64*12c9c4a8SPavel Labath const Host::MonitorChildProcessCallback &callback) { 65*12c9c4a8SPavel Labath return Host::StartMonitoringChildProcess(callback, m_process); 66172d37d3SZachary Turner } 67