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