blob: 5bbc0480b28a1f7af9489d568bffddf128d63642 [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 Claytone005f2c2010-11-06 01:53:30 +000041 LogSP 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 Claytone005f2c2010-11-06 01:53:30 +0000134 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000135
Greg Clayton49ce6822010-10-31 03:01:06 +0000136 uint32_t acquired_event_mask = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000137 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000138 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000139 acquired_event_mask = m_opaque_ptr->StartListeningForEvents (broadcaster.get(), event_mask);
Chris Lattner24943d22010-06-08 16:52:24 +0000140 }
Caroline Tice7826c882010-10-26 03:11:13 +0000141
Caroline Tice926060e2010-10-29 21:48:37 +0000142 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000143 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000144 {
145 StreamString sstr_requested;
146 StreamString sstr_acquired;
147
148 Broadcaster *lldb_broadcaster = broadcaster.get();
149 if (lldb_broadcaster)
150 {
151 const bool got_requested_names = lldb_broadcaster->GetEventNames (sstr_requested, event_mask, false);
152 const bool got_acquired_names = lldb_broadcaster->GetEventNames (sstr_acquired, acquired_event_mask, false);
153 log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p): %s, event_mask=0x%8.8x%s%s%s) => 0x%8.8x%s%s%s",
154 m_opaque_ptr,
155 lldb_broadcaster,
156 lldb_broadcaster->GetBroadcasterName().GetCString(),
157 event_mask,
158 got_requested_names ? " (" : "",
159 sstr_requested.GetData(),
160 got_requested_names ? ")" : "",
161 acquired_event_mask,
162 got_acquired_names ? " (" : "",
163 sstr_acquired.GetData(),
164 got_acquired_names ? ")" : "");
165 }
166 else
167 {
168 log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p), event_mask=0x%8.8x) => 0x%8.8x",
169 m_opaque_ptr,
170 lldb_broadcaster,
171 event_mask,
172 acquired_event_mask);
173
174 }
175 }
Caroline Tice7826c882010-10-26 03:11:13 +0000176
Greg Clayton49ce6822010-10-31 03:01:06 +0000177 return acquired_event_mask;
Chris Lattner24943d22010-06-08 16:52:24 +0000178}
179
180bool
181SBListener::StopListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask)
182{
Greg Clayton63094e02010-06-23 01:19:29 +0000183 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000184 {
Greg Clayton63094e02010-06-23 01:19:29 +0000185 return m_opaque_ptr->StopListeningForEvents (broadcaster.get(), event_mask);
Chris Lattner24943d22010-06-08 16:52:24 +0000186 }
187 return false;
188}
189
190bool
Greg Clayton49ce6822010-10-31 03:01:06 +0000191SBListener::WaitForEvent (uint32_t timeout_secs, SBEvent &event)
Chris Lattner24943d22010-06-08 16:52:24 +0000192{
Greg Claytone005f2c2010-11-06 01:53:30 +0000193 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +0000194 if (log)
195 {
196 if (timeout_secs == UINT32_MAX)
197 {
198 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p))...",
199 m_opaque_ptr, event.get());
200 }
201 else
202 {
203 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p))...",
204 m_opaque_ptr, timeout_secs, event.get());
205 }
206 }
207 bool success = false;
Caroline Tice7826c882010-10-26 03:11:13 +0000208
Greg Clayton63094e02010-06-23 01:19:29 +0000209 if (m_opaque_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +0000210 {
211 TimeValue time_value;
Greg Clayton49ce6822010-10-31 03:01:06 +0000212 if (timeout_secs != UINT32_MAX)
Chris Lattner24943d22010-06-08 16:52:24 +0000213 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000214 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 +0000215 time_value = TimeValue::Now();
Greg Clayton49ce6822010-10-31 03:01:06 +0000216 time_value.OffsetWithSeconds (timeout_secs);
Chris Lattner24943d22010-06-08 16:52:24 +0000217 }
218 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000219 if (m_opaque_ptr->WaitForEvent (time_value.IsValid() ? &time_value : NULL, event_sp))
Chris Lattner24943d22010-06-08 16:52:24 +0000220 {
Greg Clayton63094e02010-06-23 01:19:29 +0000221 event.reset (event_sp);
Greg Clayton49ce6822010-10-31 03:01:06 +0000222 success = true;
Chris Lattner24943d22010-06-08 16:52:24 +0000223 }
224 }
Caroline Tice7826c882010-10-26 03:11:13 +0000225
226 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000227 {
228 if (timeout_secs == UINT32_MAX)
229 {
230 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p)) => %i",
231 m_opaque_ptr, event.get(), success);
232 }
233 else
234 {
235 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p)) => %i",
236 m_opaque_ptr, timeout_secs, event.get(), success);
237 }
238 }
239 if (!success)
240 event.reset (NULL);
241 return success;
Chris Lattner24943d22010-06-08 16:52:24 +0000242}
243
244bool
245SBListener::WaitForEventForBroadcaster
246(
247 uint32_t num_seconds,
248 const SBBroadcaster &broadcaster,
249 SBEvent &event
250)
251{
Greg Clayton63094e02010-06-23 01:19:29 +0000252 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000253 {
254 TimeValue time_value;
255 if (num_seconds != UINT32_MAX)
256 {
257 time_value = TimeValue::Now();
258 time_value.OffsetWithSeconds (num_seconds);
259 }
260 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000261 if (m_opaque_ptr->WaitForEventForBroadcaster (time_value.IsValid() ? &time_value : NULL,
262 broadcaster.get(),
Chris Lattner24943d22010-06-08 16:52:24 +0000263 event_sp))
264 {
Greg Clayton63094e02010-06-23 01:19:29 +0000265 event.reset (event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000266 return true;
267 }
268
269 }
Greg Clayton63094e02010-06-23 01:19:29 +0000270 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000271 return false;
272}
273
274bool
275SBListener::WaitForEventForBroadcasterWithType
276(
277 uint32_t num_seconds,
278 const SBBroadcaster &broadcaster,
279 uint32_t event_type_mask,
280 SBEvent &event
281)
282{
Greg Clayton63094e02010-06-23 01:19:29 +0000283 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000284 {
285 TimeValue time_value;
286 if (num_seconds != UINT32_MAX)
287 {
288 time_value = TimeValue::Now();
289 time_value.OffsetWithSeconds (num_seconds);
290 }
291 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000292 if (m_opaque_ptr->WaitForEventForBroadcasterWithType (time_value.IsValid() ? &time_value : NULL,
293 broadcaster.get(),
294 event_type_mask,
295 event_sp))
Chris Lattner24943d22010-06-08 16:52:24 +0000296 {
Greg Clayton63094e02010-06-23 01:19:29 +0000297 event.reset (event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000298 return true;
299 }
300 }
Greg Clayton63094e02010-06-23 01:19:29 +0000301 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000302 return false;
303}
304
305bool
306SBListener::PeekAtNextEvent (SBEvent &event)
307{
Greg Clayton63094e02010-06-23 01:19:29 +0000308 if (m_opaque_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +0000309 {
Greg Clayton63094e02010-06-23 01:19:29 +0000310 event.reset (m_opaque_ptr->PeekAtNextEvent ());
Chris Lattner24943d22010-06-08 16:52:24 +0000311 return event.IsValid();
312 }
Greg Clayton63094e02010-06-23 01:19:29 +0000313 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000314 return false;
315}
316
317bool
318SBListener::PeekAtNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
319{
Greg Clayton63094e02010-06-23 01:19:29 +0000320 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000321 {
Greg Clayton63094e02010-06-23 01:19:29 +0000322 event.reset (m_opaque_ptr->PeekAtNextEventForBroadcaster (broadcaster.get()));
Chris Lattner24943d22010-06-08 16:52:24 +0000323 return event.IsValid();
324 }
Greg Clayton63094e02010-06-23 01:19:29 +0000325 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000326 return false;
327}
328
329bool
330SBListener::PeekAtNextEventForBroadcasterWithType (const SBBroadcaster &broadcaster, uint32_t event_type_mask,
331 SBEvent &event)
332{
Greg Clayton63094e02010-06-23 01:19:29 +0000333 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000334 {
Greg Clayton63094e02010-06-23 01:19:29 +0000335 event.reset(m_opaque_ptr->PeekAtNextEventForBroadcasterWithType (broadcaster.get(), event_type_mask));
Chris Lattner24943d22010-06-08 16:52:24 +0000336 return event.IsValid();
337 }
Greg Clayton63094e02010-06-23 01:19:29 +0000338 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000339 return false;
340}
341
342bool
343SBListener::GetNextEvent (SBEvent &event)
344{
Greg Clayton63094e02010-06-23 01:19:29 +0000345 if (m_opaque_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +0000346 {
347 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000348 if (m_opaque_ptr->GetNextEvent (event_sp))
Chris Lattner24943d22010-06-08 16:52:24 +0000349 {
Greg Clayton63094e02010-06-23 01:19:29 +0000350 event.reset (event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000351 return true;
352 }
353 }
Greg Clayton63094e02010-06-23 01:19:29 +0000354 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000355 return false;
356}
357
358bool
359SBListener::GetNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event)
360{
Greg Clayton63094e02010-06-23 01:19:29 +0000361 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000362 {
363 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000364 if (m_opaque_ptr->GetNextEventForBroadcaster (broadcaster.get(), event_sp))
Chris Lattner24943d22010-06-08 16:52:24 +0000365 {
Greg Clayton63094e02010-06-23 01:19:29 +0000366 event.reset (event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000367 return true;
368 }
369 }
Greg Clayton63094e02010-06-23 01:19:29 +0000370 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000371 return false;
372}
373
374bool
375SBListener::GetNextEventForBroadcasterWithType
376(
377 const SBBroadcaster &broadcaster,
378 uint32_t event_type_mask,
379 SBEvent &event
380)
381{
Greg Clayton63094e02010-06-23 01:19:29 +0000382 if (m_opaque_ptr && broadcaster.IsValid())
Chris Lattner24943d22010-06-08 16:52:24 +0000383 {
384 EventSP event_sp;
Greg Clayton63094e02010-06-23 01:19:29 +0000385 if (m_opaque_ptr->GetNextEventForBroadcasterWithType (broadcaster.get(),
386 event_type_mask,
387 event_sp))
Chris Lattner24943d22010-06-08 16:52:24 +0000388 {
Greg Clayton63094e02010-06-23 01:19:29 +0000389 event.reset (event_sp);
Chris Lattner24943d22010-06-08 16:52:24 +0000390 return true;
391 }
392 }
Greg Clayton63094e02010-06-23 01:19:29 +0000393 event.reset (NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000394 return false;
395}
396
397bool
398SBListener::HandleBroadcastEvent (const SBEvent &event)
399{
Greg Clayton63094e02010-06-23 01:19:29 +0000400 if (m_opaque_ptr)
401 return m_opaque_ptr->HandleBroadcastEvent (event.GetSP());
Chris Lattner24943d22010-06-08 16:52:24 +0000402 return false;
403}
404
Greg Clayton63094e02010-06-23 01:19:29 +0000405Listener *
Chris Lattner24943d22010-06-08 16:52:24 +0000406SBListener::operator->() const
407{
Greg Clayton63094e02010-06-23 01:19:29 +0000408 return m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000409}
410
Greg Clayton63094e02010-06-23 01:19:29 +0000411Listener *
Chris Lattner24943d22010-06-08 16:52:24 +0000412SBListener::get() const
413{
Greg Clayton63094e02010-06-23 01:19:29 +0000414 return m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000415}
416
Greg Clayton63094e02010-06-23 01:19:29 +0000417void
Greg Clayton538eb822010-11-05 23:17:00 +0000418SBListener::reset(Listener *listener, bool owns)
Greg Clayton63094e02010-06-23 01:19:29 +0000419{
Greg Clayton538eb822010-11-05 23:17:00 +0000420 if (owns)
421 m_opaque_sp.reset (listener);
422 else
423 m_opaque_sp.reset ();
Greg Clayton63094e02010-06-23 01:19:29 +0000424 m_opaque_ptr = listener;
425}
426
Greg Clayton271a5db2011-02-03 21:28:34 +0000427Listener &
428SBListener::ref() const
429{
430 return *m_opaque_ptr;
431}
Greg Clayton63094e02010-06-23 01:19:29 +0000432
433Listener &
Chris Lattner24943d22010-06-08 16:52:24 +0000434SBListener::operator *()
435{
Greg Clayton63094e02010-06-23 01:19:29 +0000436 return *m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000437}
438
Greg Clayton63094e02010-06-23 01:19:29 +0000439const Listener &
Chris Lattner24943d22010-06-08 16:52:24 +0000440SBListener::operator *() const
441{
Greg Clayton63094e02010-06-23 01:19:29 +0000442 return *m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000443}
444
445