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 LLDB_UTILITY_EVENT_H
11 #define LLDB_UTILITY_EVENT_H
13 #include "lldb/Utility/Broadcaster.h"
14 #include "lldb/Utility/ConstString.h"
15 #include "lldb/Utility/Predicate.h"
16 #include "lldb/Utility/StructuredData.h"
17 #include "lldb/lldb-defines.h"
18 #include "lldb/lldb-forward.h"
20 #include "llvm/ADT/StringRef.h"
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(const Timeout<std::micro> &timeout = llvm::None) {
125 return m_predicate.WaitForValueEqualTo(true, timeout);
129 Predicate<bool> m_predicate;
131 void DoOnRemoval(Event *event_ptr) override {
132 m_predicate.SetValue(true, eBroadcastAlways);
136 //----------------------------------------------------------------------
137 /// This class handles one or more StructuredData::Dictionary entries
138 /// that are raised for structured data events.
139 //----------------------------------------------------------------------
141 class EventDataStructuredData : public EventData {
143 //------------------------------------------------------------------
145 //------------------------------------------------------------------
146 EventDataStructuredData();
148 EventDataStructuredData(const lldb::ProcessSP &process_sp,
149 const StructuredData::ObjectSP &object_sp,
150 const lldb::StructuredDataPluginSP &plugin_sp);
152 ~EventDataStructuredData() override;
154 //------------------------------------------------------------------
156 //------------------------------------------------------------------
157 const ConstString &GetFlavor() const override;
159 void Dump(Stream *s) const override;
161 const lldb::ProcessSP &GetProcess() const;
163 const StructuredData::ObjectSP &GetObject() const;
165 const lldb::StructuredDataPluginSP &GetStructuredDataPlugin() const;
167 void SetProcess(const lldb::ProcessSP &process_sp);
169 void SetObject(const StructuredData::ObjectSP &object_sp);
171 void SetStructuredDataPlugin(const lldb::StructuredDataPluginSP &plugin_sp);
173 //------------------------------------------------------------------
175 //------------------------------------------------------------------
176 static const EventDataStructuredData *
177 GetEventDataFromEvent(const Event *event_ptr);
179 static lldb::ProcessSP GetProcessFromEvent(const Event *event_ptr);
181 static StructuredData::ObjectSP GetObjectFromEvent(const Event *event_ptr);
183 static lldb::StructuredDataPluginSP
184 GetPluginFromEvent(const Event *event_ptr);
186 static const ConstString &GetFlavorString();
189 lldb::ProcessSP m_process_sp;
190 StructuredData::ObjectSP m_object_sp;
191 lldb::StructuredDataPluginSP m_plugin_sp;
193 DISALLOW_COPY_AND_ASSIGN(EventDataStructuredData);
196 //----------------------------------------------------------------------
198 //----------------------------------------------------------------------
200 friend class Listener;
201 friend class EventData;
202 friend class Broadcaster::BroadcasterImpl;
205 Event(Broadcaster *broadcaster, uint32_t event_type,
206 EventData *data = nullptr);
208 Event(Broadcaster *broadcaster, uint32_t event_type,
209 const lldb::EventDataSP &event_data_sp);
211 Event(uint32_t event_type, EventData *data = nullptr);
213 Event(uint32_t event_type, const lldb::EventDataSP &event_data_sp);
217 void Dump(Stream *s) const;
219 EventData *GetData() { return m_data_sp.get(); }
221 const EventData *GetData() const { return m_data_sp.get(); }
223 void SetData(EventData *new_data) { m_data_sp.reset(new_data); }
225 uint32_t GetType() const { return m_type; }
227 void SetType(uint32_t new_type) { m_type = new_type; }
229 Broadcaster *GetBroadcaster() const {
230 Broadcaster::BroadcasterImplSP broadcaster_impl_sp =
231 m_broadcaster_wp.lock();
232 if (broadcaster_impl_sp)
233 return broadcaster_impl_sp->GetBroadcaster();
238 bool BroadcasterIs(Broadcaster *broadcaster) {
239 Broadcaster::BroadcasterImplSP broadcaster_impl_sp =
240 m_broadcaster_wp.lock();
241 if (broadcaster_impl_sp)
242 return broadcaster_impl_sp->GetBroadcaster() == broadcaster;
247 void Clear() { m_data_sp.reset(); }
250 // This is only called by Listener when it pops an event off the queue for
251 // the listener. It calls the Event Data's DoOnRemoval() method, which is
252 // virtual and can be overridden by the specific data classes.
256 // Called by Broadcaster::BroadcastEvent prior to letting all the listeners
257 // know about it update the contained broadcaster so that events can be
258 // popped off one queue and re-broadcast to others.
259 void SetBroadcaster(Broadcaster *broadcaster) {
260 m_broadcaster_wp = broadcaster->GetBroadcasterImpl();
263 Broadcaster::BroadcasterImplWP
264 m_broadcaster_wp; // The broadcaster that sent this event
265 uint32_t m_type; // The bit describing this event
266 lldb::EventDataSP m_data_sp; // User specific data for this event
268 DISALLOW_COPY_AND_ASSIGN(Event);
269 Event(); // Disallow default constructor
272 } // namespace lldb_private
274 #endif // LLDB_UTILITY_EVENT_H