1 //===-- Event.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_Event_h_
11 #define liblldb_Event_h_
13 #include "lldb/Core/Broadcaster.h"
14 #include "lldb/Host/Predicate.h"
15 #include "lldb/Utility/ConstString.h"
16 #include "lldb/Utility/StructuredData.h"
17 #include "lldb/lldb-defines.h" // for DISALLOW_COPY_AND_ASSIGN
18 #include "lldb/lldb-forward.h" // for EventDataSP, ProcessSP, Struct...
20 #include "llvm/ADT/StringRef.h" // for StringRef
26 #include <stddef.h> // for size_t
27 #include <stdint.h> // for uint32_t
29 namespace lldb_private {
32 namespace lldb_private {
36 namespace lldb_private {
38 //----------------------------------------------------------------------
40 //----------------------------------------------------------------------
49 virtual const ConstString &GetFlavor() const = 0;
51 virtual void Dump(Stream *s) const;
54 virtual void DoOnRemoval(Event *event_ptr) {}
56 DISALLOW_COPY_AND_ASSIGN(EventData);
59 //----------------------------------------------------------------------
60 // lldb::EventDataBytes
61 //----------------------------------------------------------------------
62 class EventDataBytes : public EventData {
64 //------------------------------------------------------------------
66 //------------------------------------------------------------------
69 EventDataBytes(const char *cstr);
71 EventDataBytes(llvm::StringRef str);
73 EventDataBytes(const void *src, size_t src_len);
75 ~EventDataBytes() override;
77 //------------------------------------------------------------------
79 //------------------------------------------------------------------
80 const ConstString &GetFlavor() const override;
82 void Dump(Stream *s) const override;
84 const void *GetBytes() const;
86 size_t GetByteSize() const;
88 void SetBytes(const void *src, size_t src_len);
90 void SwapBytes(std::string &new_bytes);
92 void SetBytesFromCString(const char *cstr);
94 //------------------------------------------------------------------
96 //------------------------------------------------------------------
97 static const EventDataBytes *GetEventDataFromEvent(const Event *event_ptr);
99 static const void *GetBytesFromEvent(const Event *event_ptr);
101 static size_t GetByteSizeFromEvent(const Event *event_ptr);
103 static const ConstString &GetFlavorString();
108 DISALLOW_COPY_AND_ASSIGN(EventDataBytes);
111 class EventDataReceipt : public EventData {
113 EventDataReceipt() : EventData(), m_predicate(false) {}
115 ~EventDataReceipt() override {}
117 static const ConstString &GetFlavorString() {
118 static ConstString g_flavor("Process::ProcessEventData");
122 const ConstString &GetFlavor() const override { return GetFlavorString(); }
124 bool WaitForEventReceived(
125 const std::chrono::microseconds &abstime = std::chrono::microseconds(0),
126 bool *timed_out = nullptr) {
127 return m_predicate.WaitForValueEqualTo(true, abstime, timed_out);
131 Predicate<bool> m_predicate;
133 void DoOnRemoval(Event *event_ptr) override {
134 m_predicate.SetValue(true, eBroadcastAlways);
138 //----------------------------------------------------------------------
139 /// This class handles one or more StructuredData::Dictionary entries
140 /// that are raised for structured data events.
141 //----------------------------------------------------------------------
143 class EventDataStructuredData : public EventData {
145 //------------------------------------------------------------------
147 //------------------------------------------------------------------
148 EventDataStructuredData();
150 EventDataStructuredData(const lldb::ProcessSP &process_sp,
151 const StructuredData::ObjectSP &object_sp,
152 const lldb::StructuredDataPluginSP &plugin_sp);
154 ~EventDataStructuredData() override;
156 //------------------------------------------------------------------
158 //------------------------------------------------------------------
159 const ConstString &GetFlavor() const override;
161 void Dump(Stream *s) const override;
163 const lldb::ProcessSP &GetProcess() const;
165 const StructuredData::ObjectSP &GetObject() const;
167 const lldb::StructuredDataPluginSP &GetStructuredDataPlugin() const;
169 void SetProcess(const lldb::ProcessSP &process_sp);
171 void SetObject(const StructuredData::ObjectSP &object_sp);
173 void SetStructuredDataPlugin(const lldb::StructuredDataPluginSP &plugin_sp);
175 //------------------------------------------------------------------
177 //------------------------------------------------------------------
178 static const EventDataStructuredData *
179 GetEventDataFromEvent(const Event *event_ptr);
181 static lldb::ProcessSP GetProcessFromEvent(const Event *event_ptr);
183 static StructuredData::ObjectSP GetObjectFromEvent(const Event *event_ptr);
185 static lldb::StructuredDataPluginSP
186 GetPluginFromEvent(const Event *event_ptr);
188 static const ConstString &GetFlavorString();
191 lldb::ProcessSP m_process_sp;
192 StructuredData::ObjectSP m_object_sp;
193 lldb::StructuredDataPluginSP m_plugin_sp;
195 DISALLOW_COPY_AND_ASSIGN(EventDataStructuredData);
198 //----------------------------------------------------------------------
200 //----------------------------------------------------------------------
202 friend class Listener;
203 friend class EventData;
204 friend class Broadcaster::BroadcasterImpl;
207 Event(Broadcaster *broadcaster, uint32_t event_type,
208 EventData *data = nullptr);
210 Event(Broadcaster *broadcaster, uint32_t event_type,
211 const lldb::EventDataSP &event_data_sp);
213 Event(uint32_t event_type, EventData *data = nullptr);
215 Event(uint32_t event_type, const lldb::EventDataSP &event_data_sp);
219 void Dump(Stream *s) const;
221 EventData *GetData() { return m_data_sp.get(); }
223 const EventData *GetData() const { return m_data_sp.get(); }
225 void SetData(EventData *new_data) { m_data_sp.reset(new_data); }
227 uint32_t GetType() const { return m_type; }
229 void SetType(uint32_t new_type) { m_type = new_type; }
231 Broadcaster *GetBroadcaster() const {
232 Broadcaster::BroadcasterImplSP broadcaster_impl_sp =
233 m_broadcaster_wp.lock();
234 if (broadcaster_impl_sp)
235 return broadcaster_impl_sp->GetBroadcaster();
240 bool BroadcasterIs(Broadcaster *broadcaster) {
241 Broadcaster::BroadcasterImplSP broadcaster_impl_sp =
242 m_broadcaster_wp.lock();
243 if (broadcaster_impl_sp)
244 return broadcaster_impl_sp->GetBroadcaster() == broadcaster;
249 void Clear() { m_data_sp.reset(); }
252 // This is only called by Listener when it pops an event off the queue for
253 // the listener. It calls the Event Data's DoOnRemoval() method, which is
254 // virtual and can be overridden by the specific data classes.
258 // Called by Broadcaster::BroadcastEvent prior to letting all the listeners
259 // know about it update the contained broadcaster so that events can be
260 // popped off one queue and re-broadcast to others.
261 void SetBroadcaster(Broadcaster *broadcaster) {
262 m_broadcaster_wp = broadcaster->GetBroadcasterImpl();
265 Broadcaster::BroadcasterImplWP
266 m_broadcaster_wp; // The broadcaster that sent this event
267 uint32_t m_type; // The bit describing this event
268 lldb::EventDataSP m_data_sp; // User specific data for this event
270 DISALLOW_COPY_AND_ASSIGN(Event);
271 Event(); // Disallow default constructor
274 } // namespace lldb_private
276 #endif // liblldb_Event_h_