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_
22 // Other libraries and framework includes
24 #include "lldb/Core/Event.h"
25 #include "lldb/Utility/Timeout.h"
26 #include "lldb/lldb-private.h"
28 namespace lldb_private {
30 class Listener : public std::enable_shared_from_this<Listener> {
32 typedef bool (*HandleBroadcastCallback)(lldb::EventSP &event_sp, void *baton);
34 friend class Broadcaster;
35 friend class BroadcasterManager;
37 //------------------------------------------------------------------
38 // Constructors and Destructors
39 //------------------------------------------------------------------
41 // Listeners have to be constructed into shared pointers - at least if you
42 // want them to listen to
45 Listener(const char *name);
48 static lldb::ListenerSP MakeListener(const char *name);
52 void AddEvent(lldb::EventSP &event);
56 const char *GetName() { return m_name.c_str(); }
58 uint32_t StartListeningForEventSpec(lldb::BroadcasterManagerSP manager_sp,
59 const BroadcastEventSpec &event_spec);
61 bool StopListeningForEventSpec(lldb::BroadcasterManagerSP manager_sp,
62 const BroadcastEventSpec &event_spec);
64 uint32_t StartListeningForEvents(Broadcaster *broadcaster,
67 uint32_t StartListeningForEvents(Broadcaster *broadcaster,
69 HandleBroadcastCallback callback,
70 void *callback_user_data);
72 bool StopListeningForEvents(Broadcaster *broadcaster, uint32_t event_mask);
74 Event *PeekAtNextEvent();
76 Event *PeekAtNextEventForBroadcaster(Broadcaster *broadcaster);
78 Event *PeekAtNextEventForBroadcasterWithType(Broadcaster *broadcaster,
79 uint32_t event_type_mask);
81 // Returns true if an event was received, false if we timed out.
82 bool GetEvent(lldb::EventSP &event_sp, const Timeout<std::micro> &timeout);
84 bool GetEventForBroadcaster(Broadcaster *broadcaster, lldb::EventSP &event_sp,
85 const Timeout<std::micro> &timeout);
87 bool GetEventForBroadcasterWithType(Broadcaster *broadcaster,
88 uint32_t event_type_mask,
89 lldb::EventSP &event_sp,
90 const Timeout<std::micro> &timeout);
92 size_t HandleBroadcastEvent(lldb::EventSP &event_sp);
95 //------------------------------------------------------------------
96 // Classes that inherit from Listener can see and modify these
97 //------------------------------------------------------------------
98 struct BroadcasterInfo {
99 BroadcasterInfo(uint32_t mask, HandleBroadcastCallback cb = nullptr,
101 : event_mask(mask), callback(cb), callback_user_data(ud) {}
104 HandleBroadcastCallback callback;
105 void *callback_user_data;
108 typedef std::multimap<Broadcaster::BroadcasterImplWP, BroadcasterInfo,
109 std::owner_less<Broadcaster::BroadcasterImplWP>>
110 broadcaster_collection;
111 typedef std::list<lldb::EventSP> event_collection;
112 typedef std::vector<lldb::BroadcasterManagerWP>
113 broadcaster_manager_collection;
116 FindNextEventInternal(std::unique_lock<std::mutex> &lock,
117 Broadcaster *broadcaster, // nullptr for any broadcaster
118 const ConstString *sources, // nullptr for any event
119 uint32_t num_sources, uint32_t event_type_mask,
120 lldb::EventSP &event_sp, bool remove);
122 bool GetEventInternal(const Timeout<std::micro> &timeout,
123 Broadcaster *broadcaster, // nullptr for any broadcaster
124 const ConstString *sources, // nullptr for any event
125 uint32_t num_sources, uint32_t event_type_mask,
126 lldb::EventSP &event_sp);
129 broadcaster_collection m_broadcasters;
130 std::recursive_mutex m_broadcasters_mutex; // Protects m_broadcasters
131 event_collection m_events;
132 std::mutex m_events_mutex; // Protects m_broadcasters and m_events
133 std::condition_variable m_events_condition;
134 broadcaster_manager_collection m_broadcaster_managers;
136 void BroadcasterWillDestruct(Broadcaster *);
138 void BroadcasterManagerWillDestruct(lldb::BroadcasterManagerSP manager_sp);
140 // broadcaster_collection::iterator
141 // FindBroadcasterWithMask (Broadcaster *broadcaster,
142 // uint32_t event_mask,
145 //------------------------------------------------------------------
147 //------------------------------------------------------------------
148 DISALLOW_COPY_AND_ASSIGN(Listener);
151 } // namespace lldb_private
153 #endif // liblldb_Select_h_