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_
21 // Other libraries and framework includes
23 #include "lldb/lldb-private.h"
24 #include "lldb/Core/Broadcaster.h"
25 #include "lldb/Host/Condition.h"
26 #include "lldb/Core/Event.h"
28 namespace lldb_private {
31 public std::enable_shared_from_this<Listener>
34 typedef bool (*HandleBroadcastCallback) (lldb::EventSP &event_sp, void *baton);
36 friend class Broadcaster;
37 friend class BroadcasterManager;
39 //------------------------------------------------------------------
40 // Constructors and Destructors
41 //------------------------------------------------------------------
43 // Listeners have to be constructed into shared pointers - at least if you want them to listen to
46 Listener (const char *name);
49 static lldb::ListenerSP
50 MakeListener(const char *name);
55 AddEvent (lldb::EventSP &event);
63 return m_name.c_str();
67 StartListeningForEventSpec (lldb::BroadcasterManagerSP manager_sp,
68 const BroadcastEventSpec &event_spec);
71 StopListeningForEventSpec (lldb::BroadcasterManagerSP manager_sp,
72 const BroadcastEventSpec &event_spec);
75 StartListeningForEvents (Broadcaster* broadcaster,
79 StartListeningForEvents (Broadcaster* broadcaster,
81 HandleBroadcastCallback callback,
82 void *callback_user_data);
85 StopListeningForEvents (Broadcaster* broadcaster,
88 // Returns true if an event was received, false if we timed out.
90 WaitForEvent (const TimeValue *timeout,
91 lldb::EventSP &event_sp);
94 WaitForEventForBroadcaster (const TimeValue *timeout,
95 Broadcaster *broadcaster,
96 lldb::EventSP &event_sp);
99 WaitForEventForBroadcasterWithType (const TimeValue *timeout,
100 Broadcaster *broadcaster,
101 uint32_t event_type_mask,
102 lldb::EventSP &event_sp);
108 PeekAtNextEventForBroadcaster (Broadcaster *broadcaster);
111 PeekAtNextEventForBroadcasterWithType (Broadcaster *broadcaster,
112 uint32_t event_type_mask);
115 GetNextEvent (lldb::EventSP &event_sp);
118 GetNextEventForBroadcaster (Broadcaster *broadcaster,
119 lldb::EventSP &event_sp);
122 GetNextEventForBroadcasterWithType (Broadcaster *broadcaster,
123 uint32_t event_type_mask,
124 lldb::EventSP &event_sp);
127 HandleBroadcastEvent (lldb::EventSP &event_sp);
130 //------------------------------------------------------------------
131 // Classes that inherit from Listener can see and modify these
132 //------------------------------------------------------------------
133 struct BroadcasterInfo
135 BroadcasterInfo(uint32_t mask, HandleBroadcastCallback cb = nullptr, void *ud = nullptr) :
138 callback_user_data (ud)
143 HandleBroadcastCallback callback;
144 void *callback_user_data;
147 typedef std::multimap<Broadcaster::BroadcasterImplWP,
149 std::owner_less<Broadcaster::BroadcasterImplWP>> broadcaster_collection;
150 typedef std::list<lldb::EventSP> event_collection;
151 typedef std::vector<lldb::BroadcasterManagerWP> broadcaster_manager_collection;
154 FindNextEventInternal(Mutex::Locker& lock,
155 Broadcaster *broadcaster, // nullptr for any broadcaster
156 const ConstString *sources, // nullptr for any event
157 uint32_t num_sources,
158 uint32_t event_type_mask,
159 lldb::EventSP &event_sp,
163 GetNextEventInternal(Broadcaster *broadcaster, // nullptr for any broadcaster
164 const ConstString *sources, // nullptr for any event
165 uint32_t num_sources,
166 uint32_t event_type_mask,
167 lldb::EventSP &event_sp);
170 WaitForEventsInternal(const TimeValue *timeout,
171 Broadcaster *broadcaster, // nullptr for any broadcaster
172 const ConstString *sources, // nullptr for any event
173 uint32_t num_sources,
174 uint32_t event_type_mask,
175 lldb::EventSP &event_sp);
178 broadcaster_collection m_broadcasters;
179 std::recursive_mutex m_broadcasters_mutex; // Protects m_broadcasters
180 event_collection m_events;
181 Mutex m_events_mutex; // Protects m_broadcasters and m_events
182 Condition m_events_condition;
183 broadcaster_manager_collection m_broadcaster_managers;
186 BroadcasterWillDestruct (Broadcaster *);
189 BroadcasterManagerWillDestruct (lldb::BroadcasterManagerSP manager_sp);
192 // broadcaster_collection::iterator
193 // FindBroadcasterWithMask (Broadcaster *broadcaster,
194 // uint32_t event_mask,
197 //------------------------------------------------------------------
199 //------------------------------------------------------------------
200 DISALLOW_COPY_AND_ASSIGN (Listener);
203 } // namespace lldb_private
205 #endif // liblldb_Select_h_