blob: 2e67b4c24e86e1f13d63b274a09bb70b7af2cf3d [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBListener.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
Daniel Malead891f9b2012-12-05 00:20:57 +000010#include "lldb/lldb-python.h"
11
Greg Clayton49ce6822010-10-31 03:01:06 +000012#include "lldb/API/SBListener.h"
13#include "lldb/API/SBBroadcaster.h"
Jim Ingham5a15e692012-02-16 06:50:00 +000014#include "lldb/API/SBDebugger.h"
Greg Clayton49ce6822010-10-31 03:01:06 +000015#include "lldb/API/SBEvent.h"
16#include "lldb/API/SBStream.h"
17#include "lldb/Core/Broadcaster.h"
Jim Ingham5a15e692012-02-16 06:50:00 +000018#include "lldb/Core/Debugger.h"
Chris Lattner24943d22010-06-08 16:52:24 +000019#include "lldb/Core/Listener.h"
Caroline Tice7826c882010-10-26 03:11:13 +000020#include "lldb/Core/Log.h"
Greg Clayton49ce6822010-10-31 03:01:06 +000021#include "lldb/Core/StreamString.h"
Chris Lattner24943d22010-06-08 16:52:24 +000022#include "lldb/Host/TimeValue.h"
23
Chris Lattner24943d22010-06-08 16:52:24 +000024
25using namespace lldb;
26using namespace lldb_private;
27
28
Greg Clayton63094e02010-06-23 01:19:29 +000029SBListener::SBListener () :
Greg Clayton538eb822010-11-05 23:17:00 +000030 m_opaque_sp (),
31 m_opaque_ptr (NULL)
Chris Lattner24943d22010-06-08 16:52:24 +000032{
33}
34
35SBListener::SBListener (const char *name) :
Greg Clayton538eb822010-11-05 23:17:00 +000036 m_opaque_sp (new Listener (name)),
37 m_opaque_ptr (NULL)
Chris Lattner24943d22010-06-08 16:52:24 +000038{
Greg Clayton538eb822010-11-05 23:17:00 +000039 m_opaque_ptr = m_opaque_sp.get();
40
Greg Clayton952e9dc2013-03-27 23:08:40 +000041 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000042
43 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +000044 log->Printf ("SBListener::SBListener (name=\"%s\") => SBListener(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +000045 name, m_opaque_ptr);
Chris Lattner24943d22010-06-08 16:52:24 +000046}
47
Greg Clayton538eb822010-11-05 23:17:00 +000048
49SBListener::SBListener (const SBListener &rhs) :
50 m_opaque_sp (rhs.m_opaque_sp),
51 m_opaque_ptr (rhs.m_opaque_ptr)
52{
53}
54
55const lldb::SBListener &
56SBListener::operator = (const lldb::SBListener &rhs)
57{
58 if (this != &rhs)
59 {
60 m_opaque_sp = rhs.m_opaque_sp;
61 m_opaque_ptr = rhs.m_opaque_ptr;
62 }
63 return *this;
64}
65
Chris Lattner24943d22010-06-08 16:52:24 +000066SBListener::SBListener (Listener &listener) :
Greg Clayton538eb822010-11-05 23:17:00 +000067 m_opaque_sp (),
68 m_opaque_ptr (&listener)
Chris Lattner24943d22010-06-08 16:52:24 +000069{
70}
71
72SBListener::~SBListener ()
73{
Chris Lattner24943d22010-06-08 16:52:24 +000074}
75
76bool
77SBListener::IsValid() const
78{
Greg Clayton63094e02010-06-23 01:19:29 +000079 return m_opaque_ptr != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000080}
81
82void
83SBListener::AddEvent (const SBEvent &event)
84{
Greg Clayton63094e02010-06-23 01:19:29 +000085 EventSP &event_sp = event.GetSP ();
Chris Lattner24943d22010-06-08 16:52:24 +000086 if (event_sp)
Greg Clayton63094e02010-06-23 01:19:29 +000087 m_opaque_ptr->AddEvent (event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +000088}
89
90void
91SBListener::Clear ()
92{
Greg Clayton63094e02010-06-23 01:19:29 +000093 if (m_opaque_ptr)
94 m_opaque_ptr->Clear ();
Chris Lattner24943d22010-06-08 16:52:24 +000095}
96
Jim Ingham4c87ebf2012-05-08 20:05:08 +000097uint32_t
98SBListener::StartListeningForEventClass (SBDebugger &debugger,
99 const char *broadcaster_class,
100 uint32_t event_mask)
101{
102 if (m_opaque_ptr)
Jim Ingham5a15e692012-02-16 06:50:00 +0000103 {
Jim Ingham4c87ebf2012-05-08 20:05:08 +0000104 Debugger *lldb_debugger = debugger.get();
105 if (!lldb_debugger)
Jim Ingham5a15e692012-02-16 06:50:00 +0000106 return 0;
Jim Ingham4c87ebf2012-05-08 20:05:08 +0000107 BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
108 return m_opaque_ptr->StartListeningForEventSpec (*lldb_debugger, event_spec);
Jim Ingham5a15e692012-02-16 06:50:00 +0000109 }
Jim Ingham4c87ebf2012-05-08 20:05:08 +0000110 else
111 return 0;
112}
113
114bool
115SBListener::StopListeningForEventClass (SBDebugger &debugger,
116 const char *broadcaster_class,
117 uint32_t event_mask)
118{
119 if (m_opaque_ptr)
Jim Ingham5a15e692012-02-16 06:50:00 +0000120 {
Jim Ingham4c87ebf2012-05-08 20:05:08 +0000121 Debugger *lldb_debugger = debugger.get();
122 if (!lldb_debugger)
Jim Ingham5a15e692012-02-16 06:50:00 +0000123 return false;
Jim Ingham4c87ebf2012-05-08 20:05:08 +0000124 BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask);
125 return m_opaque_ptr->StopListeningForEventSpec (*lldb_debugger, event_spec);
Jim Ingham5a15e692012-02-16 06:50:00 +0000126 }
Jim Ingham4c87ebf2012-05-08 20:05:08 +0000127 else
128 return false;
129}
Jim Ingham5a15e692012-02-16 06:50:00 +0000130
Chris Lattner24943d22010-06-08 16:52:24 +0000131uint32_t
132SBListener::StartListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
133{
Greg Clayton49ce6822010-10-31 03:01:06 +0000134 uint32_t acquired_event_mask = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000135 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000136 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000137 acquired_event_mask = m_opaque_ptr->StartListeningForEvents (broadcaster.get(), event_mask);
Chris Lattner24943d22010-06-08 16:52:24 +0000138 }
Caroline Tice7826c882010-10-26 03:11:13 +0000139
Jason Molenda08f60c82013-05-04 00:39:52 +0000140 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000141 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000142 {
143 StreamString sstr_requested;
144 StreamString sstr_acquired;
145
146 Broadcaster *lldb_broadcaster = broadcaster.get();
147 if (lldb_broadcaster)
148 {
149 const bool got_requested_names = lldb_broadcaster->GetEventNames (sstr_requested, event_mask, false);
150 const bool got_acquired_names = lldb_broadcaster->GetEventNames (sstr_acquired, acquired_event_mask, false);
151 log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p): %s, event_mask=0x%8.8x%s%s%s) => 0x%8.8x%s%s%s",
152 m_opaque_ptr,
153 lldb_broadcaster,
154 lldb_broadcaster->GetBroadcasterName().GetCString(),
155 event_mask,
156 got_requested_names ? " (" : "",
157 sstr_requested.GetData(),
158 got_requested_names ? ")" : "",
159 acquired_event_mask,
160 got_acquired_names ? " (" : "",
161 sstr_acquired.GetData(),
162 got_acquired_names ? ")" : "");
163 }
164 else
165 {
166 log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p), event_mask=0x%8.8x) => 0x%8.8x",
167 m_opaque_ptr,
168 lldb_broadcaster,
169 event_mask,
170 acquired_event_mask);
171
172 }
173 }
Caroline Tice7826c882010-10-26 03:11:13 +0000174
Greg Clayton49ce6822010-10-31 03:01:06 +0000175 return acquired_event_mask;
Chris Lattner24943d22010-06-08 16:52:24 +0000176}
177
178bool
179SBListener::StopListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
180{
Greg Clayton63094e02010-06-23 01:19:29 +0000181 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000182 {
Greg Clayton63094e02010-06-23 01:19:29 +0000183 return m_opaque_ptr->StopListeningForEvents (broadcaster.get(), event_mask);
Chris Lattner24943d22010-06-08 16:52:24 +0000184 }
185 return false;
186}
187
188bool
Greg Clayton49ce6822010-10-31 03:01:06 +0000189SBListener::WaitForEvent (uint32_t timeout_secs, SBEvent &event)
Chris Lattner24943d22010-06-08 16:52:24 +0000190{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000191 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000192 if (log)
193 {
194 if (timeout_secs == UINT32_MAX)
195 {
196 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p))...",
197 m_opaque_ptr, event.get());
198 }
199 else
200 {
201 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p))...",
202 m_opaque_ptr, timeout_secs, event.get());
203 }
204 }
205 bool success = false;
Caroline Tice7826c882010-10-26 03:11:13 +0000206
Greg Clayton63094e02010-06-23 01:19:29 +0000207 if (m_opaque_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +0000208 {
209 TimeValue time_value;
Greg Clayton49ce6822010-10-31 03:01:06 +0000210 if (timeout_secs != UINT32_MAX)
Chris Lattner24943d22010-06-08 16:52:24 +0000211 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000212 assert (timeout_secs != 0); // Take this out after all calls with timeout set to zero have been removed....
Chris Lattner24943d22010-06-08 16:52:24 +0000213 time_value = TimeValue::Now();
Greg Clayton49ce6822010-10-31 03:01:06 +0000214 time_value.OffsetWithSeconds (timeout_secs);
Chris Lattner24943d22010-06-08 16:52:24 +0000215 }
216 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000217 if (m_opaque_ptr->WaitForEvent (time_value.IsValid() ? &time_value : NULL, event_sp))
Chris Lattner24943d22010-06-08 16:52:24 +0000218 {
Greg Clayton63094e02010-06-23 01:19:29 +0000219 event.reset (event_sp);
Greg Clayton49ce6822010-10-31 03:01:06 +0000220 success = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000221 }
222 }
Caroline Tice7826c882010-10-26 03:11:13 +0000223
224 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000225 {
226 if (timeout_secs == UINT32_MAX)
227 {
228 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p)) => %i",
229 m_opaque_ptr, event.get(), success);
230 }
231 else
232 {
233 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p)) => %i",
234 m_opaque_ptr, timeout_secs, event.get(), success);
235 }
236 }
237 if (!success)
238 event.reset (NULL);
239 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000240}
241
242bool
243SBListener::WaitForEventForBroadcaster
244(
245 uint32_t num_seconds,
246 const SBBroadcaster &broadcaster,
247 SBEvent &event
248)
249{
Greg Clayton63094e02010-06-23 01:19:29 +0000250 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000251 {
252 TimeValue time_value;
253 if (num_seconds != UINT32_MAX)
254 {
255 time_value = TimeValue::Now();
256 time_value.OffsetWithSeconds (num_seconds);
257 }
258 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000259 if (m_opaque_ptr->WaitForEventForBroadcaster (time_value.IsValid() ? &time_value : NULL,
260 broadcaster.get(),
Chris Lattner24943d22010-06-08 16:52:24 +0000261 event_sp))
262 {
Greg Clayton63094e02010-06-23 01:19:29 +0000263 event.reset (event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000264 return true;
265 }
266
267 }
Greg Clayton63094e02010-06-23 01:19:29 +0000268 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000269 return false;
270}
271
272bool
273SBListener::WaitForEventForBroadcasterWithType
274(
275 uint32_t num_seconds,
276 const SBBroadcaster &broadcaster,
277 uint32_t event_type_mask,
278 SBEvent &event
279)
280{
Greg Clayton63094e02010-06-23 01:19:29 +0000281 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000282 {
283 TimeValue time_value;
284 if (num_seconds != UINT32_MAX)
285 {
286 time_value = TimeValue::Now();
287 time_value.OffsetWithSeconds (num_seconds);
288 }
289 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000290 if (m_opaque_ptr->WaitForEventForBroadcasterWithType (time_value.IsValid() ? &time_value : NULL,
291 broadcaster.get(),
292 event_type_mask,
293 event_sp))
Chris Lattner24943d22010-06-08 16:52:24 +0000294 {
Greg Clayton63094e02010-06-23 01:19:29 +0000295 event.reset (event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000296 return true;
297 }
298 }
Greg Clayton63094e02010-06-23 01:19:29 +0000299 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000300 return false;
301}
302
303bool
304SBListener::PeekAtNextEvent (SBEvent &event)
305{
Greg Clayton63094e02010-06-23 01:19:29 +0000306 if (m_opaque_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +0000307 {
Greg Clayton63094e02010-06-23 01:19:29 +0000308 event.reset (m_opaque_ptr->PeekAtNextEvent ());
Chris Lattner24943d22010-06-08 16:52:24 +0000309 return event.IsValid();
310 }
Greg Clayton63094e02010-06-23 01:19:29 +0000311 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000312 return false;
313}
314
315bool
316SBListener::PeekAtNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
317{
Greg Clayton63094e02010-06-23 01:19:29 +0000318 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000319 {
Greg Clayton63094e02010-06-23 01:19:29 +0000320 event.reset (m_opaque_ptr->PeekAtNextEventForBroadcaster (broadcaster.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000321 return event.IsValid();
322 }
Greg Clayton63094e02010-06-23 01:19:29 +0000323 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000324 return false;
325}
326
327bool
328SBListener::PeekAtNextEventForBroadcasterWithType (const SBBroadcaster &broadcaster, uint32_t event_type_mask,
329 SBEvent &event)
330{
Greg Clayton63094e02010-06-23 01:19:29 +0000331 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000332 {
Greg Clayton63094e02010-06-23 01:19:29 +0000333 event.reset(m_opaque_ptr->PeekAtNextEventForBroadcasterWithType (broadcaster.get(), event_type_mask));
Chris Lattner24943d22010-06-08 16:52:24 +0000334 return event.IsValid();
335 }
Greg Clayton63094e02010-06-23 01:19:29 +0000336 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000337 return false;
338}
339
340bool
341SBListener::GetNextEvent (SBEvent &event)
342{
Greg Clayton63094e02010-06-23 01:19:29 +0000343 if (m_opaque_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +0000344 {
345 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000346 if (m_opaque_ptr->GetNextEvent (event_sp))
Chris Lattner24943d22010-06-08 16:52:24 +0000347 {
Greg Clayton63094e02010-06-23 01:19:29 +0000348 event.reset (event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000349 return true;
350 }
351 }
Greg Clayton63094e02010-06-23 01:19:29 +0000352 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000353 return false;
354}
355
356bool
357SBListener::GetNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
358{
Greg Clayton63094e02010-06-23 01:19:29 +0000359 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000360 {
361 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000362 if (m_opaque_ptr->GetNextEventForBroadcaster (broadcaster.get(), event_sp))
Chris Lattner24943d22010-06-08 16:52:24 +0000363 {
Greg Clayton63094e02010-06-23 01:19:29 +0000364 event.reset (event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000365 return true;
366 }
367 }
Greg Clayton63094e02010-06-23 01:19:29 +0000368 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000369 return false;
370}
371
372bool
373SBListener::GetNextEventForBroadcasterWithType
374(
375 const SBBroadcaster &broadcaster,
376 uint32_t event_type_mask,
377 SBEvent &event
378)
379{
Greg Clayton63094e02010-06-23 01:19:29 +0000380 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000381 {
382 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000383 if (m_opaque_ptr->GetNextEventForBroadcasterWithType (broadcaster.get(),
384 event_type_mask,
385 event_sp))
Chris Lattner24943d22010-06-08 16:52:24 +0000386 {
Greg Clayton63094e02010-06-23 01:19:29 +0000387 event.reset (event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000388 return true;
389 }
390 }
Greg Clayton63094e02010-06-23 01:19:29 +0000391 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000392 return false;
393}
394
395bool
396SBListener::HandleBroadcastEvent (const SBEvent &event)
397{
Greg Clayton63094e02010-06-23 01:19:29 +0000398 if (m_opaque_ptr)
399 return m_opaque_ptr->HandleBroadcastEvent (event.GetSP());
Chris Lattner24943d22010-06-08 16:52:24 +0000400 return false;
401}
402
Greg Clayton63094e02010-06-23 01:19:29 +0000403Listener *
Chris Lattner24943d22010-06-08 16:52:24 +0000404SBListener::operator->() const
405{
Greg Clayton63094e02010-06-23 01:19:29 +0000406 return m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000407}
408
Greg Clayton63094e02010-06-23 01:19:29 +0000409Listener *
Chris Lattner24943d22010-06-08 16:52:24 +0000410SBListener::get() const
411{
Greg Clayton63094e02010-06-23 01:19:29 +0000412 return m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000413}
414
Greg Clayton63094e02010-06-23 01:19:29 +0000415void
Greg Clayton538eb822010-11-05 23:17:00 +0000416SBListener::reset(Listener *listener, bool owns)
Greg Clayton63094e02010-06-23 01:19:29 +0000417{
Greg Clayton538eb822010-11-05 23:17:00 +0000418 if (owns)
419 m_opaque_sp.reset (listener);
420 else
421 m_opaque_sp.reset ();
Greg Clayton63094e02010-06-23 01:19:29 +0000422 m_opaque_ptr = listener;
423}
424
Greg Clayton271a5db2011-02-03 21:28:34 +0000425Listener &
426SBListener::ref() const
427{
428 return *m_opaque_ptr;
429}
Greg Clayton63094e02010-06-23 01:19:29 +0000430
431Listener &
Chris Lattner24943d22010-06-08 16:52:24 +0000432SBListener::operator *()
433{
Greg Clayton63094e02010-06-23 01:19:29 +0000434 return *m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000435}
436
Greg Clayton63094e02010-06-23 01:19:29 +0000437const Listener &
Chris Lattner24943d22010-06-08 16:52:24 +0000438SBListener::operator *() const
439{
Greg Clayton63094e02010-06-23 01:19:29 +0000440 return *m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000441}
442
443