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_
13 #include "lldb/Core/Broadcaster.h" // for Broadcaster::BroadcasterImplWP
14 #include "lldb/Utility/Timeout.h"
15 #include "lldb/lldb-defines.h" // for DISALLOW_COPY_AND_ASSIGN
16 #include "lldb/lldb-forward.h" // for BroadcasterManagerWP, EventSP
18 #include <condition_variable>
21 #include <memory> // for owner_less, enable_shared_from_this
23 #include <ratio> // for micro
27 #include <stddef.h> // for size_t
28 #include <stdint.h> // for uint32_t
30 namespace lldb_private {
33 namespace lldb_private {
37 namespace lldb_private {
39 class Listener : public std::enable_shared_from_this<Listener> {
41 typedef bool (*HandleBroadcastCallback)(lldb::EventSP &event_sp, void *baton);
43 friend class Broadcaster;
44 friend class BroadcasterManager;
46 //------------------------------------------------------------------
47 // Constructors and Destructors
48 //------------------------------------------------------------------
50 // Listeners have to be constructed into shared pointers - at least if you
51 // want them to listen to Broadcasters,
53 Listener(const char *name);
56 static lldb::ListenerSP MakeListener(const char *name);
60 void AddEvent(lldb::EventSP &event);
64 const char *GetName() { return m_name.c_str(); }
66 uint32_t StartListeningForEventSpec(lldb::BroadcasterManagerSP manager_sp,
67 const BroadcastEventSpec &event_spec);
69 bool StopListeningForEventSpec(lldb::BroadcasterManagerSP manager_sp,
70 const BroadcastEventSpec &event_spec);
72 uint32_t StartListeningForEvents(Broadcaster *broadcaster,
75 uint32_t StartListeningForEvents(Broadcaster *broadcaster,
77 HandleBroadcastCallback callback,
78 void *callback_user_data);
80 bool StopListeningForEvents(Broadcaster *broadcaster, uint32_t event_mask);
82 Event *PeekAtNextEvent();
84 Event *PeekAtNextEventForBroadcaster(Broadcaster *broadcaster);
86 Event *PeekAtNextEventForBroadcasterWithType(Broadcaster *broadcaster,
87 uint32_t event_type_mask);
89 // Returns true if an event was received, false if we timed out.
90 bool GetEvent(lldb::EventSP &event_sp, const Timeout<std::micro> &timeout);
92 bool GetEventForBroadcaster(Broadcaster *broadcaster, lldb::EventSP &event_sp,
93 const Timeout<std::micro> &timeout);
95 bool GetEventForBroadcasterWithType(Broadcaster *broadcaster,
96 uint32_t event_type_mask,
97 lldb::EventSP &event_sp,
98 const Timeout<std::micro> &timeout);
100 size_t HandleBroadcastEvent(lldb::EventSP &event_sp);
103 //------------------------------------------------------------------
104 // Classes that inherit from Listener can see and modify these
105 //------------------------------------------------------------------
106 struct BroadcasterInfo {
107 BroadcasterInfo(uint32_t mask, HandleBroadcastCallback cb = nullptr,
109 : event_mask(mask), callback(cb), callback_user_data(ud) {}
112 HandleBroadcastCallback callback;
113 void *callback_user_data;
116 typedef std::multimap<Broadcaster::BroadcasterImplWP, BroadcasterInfo,
117 std::owner_less<Broadcaster::BroadcasterImplWP>>
118 broadcaster_collection;
119 typedef std::list<lldb::EventSP> event_collection;
120 typedef std::vector<lldb::BroadcasterManagerWP>
121 broadcaster_manager_collection;
124 FindNextEventInternal(std::unique_lock<std::mutex> &lock,
125 Broadcaster *broadcaster, // nullptr for any broadcaster
126 const ConstString *sources, // nullptr for any event
127 uint32_t num_sources, uint32_t event_type_mask,
128 lldb::EventSP &event_sp, bool remove);
130 bool GetEventInternal(const Timeout<std::micro> &timeout,
131 Broadcaster *broadcaster, // nullptr for any broadcaster
132 const ConstString *sources, // nullptr for any event
133 uint32_t num_sources, uint32_t event_type_mask,
134 lldb::EventSP &event_sp);
137 broadcaster_collection m_broadcasters;
138 std::recursive_mutex m_broadcasters_mutex; // Protects m_broadcasters
139 event_collection m_events;
140 std::mutex m_events_mutex; // Protects m_broadcasters and m_events
141 std::condition_variable m_events_condition;
142 broadcaster_manager_collection m_broadcaster_managers;
144 void BroadcasterWillDestruct(Broadcaster *);
146 void BroadcasterManagerWillDestruct(lldb::BroadcasterManagerSP manager_sp);
148 // broadcaster_collection::iterator
149 // FindBroadcasterWithMask (Broadcaster *broadcaster,
150 // uint32_t event_mask,
153 //------------------------------------------------------------------
155 //------------------------------------------------------------------
156 DISALLOW_COPY_AND_ASSIGN(Listener);
159 } // namespace lldb_private
161 #endif // liblldb_Select_h_