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 AndricHostProcessPosix::HostProcessPosix() 240b57cec5SDimitry Andric : HostNativeProcessBase(kInvalidPosixProcess) {} 250b57cec5SDimitry Andric HostProcessPosix(lldb::process_t process)260b57cec5SDimitry AndricHostProcessPosix::HostProcessPosix(lldb::process_t process) 270b57cec5SDimitry Andric : HostNativeProcessBase(process) {} 280b57cec5SDimitry Andric 29fe6060f1SDimitry Andric HostProcessPosix::~HostProcessPosix() = default; 300b57cec5SDimitry Andric Signal(int signo) const310b57cec5SDimitry AndricStatus 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 AndricStatus 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 AndricStatus HostProcessPosix::Terminate() { return Signal(SIGKILL); } 510b57cec5SDimitry Andric GetProcessId() const520b57cec5SDimitry Andriclldb::pid_t HostProcessPosix::GetProcessId() const { return m_process; } 530b57cec5SDimitry Andric IsRunning() const540b57cec5SDimitry Andricbool 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 Andricllvm::Expected<HostThread> HostProcessPosix::StartMonitoring( 64*81ad6265SDimitry Andric const Host::MonitorChildProcessCallback &callback) { 65*81ad6265SDimitry Andric return Host::StartMonitoringChildProcess(callback, m_process); 660b57cec5SDimitry Andric } 67