1*802dc402STodd Fiala //===-- SBUnixSignals.cpp -------------------------------------------*- C++ -*-===// 2*802dc402STodd Fiala // 3*802dc402STodd Fiala // The LLVM Compiler Infrastructure 4*802dc402STodd Fiala // 5*802dc402STodd Fiala // This file is distributed under the University of Illinois Open Source 6*802dc402STodd Fiala // License. See LICENSE.TXT for details. 7*802dc402STodd Fiala // 8*802dc402STodd Fiala //===----------------------------------------------------------------------===// 9*802dc402STodd Fiala 10*802dc402STodd Fiala #include "lldb/lldb-defines.h" 11*802dc402STodd Fiala #include "lldb/Target/Process.h" 12*802dc402STodd Fiala #include "lldb/Target/UnixSignals.h" 13*802dc402STodd Fiala #include "lldb/Core/Log.h" 14*802dc402STodd Fiala 15*802dc402STodd Fiala #include "lldb/API/SBUnixSignals.h" 16*802dc402STodd Fiala 17*802dc402STodd Fiala using namespace lldb; 18*802dc402STodd Fiala using namespace lldb_private; 19*802dc402STodd Fiala 20*802dc402STodd Fiala SBUnixSignals::SBUnixSignals () 21*802dc402STodd Fiala {} 22*802dc402STodd Fiala 23*802dc402STodd Fiala SBUnixSignals::SBUnixSignals (const SBUnixSignals &rhs) : 24*802dc402STodd Fiala m_opaque_wp(rhs.m_opaque_wp) 25*802dc402STodd Fiala { 26*802dc402STodd Fiala } 27*802dc402STodd Fiala 28*802dc402STodd Fiala SBUnixSignals::SBUnixSignals (ProcessSP &process_sp) : 29*802dc402STodd Fiala m_opaque_wp(process_sp) 30*802dc402STodd Fiala { 31*802dc402STodd Fiala } 32*802dc402STodd Fiala 33*802dc402STodd Fiala const SBUnixSignals& 34*802dc402STodd Fiala SBUnixSignals::operator = (const SBUnixSignals& rhs) 35*802dc402STodd Fiala { 36*802dc402STodd Fiala if (this != &rhs) 37*802dc402STodd Fiala m_opaque_wp = rhs.m_opaque_wp; 38*802dc402STodd Fiala return *this; 39*802dc402STodd Fiala } 40*802dc402STodd Fiala 41*802dc402STodd Fiala SBUnixSignals::~SBUnixSignals() 42*802dc402STodd Fiala { 43*802dc402STodd Fiala } 44*802dc402STodd Fiala 45*802dc402STodd Fiala ProcessSP 46*802dc402STodd Fiala SBUnixSignals::GetSP() const 47*802dc402STodd Fiala { 48*802dc402STodd Fiala return m_opaque_wp.lock(); 49*802dc402STodd Fiala } 50*802dc402STodd Fiala 51*802dc402STodd Fiala void 52*802dc402STodd Fiala SBUnixSignals::SetSP (const ProcessSP &process_sp) 53*802dc402STodd Fiala { 54*802dc402STodd Fiala m_opaque_wp = process_sp; 55*802dc402STodd Fiala } 56*802dc402STodd Fiala 57*802dc402STodd Fiala void 58*802dc402STodd Fiala SBUnixSignals::Clear () 59*802dc402STodd Fiala { 60*802dc402STodd Fiala m_opaque_wp.reset(); 61*802dc402STodd Fiala } 62*802dc402STodd Fiala 63*802dc402STodd Fiala bool 64*802dc402STodd Fiala SBUnixSignals::IsValid() const 65*802dc402STodd Fiala { 66*802dc402STodd Fiala return (bool) GetSP(); 67*802dc402STodd Fiala } 68*802dc402STodd Fiala 69*802dc402STodd Fiala const char * 70*802dc402STodd Fiala SBUnixSignals::GetSignalAsCString (int32_t signo) const 71*802dc402STodd Fiala { 72*802dc402STodd Fiala ProcessSP process_sp(GetSP()); 73*802dc402STodd Fiala if (process_sp) return process_sp->GetUnixSignals().GetSignalAsCString(signo); 74*802dc402STodd Fiala return NULL; 75*802dc402STodd Fiala } 76*802dc402STodd Fiala 77*802dc402STodd Fiala int32_t 78*802dc402STodd Fiala SBUnixSignals::GetSignalNumberFromName (const char *name) const 79*802dc402STodd Fiala { 80*802dc402STodd Fiala ProcessSP process_sp(GetSP()); 81*802dc402STodd Fiala if (process_sp) return process_sp->GetUnixSignals().GetSignalNumberFromName(name); 82*802dc402STodd Fiala return -1; 83*802dc402STodd Fiala } 84*802dc402STodd Fiala 85*802dc402STodd Fiala bool 86*802dc402STodd Fiala SBUnixSignals::GetShouldSuppress (int32_t signo) const 87*802dc402STodd Fiala { 88*802dc402STodd Fiala ProcessSP process_sp(GetSP()); 89*802dc402STodd Fiala if (process_sp) return process_sp->GetUnixSignals().GetShouldSuppress(signo); 90*802dc402STodd Fiala return false; 91*802dc402STodd Fiala } 92*802dc402STodd Fiala 93*802dc402STodd Fiala bool 94*802dc402STodd Fiala SBUnixSignals::SetShouldSuppress (int32_t signo, bool value) 95*802dc402STodd Fiala { 96*802dc402STodd Fiala Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 97*802dc402STodd Fiala ProcessSP process_sp(GetSP()); 98*802dc402STodd Fiala 99*802dc402STodd Fiala if (log) 100*802dc402STodd Fiala { 101*802dc402STodd Fiala log->Printf ("SBUnixSignals(%p)::SetShouldSuppress (signo=%d, value=%d)", 102*802dc402STodd Fiala static_cast<void*>(process_sp.get()), 103*802dc402STodd Fiala signo, 104*802dc402STodd Fiala value); 105*802dc402STodd Fiala } 106*802dc402STodd Fiala 107*802dc402STodd Fiala if (process_sp) return process_sp->GetUnixSignals().SetShouldSuppress(signo, value); 108*802dc402STodd Fiala return false; 109*802dc402STodd Fiala } 110*802dc402STodd Fiala 111*802dc402STodd Fiala bool 112*802dc402STodd Fiala SBUnixSignals::GetShouldStop (int32_t signo) const 113*802dc402STodd Fiala { 114*802dc402STodd Fiala ProcessSP process_sp(GetSP()); 115*802dc402STodd Fiala if (process_sp) return process_sp->GetUnixSignals().GetShouldStop(signo); 116*802dc402STodd Fiala return false; 117*802dc402STodd Fiala } 118*802dc402STodd Fiala 119*802dc402STodd Fiala bool 120*802dc402STodd Fiala SBUnixSignals::SetShouldStop (int32_t signo, bool value) 121*802dc402STodd Fiala { 122*802dc402STodd Fiala Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 123*802dc402STodd Fiala ProcessSP process_sp(GetSP()); 124*802dc402STodd Fiala 125*802dc402STodd Fiala if (log) 126*802dc402STodd Fiala { 127*802dc402STodd Fiala log->Printf ("SBUnixSignals(%p)::SetShouldStop (signo=%d, value=%d)", 128*802dc402STodd Fiala static_cast<void*>(process_sp.get()), 129*802dc402STodd Fiala signo, 130*802dc402STodd Fiala value); 131*802dc402STodd Fiala } 132*802dc402STodd Fiala 133*802dc402STodd Fiala if (process_sp) return process_sp->GetUnixSignals().SetShouldStop(signo, value); 134*802dc402STodd Fiala return false; 135*802dc402STodd Fiala } 136*802dc402STodd Fiala 137*802dc402STodd Fiala bool 138*802dc402STodd Fiala SBUnixSignals::GetShouldNotify (int32_t signo) const 139*802dc402STodd Fiala { 140*802dc402STodd Fiala ProcessSP process_sp(GetSP()); 141*802dc402STodd Fiala if (process_sp) return process_sp->GetUnixSignals().GetShouldNotify(signo); 142*802dc402STodd Fiala return false; 143*802dc402STodd Fiala } 144*802dc402STodd Fiala 145*802dc402STodd Fiala bool 146*802dc402STodd Fiala SBUnixSignals::SetShouldNotify (int32_t signo, bool value) 147*802dc402STodd Fiala { 148*802dc402STodd Fiala Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 149*802dc402STodd Fiala ProcessSP process_sp(GetSP()); 150*802dc402STodd Fiala 151*802dc402STodd Fiala if (log) 152*802dc402STodd Fiala { 153*802dc402STodd Fiala log->Printf ("SBUnixSignals(%p)::SetShouldNotify (signo=%d, value=%d)", 154*802dc402STodd Fiala static_cast<void*>(process_sp.get()), 155*802dc402STodd Fiala signo, 156*802dc402STodd Fiala value); 157*802dc402STodd Fiala } 158*802dc402STodd Fiala 159*802dc402STodd Fiala if (process_sp) return process_sp->GetUnixSignals().SetShouldNotify(signo, value); 160*802dc402STodd Fiala return false; 161*802dc402STodd Fiala } 162*802dc402STodd Fiala 163*802dc402STodd Fiala int32_t 164*802dc402STodd Fiala SBUnixSignals::GetNumSignals () const 165*802dc402STodd Fiala { 166*802dc402STodd Fiala if (auto process_sp = GetSP()) 167*802dc402STodd Fiala { 168*802dc402STodd Fiala // only valid while we hold process_sp 169*802dc402STodd Fiala UnixSignals *unix_signals_ptr = &process_sp->GetUnixSignals(); 170*802dc402STodd Fiala int32_t num_signals = 0; 171*802dc402STodd Fiala for (int32_t signo = unix_signals_ptr->GetFirstSignalNumber(); 172*802dc402STodd Fiala signo != LLDB_INVALID_SIGNAL_NUMBER; 173*802dc402STodd Fiala signo = unix_signals_ptr->GetNextSignalNumber(signo)) 174*802dc402STodd Fiala { 175*802dc402STodd Fiala num_signals++; 176*802dc402STodd Fiala } 177*802dc402STodd Fiala return num_signals; 178*802dc402STodd Fiala } 179*802dc402STodd Fiala return LLDB_INVALID_SIGNAL_NUMBER; 180*802dc402STodd Fiala } 181*802dc402STodd Fiala 182*802dc402STodd Fiala int32_t 183*802dc402STodd Fiala SBUnixSignals::GetSignalAtIndex (int32_t index) const 184*802dc402STodd Fiala { 185*802dc402STodd Fiala if (auto process_sp = GetSP()) 186*802dc402STodd Fiala { 187*802dc402STodd Fiala // only valid while we hold process_sp 188*802dc402STodd Fiala UnixSignals *unix_signals_ptr = &process_sp->GetUnixSignals(); 189*802dc402STodd Fiala int32_t idx = 0; 190*802dc402STodd Fiala for (int32_t signo = unix_signals_ptr->GetFirstSignalNumber(); 191*802dc402STodd Fiala signo != LLDB_INVALID_SIGNAL_NUMBER; 192*802dc402STodd Fiala signo = unix_signals_ptr->GetNextSignalNumber(signo)) 193*802dc402STodd Fiala { 194*802dc402STodd Fiala if (index == idx) return signo; 195*802dc402STodd Fiala idx++; 196*802dc402STodd Fiala } 197*802dc402STodd Fiala } 198*802dc402STodd Fiala return LLDB_INVALID_SIGNAL_NUMBER; 199*802dc402STodd Fiala } 200