]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/include/lldb/Core/Listener.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / 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 <list>
16 #include <map>
17 #include <set>
18 #include <string>
19 #include <vector>
20
21
22 // Other libraries and framework includes
23 // Project includes
24 #include "lldb/lldb-private.h"
25 #include "lldb/Host/Predicate.h"
26 #include "lldb/Core/Event.h"
27
28 namespace lldb_private {
29
30 class Listener
31 {
32 public:
33     typedef bool (*HandleBroadcastCallback) (lldb::EventSP &event_sp, void *baton);
34
35     friend class Broadcaster;
36     friend class BroadcasterManager;
37
38     //------------------------------------------------------------------
39     // Constructors and Destructors
40     //------------------------------------------------------------------
41     Listener (const char *name);
42
43     ~Listener ();
44
45     void
46     AddEvent (lldb::EventSP &event);
47
48     void
49     Clear ();
50
51     const char *
52     GetName ()
53     {
54         return m_name.c_str();
55     }
56
57     uint32_t
58     StartListeningForEventSpec (BroadcasterManager &manager, 
59                                  const BroadcastEventSpec &event_spec);
60     
61     bool
62     StopListeningForEventSpec (BroadcasterManager &manager, 
63                                  const BroadcastEventSpec &event_spec);
64     
65     uint32_t
66     StartListeningForEvents (Broadcaster* broadcaster, 
67                              uint32_t event_mask);
68     
69     uint32_t
70     StartListeningForEvents (Broadcaster* broadcaster,
71                              uint32_t event_mask,
72                              HandleBroadcastCallback callback,
73                              void *callback_user_data);
74
75     bool
76     StopListeningForEvents (Broadcaster* broadcaster,
77                             uint32_t event_mask);
78
79     // Returns true if an event was recieved, false if we timed out.
80     bool
81     WaitForEvent (const TimeValue *timeout,
82                   lldb::EventSP &event_sp);
83
84     bool
85     WaitForEventForBroadcaster (const TimeValue *timeout,
86                                 Broadcaster *broadcaster,
87                                 lldb::EventSP &event_sp);
88
89     bool
90     WaitForEventForBroadcasterWithType (const TimeValue *timeout,
91                                         Broadcaster *broadcaster,
92                                         uint32_t event_type_mask,
93                                         lldb::EventSP &event_sp);
94
95     Event *
96     PeekAtNextEvent ();
97
98     Event *
99     PeekAtNextEventForBroadcaster (Broadcaster *broadcaster);
100
101     Event *
102     PeekAtNextEventForBroadcasterWithType (Broadcaster *broadcaster,
103                                            uint32_t event_type_mask);
104
105     bool
106     GetNextEvent (lldb::EventSP &event_sp);
107
108     bool
109     GetNextEventForBroadcaster (Broadcaster *broadcaster,
110                                 lldb::EventSP &event_sp);
111
112     bool
113     GetNextEventForBroadcasterWithType (Broadcaster *broadcaster,
114                                         uint32_t event_type_mask,
115                                         lldb::EventSP &event_sp);
116
117     size_t
118     HandleBroadcastEvent (lldb::EventSP &event_sp);
119
120 private:
121
122     //------------------------------------------------------------------
123     // Classes that inherit from Listener can see and modify these
124     //------------------------------------------------------------------
125     struct BroadcasterInfo
126     {
127         BroadcasterInfo(uint32_t mask, HandleBroadcastCallback cb = NULL, void *ud = NULL) :
128             event_mask (mask),
129             callback (cb),
130             callback_user_data (ud)
131         {
132         }
133
134         uint32_t event_mask;
135         HandleBroadcastCallback callback;
136         void *callback_user_data;
137     };
138
139     typedef std::multimap<Broadcaster*, BroadcasterInfo> broadcaster_collection;
140     typedef std::list<lldb::EventSP> event_collection;
141     typedef std::vector<BroadcasterManager *> broadcaster_manager_collection;
142
143     bool
144     FindNextEventInternal (Broadcaster *broadcaster,   // NULL for any broadcaster
145                            const ConstString *sources, // NULL for any event
146                            uint32_t num_sources,
147                            uint32_t event_type_mask,
148                            lldb::EventSP &event_sp,
149                            bool remove);
150
151     bool
152     GetNextEventInternal (Broadcaster *broadcaster,   // NULL for any broadcaster
153                           const ConstString *sources, // NULL for any event
154                           uint32_t num_sources,
155                           uint32_t event_type_mask,
156                           lldb::EventSP &event_sp);
157
158     bool
159     WaitForEventsInternal (const TimeValue *timeout,
160                            Broadcaster *broadcaster,   // NULL for any broadcaster
161                            const ConstString *sources, // NULL for any event
162                            uint32_t num_sources,
163                            uint32_t event_type_mask,
164                            lldb::EventSP &event_sp);
165
166     std::string m_name;
167     broadcaster_collection m_broadcasters;
168     Mutex m_broadcasters_mutex; // Protects m_broadcasters
169     event_collection m_events;
170     Mutex m_events_mutex; // Protects m_broadcasters and m_events
171     Predicate<bool> m_cond_wait;
172     broadcaster_manager_collection m_broadcaster_managers;
173
174     void
175     BroadcasterWillDestruct (Broadcaster *);
176     
177     void
178     BroadcasterManagerWillDestruct (BroadcasterManager *manager);
179     
180
181 //    broadcaster_collection::iterator
182 //    FindBroadcasterWithMask (Broadcaster *broadcaster,
183 //                             uint32_t event_mask,
184 //                             bool exact);
185
186     //------------------------------------------------------------------
187     // For Listener only
188     //------------------------------------------------------------------
189     DISALLOW_COPY_AND_ASSIGN (Listener);
190 };
191
192 } // namespace lldb_private
193
194 #endif  // liblldb_Select_h_