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