SBListener.cpp revision 280031
1//===-- 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 10#include "lldb/lldb-python.h" 11 12#include "lldb/API/SBListener.h" 13#include "lldb/API/SBBroadcaster.h" 14#include "lldb/API/SBDebugger.h" 15#include "lldb/API/SBEvent.h" 16#include "lldb/API/SBStream.h" 17#include "lldb/Core/Broadcaster.h" 18#include "lldb/Core/Debugger.h" 19#include "lldb/Core/Listener.h" 20#include "lldb/Core/Log.h" 21#include "lldb/Core/StreamString.h" 22#include "lldb/Host/TimeValue.h" 23 24 25using namespace lldb; 26using namespace lldb_private; 27 28 29SBListener::SBListener () : 30 m_opaque_sp (), 31 m_opaque_ptr (NULL) 32{ 33} 34 35SBListener::SBListener (const char *name) : 36 m_opaque_sp (new Listener (name)), 37 m_opaque_ptr (NULL) 38{ 39 m_opaque_ptr = m_opaque_sp.get(); 40 41 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 42 43 if (log) 44 log->Printf ("SBListener::SBListener (name=\"%s\") => SBListener(%p)", 45 name, static_cast<void*>(m_opaque_ptr)); 46} 47 48 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 66SBListener::SBListener (Listener &listener) : 67 m_opaque_sp (), 68 m_opaque_ptr (&listener) 69{ 70} 71 72SBListener::SBListener (const lldb::ListenerSP &listener_sp) : 73 m_opaque_sp (listener_sp), 74 m_opaque_ptr (listener_sp.get()) 75{ 76} 77 78SBListener::~SBListener () 79{ 80} 81 82bool 83SBListener::IsValid() const 84{ 85 return m_opaque_ptr != NULL; 86} 87 88void 89SBListener::AddEvent (const SBEvent &event) 90{ 91 EventSP &event_sp = event.GetSP (); 92 if (event_sp) 93 m_opaque_ptr->AddEvent (event_sp); 94} 95 96void 97SBListener::Clear () 98{ 99 if (m_opaque_ptr) 100 m_opaque_ptr->Clear (); 101} 102 103uint32_t 104SBListener::StartListeningForEventClass (SBDebugger &debugger, 105 const char *broadcaster_class, 106 uint32_t event_mask) 107{ 108 if (m_opaque_ptr) 109 { 110 Debugger *lldb_debugger = debugger.get(); 111 if (!lldb_debugger) 112 return 0; 113 BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask); 114 return m_opaque_ptr->StartListeningForEventSpec (*lldb_debugger, event_spec); 115 } 116 else 117 return 0; 118} 119 120bool 121SBListener::StopListeningForEventClass (SBDebugger &debugger, 122 const char *broadcaster_class, 123 uint32_t event_mask) 124{ 125 if (m_opaque_ptr) 126 { 127 Debugger *lldb_debugger = debugger.get(); 128 if (!lldb_debugger) 129 return false; 130 BroadcastEventSpec event_spec (ConstString (broadcaster_class), event_mask); 131 return m_opaque_ptr->StopListeningForEventSpec (*lldb_debugger, event_spec); 132 } 133 else 134 return false; 135} 136 137uint32_t 138SBListener::StartListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask) 139{ 140 uint32_t acquired_event_mask = 0; 141 if (m_opaque_ptr && broadcaster.IsValid()) 142 { 143 acquired_event_mask = m_opaque_ptr->StartListeningForEvents (broadcaster.get(), event_mask); 144 } 145 146 Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 147 if (log) 148 { 149 StreamString sstr_requested; 150 StreamString sstr_acquired; 151 152 Broadcaster *lldb_broadcaster = broadcaster.get(); 153 if (lldb_broadcaster) 154 { 155 const bool got_requested_names = lldb_broadcaster->GetEventNames (sstr_requested, event_mask, false); 156 const bool got_acquired_names = lldb_broadcaster->GetEventNames (sstr_acquired, acquired_event_mask, false); 157 log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p): %s, event_mask=0x%8.8x%s%s%s) => 0x%8.8x%s%s%s", 158 static_cast<void*>(m_opaque_ptr), 159 static_cast<void*>(lldb_broadcaster), 160 lldb_broadcaster->GetBroadcasterName().GetCString(), 161 event_mask, 162 got_requested_names ? " (" : "", 163 sstr_requested.GetData(), 164 got_requested_names ? ")" : "", 165 acquired_event_mask, 166 got_acquired_names ? " (" : "", 167 sstr_acquired.GetData(), 168 got_acquired_names ? ")" : ""); 169 } 170 else 171 { 172 log->Printf ("SBListener(%p)::StartListeneingForEvents (SBBroadcaster(%p), event_mask=0x%8.8x) => 0x%8.8x", 173 static_cast<void*>(m_opaque_ptr), 174 static_cast<void*>(lldb_broadcaster), event_mask, 175 acquired_event_mask); 176 } 177 } 178 179 return acquired_event_mask; 180} 181 182bool 183SBListener::StopListeningForEvents (const SBBroadcaster& broadcaster, uint32_t event_mask) 184{ 185 if (m_opaque_ptr && broadcaster.IsValid()) 186 { 187 return m_opaque_ptr->StopListeningForEvents (broadcaster.get(), event_mask); 188 } 189 return false; 190} 191 192bool 193SBListener::WaitForEvent (uint32_t timeout_secs, SBEvent &event) 194{ 195 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 196 if (log) 197 { 198 if (timeout_secs == UINT32_MAX) 199 { 200 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p))...", 201 static_cast<void*>(m_opaque_ptr), 202 static_cast<void*>(event.get())); 203 } 204 else 205 { 206 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p))...", 207 static_cast<void*>(m_opaque_ptr), timeout_secs, 208 static_cast<void*>(event.get())); 209 } 210 } 211 bool success = false; 212 213 if (m_opaque_ptr) 214 { 215 TimeValue time_value; 216 if (timeout_secs != UINT32_MAX) 217 { 218 assert (timeout_secs != 0); // Take this out after all calls with timeout set to zero have been removed.... 219 time_value = TimeValue::Now(); 220 time_value.OffsetWithSeconds (timeout_secs); 221 } 222 EventSP event_sp; 223 if (m_opaque_ptr->WaitForEvent (time_value.IsValid() ? &time_value : NULL, event_sp)) 224 { 225 event.reset (event_sp); 226 success = true; 227 } 228 } 229 230 if (log) 231 { 232 if (timeout_secs == UINT32_MAX) 233 { 234 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=INFINITE, SBEvent(%p)) => %i", 235 static_cast<void*>(m_opaque_ptr), 236 static_cast<void*>(event.get()), success); 237 } 238 else 239 { 240 log->Printf ("SBListener(%p)::WaitForEvent (timeout_secs=%d, SBEvent(%p)) => %i", 241 static_cast<void*>(m_opaque_ptr), timeout_secs, 242 static_cast<void*>(event.get()), success); 243 } 244 } 245 if (!success) 246 event.reset (NULL); 247 return success; 248} 249 250bool 251SBListener::WaitForEventForBroadcaster 252( 253 uint32_t num_seconds, 254 const SBBroadcaster &broadcaster, 255 SBEvent &event 256) 257{ 258 if (m_opaque_ptr && broadcaster.IsValid()) 259 { 260 TimeValue time_value; 261 if (num_seconds != UINT32_MAX) 262 { 263 time_value = TimeValue::Now(); 264 time_value.OffsetWithSeconds (num_seconds); 265 } 266 EventSP event_sp; 267 if (m_opaque_ptr->WaitForEventForBroadcaster (time_value.IsValid() ? &time_value : NULL, 268 broadcaster.get(), 269 event_sp)) 270 { 271 event.reset (event_sp); 272 return true; 273 } 274 275 } 276 event.reset (NULL); 277 return false; 278} 279 280bool 281SBListener::WaitForEventForBroadcasterWithType 282( 283 uint32_t num_seconds, 284 const SBBroadcaster &broadcaster, 285 uint32_t event_type_mask, 286 SBEvent &event 287) 288{ 289 if (m_opaque_ptr && broadcaster.IsValid()) 290 { 291 TimeValue time_value; 292 if (num_seconds != UINT32_MAX) 293 { 294 time_value = TimeValue::Now(); 295 time_value.OffsetWithSeconds (num_seconds); 296 } 297 EventSP event_sp; 298 if (m_opaque_ptr->WaitForEventForBroadcasterWithType (time_value.IsValid() ? &time_value : NULL, 299 broadcaster.get(), 300 event_type_mask, 301 event_sp)) 302 { 303 event.reset (event_sp); 304 return true; 305 } 306 } 307 event.reset (NULL); 308 return false; 309} 310 311bool 312SBListener::PeekAtNextEvent (SBEvent &event) 313{ 314 if (m_opaque_ptr) 315 { 316 event.reset (m_opaque_ptr->PeekAtNextEvent ()); 317 return event.IsValid(); 318 } 319 event.reset (NULL); 320 return false; 321} 322 323bool 324SBListener::PeekAtNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event) 325{ 326 if (m_opaque_ptr && broadcaster.IsValid()) 327 { 328 event.reset (m_opaque_ptr->PeekAtNextEventForBroadcaster (broadcaster.get())); 329 return event.IsValid(); 330 } 331 event.reset (NULL); 332 return false; 333} 334 335bool 336SBListener::PeekAtNextEventForBroadcasterWithType (const SBBroadcaster &broadcaster, uint32_t event_type_mask, 337 SBEvent &event) 338{ 339 if (m_opaque_ptr && broadcaster.IsValid()) 340 { 341 event.reset(m_opaque_ptr->PeekAtNextEventForBroadcasterWithType (broadcaster.get(), event_type_mask)); 342 return event.IsValid(); 343 } 344 event.reset (NULL); 345 return false; 346} 347 348bool 349SBListener::GetNextEvent (SBEvent &event) 350{ 351 if (m_opaque_ptr) 352 { 353 EventSP event_sp; 354 if (m_opaque_ptr->GetNextEvent (event_sp)) 355 { 356 event.reset (event_sp); 357 return true; 358 } 359 } 360 event.reset (NULL); 361 return false; 362} 363 364bool 365SBListener::GetNextEventForBroadcaster (const SBBroadcaster &broadcaster, SBEvent &event) 366{ 367 if (m_opaque_ptr && broadcaster.IsValid()) 368 { 369 EventSP event_sp; 370 if (m_opaque_ptr->GetNextEventForBroadcaster (broadcaster.get(), event_sp)) 371 { 372 event.reset (event_sp); 373 return true; 374 } 375 } 376 event.reset (NULL); 377 return false; 378} 379 380bool 381SBListener::GetNextEventForBroadcasterWithType 382( 383 const SBBroadcaster &broadcaster, 384 uint32_t event_type_mask, 385 SBEvent &event 386) 387{ 388 if (m_opaque_ptr && broadcaster.IsValid()) 389 { 390 EventSP event_sp; 391 if (m_opaque_ptr->GetNextEventForBroadcasterWithType (broadcaster.get(), 392 event_type_mask, 393 event_sp)) 394 { 395 event.reset (event_sp); 396 return true; 397 } 398 } 399 event.reset (NULL); 400 return false; 401} 402 403bool 404SBListener::HandleBroadcastEvent (const SBEvent &event) 405{ 406 if (m_opaque_ptr) 407 return m_opaque_ptr->HandleBroadcastEvent (event.GetSP()); 408 return false; 409} 410 411Listener * 412SBListener::operator->() const 413{ 414 return m_opaque_ptr; 415} 416 417Listener * 418SBListener::get() const 419{ 420 return m_opaque_ptr; 421} 422 423void 424SBListener::reset(Listener *listener, bool owns) 425{ 426 if (owns) 427 m_opaque_sp.reset (listener); 428 else 429 m_opaque_sp.reset (); 430 m_opaque_ptr = listener; 431} 432 433Listener & 434SBListener::ref() const 435{ 436 return *m_opaque_ptr; 437} 438 439Listener & 440SBListener::operator *() 441{ 442 return *m_opaque_ptr; 443} 444 445const Listener & 446SBListener::operator *() const 447{ 448 return *m_opaque_ptr; 449} 450 451 452