1 //===-- Listener.h ----------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_Select_h_
11 #define liblldb_Select_h_
20 // Other libraries and framework includes
22 #include "lldb/lldb-private.h"
23 #include "lldb/Host/Predicate.h"
24 #include "lldb/Core/Event.h"
26 namespace lldb_private {
31 typedef bool (*HandleBroadcastCallback) (lldb::EventSP &event_sp, void *baton);
33 friend class Broadcaster;
34 friend class BroadcasterManager;
36 //------------------------------------------------------------------
37 // Constructors and Destructors
38 //------------------------------------------------------------------
39 Listener (const char *name);
44 AddEvent (lldb::EventSP &event);
52 return m_name.c_str();
56 StartListeningForEventSpec (BroadcasterManager &manager,
57 const BroadcastEventSpec &event_spec);
60 StopListeningForEventSpec (BroadcasterManager &manager,
61 const BroadcastEventSpec &event_spec);
64 StartListeningForEvents (Broadcaster* broadcaster,
68 StartListeningForEvents (Broadcaster* broadcaster,
70 HandleBroadcastCallback callback,
71 void *callback_user_data);
74 StopListeningForEvents (Broadcaster* broadcaster,
77 // Returns true if an event was received, false if we timed out.
79 WaitForEvent (const TimeValue *timeout,
80 lldb::EventSP &event_sp);
83 WaitForEventForBroadcaster (const TimeValue *timeout,
84 Broadcaster *broadcaster,
85 lldb::EventSP &event_sp);
88 WaitForEventForBroadcasterWithType (const TimeValue *timeout,
89 Broadcaster *broadcaster,
90 uint32_t event_type_mask,
91 lldb::EventSP &event_sp);
97 PeekAtNextEventForBroadcaster (Broadcaster *broadcaster);
100 PeekAtNextEventForBroadcasterWithType (Broadcaster *broadcaster,
101 uint32_t event_type_mask);
104 GetNextEvent (lldb::EventSP &event_sp);
107 GetNextEventForBroadcaster (Broadcaster *broadcaster,
108 lldb::EventSP &event_sp);
111 GetNextEventForBroadcasterWithType (Broadcaster *broadcaster,
112 uint32_t event_type_mask,
113 lldb::EventSP &event_sp);
116 HandleBroadcastEvent (lldb::EventSP &event_sp);
119 //------------------------------------------------------------------
120 // Classes that inherit from Listener can see and modify these
121 //------------------------------------------------------------------
122 struct BroadcasterInfo
124 BroadcasterInfo(uint32_t mask, HandleBroadcastCallback cb = nullptr, void *ud = nullptr) :
127 callback_user_data (ud)
132 HandleBroadcastCallback callback;
133 void *callback_user_data;
136 typedef std::multimap<Broadcaster*, BroadcasterInfo> broadcaster_collection;
137 typedef std::list<lldb::EventSP> event_collection;
138 typedef std::vector<BroadcasterManager *> broadcaster_manager_collection;
141 FindNextEventInternal(Broadcaster *broadcaster, // nullptr for any broadcaster
142 const ConstString *sources, // nullptr for any event
143 uint32_t num_sources,
144 uint32_t event_type_mask,
145 lldb::EventSP &event_sp,
149 GetNextEventInternal(Broadcaster *broadcaster, // nullptr for any broadcaster
150 const ConstString *sources, // nullptr for any event
151 uint32_t num_sources,
152 uint32_t event_type_mask,
153 lldb::EventSP &event_sp);
156 WaitForEventsInternal(const TimeValue *timeout,
157 Broadcaster *broadcaster, // nullptr for any broadcaster
158 const ConstString *sources, // nullptr for any event
159 uint32_t num_sources,
160 uint32_t event_type_mask,
161 lldb::EventSP &event_sp);
164 broadcaster_collection m_broadcasters;
165 Mutex m_broadcasters_mutex; // Protects m_broadcasters
166 event_collection m_events;
167 Mutex m_events_mutex; // Protects m_broadcasters and m_events
168 Predicate<bool> m_cond_wait;
169 broadcaster_manager_collection m_broadcaster_managers;
172 BroadcasterWillDestruct (Broadcaster *);
175 BroadcasterManagerWillDestruct (BroadcasterManager *manager);
178 // broadcaster_collection::iterator
179 // FindBroadcasterWithMask (Broadcaster *broadcaster,
180 // uint32_t event_mask,
183 //------------------------------------------------------------------
185 //------------------------------------------------------------------
186 DISALLOW_COPY_AND_ASSIGN (Listener);
189 } // namespace lldb_private
191 #endif // liblldb_Select_h_