Listener.h revision e9170d2ccd75c88691e9b85291a0042e58f982be
1//===-- Listener.h ----------------------------------------------*- 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#ifndef liblldb_Select_h_ 11#define liblldb_Select_h_ 12 13// C Includes 14// C++ Includes 15#include <list> 16#include <map> 17#include <set> 18#include <string> 19 20 21// Other libraries and framework includes 22// Project includes 23#include "lldb/lldb-private.h" 24#include "lldb/Host/Predicate.h" 25#include "lldb/Core/Event.h" 26 27namespace lldb_private { 28 29class Listener 30{ 31public: 32 typedef bool (*HandleBroadcastCallback) (lldb::EventSP &event_sp, void *baton); 33 34 friend class Broadcaster; 35 36 //------------------------------------------------------------------ 37 // Constructors and Destructors 38 //------------------------------------------------------------------ 39 Listener (const char *name); 40 41 ~Listener (); 42 43 void 44 AddEvent (lldb::EventSP &event); 45 46 void 47 Clear (); 48 49 const char * 50 GetName () 51 { 52 return m_name.c_str(); 53 } 54 55 uint32_t 56 StartListeningForEvents (Broadcaster* broadcaster, 57 uint32_t event_mask); 58 59 uint32_t 60 StartListeningForEvents (Broadcaster* broadcaster, 61 uint32_t event_mask, 62 HandleBroadcastCallback callback, 63 void *callback_user_data); 64 65 bool 66 StopListeningForEvents (Broadcaster* broadcaster, 67 uint32_t event_mask); 68 69 // Returns true if an event was recieved, false if we timed out. 70 bool 71 WaitForEvent (const TimeValue *timeout, 72 lldb::EventSP &event_sp); 73 74 bool 75 WaitForEventForBroadcaster (const TimeValue *timeout, 76 Broadcaster *broadcaster, 77 lldb::EventSP &event_sp); 78 79 bool 80 WaitForEventForBroadcasterWithType (const TimeValue *timeout, 81 Broadcaster *broadcaster, 82 uint32_t event_type_mask, 83 lldb::EventSP &event_sp); 84 85 Event * 86 PeekAtNextEvent (); 87 88 Event * 89 PeekAtNextEventForBroadcaster (Broadcaster *broadcaster); 90 91 Event * 92 PeekAtNextEventForBroadcasterWithType (Broadcaster *broadcaster, 93 uint32_t event_type_mask); 94 95 bool 96 GetNextEvent (lldb::EventSP &event_sp); 97 98 bool 99 GetNextEventForBroadcaster (Broadcaster *broadcaster, 100 lldb::EventSP &event_sp); 101 102 bool 103 GetNextEventForBroadcasterWithType (Broadcaster *broadcaster, 104 uint32_t event_type_mask, 105 lldb::EventSP &event_sp); 106 107 size_t 108 HandleBroadcastEvent (lldb::EventSP &event_sp); 109 110protected: 111 112 //------------------------------------------------------------------ 113 // Classes that inherit from Listener can see and modify these 114 //------------------------------------------------------------------ 115 struct BroadcasterInfo 116 { 117 BroadcasterInfo(uint32_t mask, HandleBroadcastCallback cb = NULL, void *ud = NULL) : 118 event_mask (mask), 119 callback (cb), 120 callback_user_data (ud) 121 { 122 } 123 124 uint32_t event_mask; 125 HandleBroadcastCallback callback; 126 void *callback_user_data; 127 }; 128 129 typedef std::multimap<Broadcaster*, BroadcasterInfo> broadcaster_collection; 130 typedef std::list<lldb::EventSP> event_collection; 131 132 bool 133 FindNextEventInternal (Broadcaster *broadcaster, // NULL for any broadcaster 134 const ConstString *sources, // NULL for any event 135 uint32_t num_sources, 136 uint32_t event_type_mask, 137 lldb::EventSP &event_sp, 138 bool remove); 139 140 bool 141 GetNextEventInternal (Broadcaster *broadcaster, // NULL for any broadcaster 142 const ConstString *sources, // NULL for any event 143 uint32_t num_sources, 144 uint32_t event_type_mask, 145 lldb::EventSP &event_sp); 146 147 bool 148 WaitForEventsInternal (const TimeValue *timeout, 149 Broadcaster *broadcaster, // NULL for any broadcaster 150 const ConstString *sources, // NULL for any event 151 uint32_t num_sources, 152 uint32_t event_type_mask, 153 lldb::EventSP &event_sp); 154 155 std::string m_name; 156 broadcaster_collection m_broadcasters; 157 Mutex m_broadcasters_mutex; // Protects m_broadcasters 158 event_collection m_events; 159 Mutex m_events_mutex; // Protects m_broadcasters and m_events 160 Predicate<bool> m_cond_wait; 161 162 void 163 BroadcasterWillDestruct (Broadcaster *); 164private: 165 166// broadcaster_collection::iterator 167// FindBroadcasterWithMask (Broadcaster *broadcaster, 168// uint32_t event_mask, 169// bool exact); 170 171 //------------------------------------------------------------------ 172 // For Listener only 173 //------------------------------------------------------------------ 174 DISALLOW_COPY_AND_ASSIGN (Listener); 175}; 176 177} // namespace lldb_private 178 179#endif // liblldb_Select_h_ 180