1 //===-- SBUnixSignals.cpp -------------------------------------------*- C++
2 //-*-===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "SBReproducerPrivate.h"
11 #include "lldb/Target/Platform.h"
12 #include "lldb/Target/Process.h"
13 #include "lldb/Target/UnixSignals.h"
14 #include "lldb/Utility/Log.h"
15 #include "lldb/lldb-defines.h"
16 
17 #include "lldb/API/SBUnixSignals.h"
18 
19 using namespace lldb;
20 using namespace lldb_private;
21 
22 SBUnixSignals::SBUnixSignals() {
23   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBUnixSignals);
24 }
25 
26 SBUnixSignals::SBUnixSignals(const SBUnixSignals &rhs)
27     : m_opaque_wp(rhs.m_opaque_wp) {
28   LLDB_RECORD_CONSTRUCTOR(SBUnixSignals, (const lldb::SBUnixSignals &), rhs);
29 }
30 
31 SBUnixSignals::SBUnixSignals(ProcessSP &process_sp)
32     : m_opaque_wp(process_sp ? process_sp->GetUnixSignals() : nullptr) {}
33 
34 SBUnixSignals::SBUnixSignals(PlatformSP &platform_sp)
35     : m_opaque_wp(platform_sp ? platform_sp->GetUnixSignals() : nullptr) {}
36 
37 const SBUnixSignals &SBUnixSignals::operator=(const SBUnixSignals &rhs) {
38   LLDB_RECORD_METHOD(const lldb::SBUnixSignals &,
39                      SBUnixSignals, operator=,(const lldb::SBUnixSignals &),
40                      rhs);
41 
42   if (this != &rhs)
43     m_opaque_wp = rhs.m_opaque_wp;
44   return *this;
45 }
46 
47 SBUnixSignals::~SBUnixSignals() {}
48 
49 UnixSignalsSP SBUnixSignals::GetSP() const { return m_opaque_wp.lock(); }
50 
51 void SBUnixSignals::SetSP(const UnixSignalsSP &signals_sp) {
52   m_opaque_wp = signals_sp;
53 }
54 
55 void SBUnixSignals::Clear() {
56   LLDB_RECORD_METHOD_NO_ARGS(void, SBUnixSignals, Clear);
57 
58   m_opaque_wp.reset();
59 }
60 
61 bool SBUnixSignals::IsValid() const {
62   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBUnixSignals, IsValid);
63 
64   return static_cast<bool>(GetSP());
65 }
66 
67 const char *SBUnixSignals::GetSignalAsCString(int32_t signo) const {
68   LLDB_RECORD_METHOD_CONST(const char *, SBUnixSignals, GetSignalAsCString,
69                            (int32_t), signo);
70 
71   if (auto signals_sp = GetSP())
72     return signals_sp->GetSignalAsCString(signo);
73 
74   return nullptr;
75 }
76 
77 int32_t SBUnixSignals::GetSignalNumberFromName(const char *name) const {
78   LLDB_RECORD_METHOD_CONST(int32_t, SBUnixSignals, GetSignalNumberFromName,
79                            (const char *), name);
80 
81   if (auto signals_sp = GetSP())
82     return signals_sp->GetSignalNumberFromName(name);
83 
84   return LLDB_INVALID_SIGNAL_NUMBER;
85 }
86 
87 bool SBUnixSignals::GetShouldSuppress(int32_t signo) const {
88   LLDB_RECORD_METHOD_CONST(bool, SBUnixSignals, GetShouldSuppress, (int32_t),
89                            signo);
90 
91   if (auto signals_sp = GetSP())
92     return signals_sp->GetShouldSuppress(signo);
93 
94   return false;
95 }
96 
97 bool SBUnixSignals::SetShouldSuppress(int32_t signo, bool value) {
98   LLDB_RECORD_METHOD(bool, SBUnixSignals, SetShouldSuppress, (int32_t, bool),
99                      signo, value);
100 
101   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
102   auto signals_sp = GetSP();
103 
104   if (log) {
105     log->Printf("SBUnixSignals(%p)::SetShouldSuppress (signo=%d, value=%d)",
106                 static_cast<void *>(signals_sp.get()), signo, value);
107   }
108 
109   if (signals_sp)
110     return signals_sp->SetShouldSuppress(signo, value);
111 
112   return false;
113 }
114 
115 bool SBUnixSignals::GetShouldStop(int32_t signo) const {
116   LLDB_RECORD_METHOD_CONST(bool, SBUnixSignals, GetShouldStop, (int32_t),
117                            signo);
118 
119   if (auto signals_sp = GetSP())
120     return signals_sp->GetShouldStop(signo);
121 
122   return false;
123 }
124 
125 bool SBUnixSignals::SetShouldStop(int32_t signo, bool value) {
126   LLDB_RECORD_METHOD(bool, SBUnixSignals, SetShouldStop, (int32_t, bool), signo,
127                      value);
128 
129   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
130   auto signals_sp = GetSP();
131 
132   if (log) {
133     log->Printf("SBUnixSignals(%p)::SetShouldStop (signo=%d, value=%d)",
134                 static_cast<void *>(signals_sp.get()), signo, value);
135   }
136 
137   if (signals_sp)
138     return signals_sp->SetShouldStop(signo, value);
139 
140   return false;
141 }
142 
143 bool SBUnixSignals::GetShouldNotify(int32_t signo) const {
144   LLDB_RECORD_METHOD_CONST(bool, SBUnixSignals, GetShouldNotify, (int32_t),
145                            signo);
146 
147   if (auto signals_sp = GetSP())
148     return signals_sp->GetShouldNotify(signo);
149 
150   return false;
151 }
152 
153 bool SBUnixSignals::SetShouldNotify(int32_t signo, bool value) {
154   LLDB_RECORD_METHOD(bool, SBUnixSignals, SetShouldNotify, (int32_t, bool),
155                      signo, value);
156 
157   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
158   auto signals_sp = GetSP();
159 
160   if (log) {
161     log->Printf("SBUnixSignals(%p)::SetShouldNotify (signo=%d, value=%d)",
162                 static_cast<void *>(signals_sp.get()), signo, value);
163   }
164 
165   if (signals_sp)
166     return signals_sp->SetShouldNotify(signo, value);
167 
168   return false;
169 }
170 
171 int32_t SBUnixSignals::GetNumSignals() const {
172   LLDB_RECORD_METHOD_CONST_NO_ARGS(int32_t, SBUnixSignals, GetNumSignals);
173 
174   if (auto signals_sp = GetSP())
175     return signals_sp->GetNumSignals();
176 
177   return -1;
178 }
179 
180 int32_t SBUnixSignals::GetSignalAtIndex(int32_t index) const {
181   LLDB_RECORD_METHOD_CONST(int32_t, SBUnixSignals, GetSignalAtIndex, (int32_t),
182                            index);
183 
184   if (auto signals_sp = GetSP())
185     return signals_sp->GetSignalAtIndex(index);
186 
187   return LLDB_INVALID_SIGNAL_NUMBER;
188 }
189