]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - include/lldb/Core/Listener.h
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / include / lldb / Core / Listener.h
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 <chrono>
16 #include <list>
17 #include <map>
18 #include <mutex>
19 #include <string>
20 #include <vector>
21
22 // Other libraries and framework includes
23 // Project includes
24 #include "lldb/Core/Event.h"
25 #include "lldb/Utility/Timeout.h"
26 #include "lldb/lldb-private.h"
27
28 namespace lldb_private {
29
30 class Listener : public std::enable_shared_from_this<Listener> {
31 public:
32   typedef bool (*HandleBroadcastCallback)(lldb::EventSP &event_sp, void *baton);
33
34   friend class Broadcaster;
35   friend class BroadcasterManager;
36
37   //------------------------------------------------------------------
38   // Constructors and Destructors
39   //------------------------------------------------------------------
40   //
41   // Listeners have to be constructed into shared pointers - at least if you
42   // want them to listen to
43   // Broadcasters,
44 protected:
45   Listener(const char *name);
46
47 public:
48   static lldb::ListenerSP MakeListener(const char *name);
49
50   ~Listener();
51
52   void AddEvent(lldb::EventSP &event);
53
54   void Clear();
55
56   const char *GetName() { return m_name.c_str(); }
57
58   uint32_t StartListeningForEventSpec(lldb::BroadcasterManagerSP manager_sp,
59                                       const BroadcastEventSpec &event_spec);
60
61   bool StopListeningForEventSpec(lldb::BroadcasterManagerSP manager_sp,
62                                  const BroadcastEventSpec &event_spec);
63
64   uint32_t StartListeningForEvents(Broadcaster *broadcaster,
65                                    uint32_t event_mask);
66
67   uint32_t StartListeningForEvents(Broadcaster *broadcaster,
68                                    uint32_t event_mask,
69                                    HandleBroadcastCallback callback,
70                                    void *callback_user_data);
71
72   bool StopListeningForEvents(Broadcaster *broadcaster, uint32_t event_mask);
73
74   Event *PeekAtNextEvent();
75
76   Event *PeekAtNextEventForBroadcaster(Broadcaster *broadcaster);
77
78   Event *PeekAtNextEventForBroadcasterWithType(Broadcaster *broadcaster,
79                                                uint32_t event_type_mask);
80
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);
83
84   bool GetEventForBroadcaster(Broadcaster *broadcaster, lldb::EventSP &event_sp,
85                               const Timeout<std::micro> &timeout);
86
87   bool GetEventForBroadcasterWithType(Broadcaster *broadcaster,
88                                       uint32_t event_type_mask,
89                                       lldb::EventSP &event_sp,
90                                       const Timeout<std::micro> &timeout);
91
92   size_t HandleBroadcastEvent(lldb::EventSP &event_sp);
93
94 private:
95   //------------------------------------------------------------------
96   // Classes that inherit from Listener can see and modify these
97   //------------------------------------------------------------------
98   struct BroadcasterInfo {
99     BroadcasterInfo(uint32_t mask, HandleBroadcastCallback cb = nullptr,
100                     void *ud = nullptr)
101         : event_mask(mask), callback(cb), callback_user_data(ud) {}
102
103     uint32_t event_mask;
104     HandleBroadcastCallback callback;
105     void *callback_user_data;
106   };
107
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;
114
115   bool
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);
121
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);
127
128   std::string m_name;
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;
135
136   void BroadcasterWillDestruct(Broadcaster *);
137
138   void BroadcasterManagerWillDestruct(lldb::BroadcasterManagerSP manager_sp);
139
140   //    broadcaster_collection::iterator
141   //    FindBroadcasterWithMask (Broadcaster *broadcaster,
142   //                             uint32_t event_mask,
143   //                             bool exact);
144
145   //------------------------------------------------------------------
146   // For Listener only
147   //------------------------------------------------------------------
148   DISALLOW_COPY_AND_ASSIGN(Listener);
149 };
150
151 } // namespace lldb_private
152
153 #endif // liblldb_Select_h_