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