Event.h revision 344779
10SN/A//===-- Event.h -------------------------------------------------*- C++ -*-===// 29330SN/A// 30SN/A// The LLVM Compiler Infrastructure 40SN/A// 50SN/A// This file is distributed under the University of Illinois Open Source 60SN/A// License. See LICENSE.TXT for details. 72362SN/A// 80SN/A//===----------------------------------------------------------------------===// 92362SN/A 100SN/A#ifndef LLDB_UTILITY_EVENT_H 110SN/A#define LLDB_UTILITY_EVENT_H 120SN/A 130SN/A#include "lldb/Utility/Broadcaster.h" 140SN/A#include "lldb/Utility/ConstString.h" 150SN/A#include "lldb/Utility/Predicate.h" 160SN/A#include "lldb/Utility/StructuredData.h" 170SN/A#include "lldb/lldb-defines.h" 180SN/A#include "lldb/lldb-forward.h" 190SN/A 200SN/A#include "llvm/ADT/StringRef.h" 212362SN/A 222362SN/A#include <chrono> 232362SN/A#include <memory> 240SN/A#include <string> 250SN/A 260SN/A#include <stddef.h> 270SN/A#include <stdint.h> 280SN/A 2911820Savstepannamespace lldb_private { 300SN/Aclass Event; 310SN/A} 320SN/Anamespace lldb_private { 330SN/Aclass Stream; 340SN/A} 350SN/A 360SN/Anamespace lldb_private { 370SN/A 380SN/A//---------------------------------------------------------------------- 390SN/A// lldb::EventData 400SN/A//---------------------------------------------------------------------- 410SN/Aclass EventData { 4211820Savstepan friend class Event; 430SN/A 440SN/Apublic: 450SN/A EventData(); 460SN/A 470SN/A virtual ~EventData(); 480SN/A 490SN/A virtual const ConstString &GetFlavor() const = 0; 500SN/A 510SN/A virtual void Dump(Stream *s) const; 520SN/A 530SN/Aprivate: 540SN/A virtual void DoOnRemoval(Event *event_ptr) {} 550SN/A 560SN/A DISALLOW_COPY_AND_ASSIGN(EventData); 570SN/A}; 580SN/A 590SN/A//---------------------------------------------------------------------- 600SN/A// lldb::EventDataBytes 610SN/A//---------------------------------------------------------------------- 620SN/Aclass EventDataBytes : public EventData { 630SN/Apublic: 640SN/A //------------------------------------------------------------------ 650SN/A // Constructors 660SN/A //------------------------------------------------------------------ 670SN/A EventDataBytes(); 680SN/A 690SN/A EventDataBytes(const char *cstr); 700SN/A 710SN/A EventDataBytes(llvm::StringRef str); 720SN/A 730SN/A EventDataBytes(const void *src, size_t src_len); 740SN/A 750SN/A ~EventDataBytes() override; 760SN/A 770SN/A //------------------------------------------------------------------ 780SN/A // Member functions 790SN/A //------------------------------------------------------------------ 800SN/A const ConstString &GetFlavor() const override; 810SN/A 820SN/A void Dump(Stream *s) const override; 833213SN/A 840SN/A const void *GetBytes() const; 850SN/A 86 size_t GetByteSize() const; 87 88 void SetBytes(const void *src, size_t src_len); 89 90 void SwapBytes(std::string &new_bytes); 91 92 void SetBytesFromCString(const char *cstr); 93 94 //------------------------------------------------------------------ 95 // Static functions 96 //------------------------------------------------------------------ 97 static const EventDataBytes *GetEventDataFromEvent(const Event *event_ptr); 98 99 static const void *GetBytesFromEvent(const Event *event_ptr); 100 101 static size_t GetByteSizeFromEvent(const Event *event_ptr); 102 103 static const ConstString &GetFlavorString(); 104 105private: 106 std::string m_bytes; 107 108 DISALLOW_COPY_AND_ASSIGN(EventDataBytes); 109}; 110 111class EventDataReceipt : public EventData { 112public: 113 EventDataReceipt() : EventData(), m_predicate(false) {} 114 115 ~EventDataReceipt() override {} 116 117 static const ConstString &GetFlavorString() { 118 static ConstString g_flavor("Process::ProcessEventData"); 119 return g_flavor; 120 } 121 122 const ConstString &GetFlavor() const override { return GetFlavorString(); } 123 124 bool WaitForEventReceived(const Timeout<std::micro> &timeout = llvm::None) { 125 return m_predicate.WaitForValueEqualTo(true, timeout); 126 } 127 128private: 129 Predicate<bool> m_predicate; 130 131 void DoOnRemoval(Event *event_ptr) override { 132 m_predicate.SetValue(true, eBroadcastAlways); 133 } 134}; 135 136//---------------------------------------------------------------------- 137/// This class handles one or more StructuredData::Dictionary entries 138/// that are raised for structured data events. 139//---------------------------------------------------------------------- 140 141class EventDataStructuredData : public EventData { 142public: 143 //------------------------------------------------------------------ 144 // Constructors 145 //------------------------------------------------------------------ 146 EventDataStructuredData(); 147 148 EventDataStructuredData(const lldb::ProcessSP &process_sp, 149 const StructuredData::ObjectSP &object_sp, 150 const lldb::StructuredDataPluginSP &plugin_sp); 151 152 ~EventDataStructuredData() override; 153 154 //------------------------------------------------------------------ 155 // Member functions 156 //------------------------------------------------------------------ 157 const ConstString &GetFlavor() const override; 158 159 void Dump(Stream *s) const override; 160 161 const lldb::ProcessSP &GetProcess() const; 162 163 const StructuredData::ObjectSP &GetObject() const; 164 165 const lldb::StructuredDataPluginSP &GetStructuredDataPlugin() const; 166 167 void SetProcess(const lldb::ProcessSP &process_sp); 168 169 void SetObject(const StructuredData::ObjectSP &object_sp); 170 171 void SetStructuredDataPlugin(const lldb::StructuredDataPluginSP &plugin_sp); 172 173 //------------------------------------------------------------------ 174 // Static functions 175 //------------------------------------------------------------------ 176 static const EventDataStructuredData * 177 GetEventDataFromEvent(const Event *event_ptr); 178 179 static lldb::ProcessSP GetProcessFromEvent(const Event *event_ptr); 180 181 static StructuredData::ObjectSP GetObjectFromEvent(const Event *event_ptr); 182 183 static lldb::StructuredDataPluginSP 184 GetPluginFromEvent(const Event *event_ptr); 185 186 static const ConstString &GetFlavorString(); 187 188private: 189 lldb::ProcessSP m_process_sp; 190 StructuredData::ObjectSP m_object_sp; 191 lldb::StructuredDataPluginSP m_plugin_sp; 192 193 DISALLOW_COPY_AND_ASSIGN(EventDataStructuredData); 194}; 195 196//---------------------------------------------------------------------- 197// lldb::Event 198//---------------------------------------------------------------------- 199class Event { 200 friend class Listener; 201 friend class EventData; 202 friend class Broadcaster::BroadcasterImpl; 203 204public: 205 Event(Broadcaster *broadcaster, uint32_t event_type, 206 EventData *data = nullptr); 207 208 Event(Broadcaster *broadcaster, uint32_t event_type, 209 const lldb::EventDataSP &event_data_sp); 210 211 Event(uint32_t event_type, EventData *data = nullptr); 212 213 Event(uint32_t event_type, const lldb::EventDataSP &event_data_sp); 214 215 ~Event(); 216 217 void Dump(Stream *s) const; 218 219 EventData *GetData() { return m_data_sp.get(); } 220 221 const EventData *GetData() const { return m_data_sp.get(); } 222 223 void SetData(EventData *new_data) { m_data_sp.reset(new_data); } 224 225 uint32_t GetType() const { return m_type; } 226 227 void SetType(uint32_t new_type) { m_type = new_type; } 228 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(); 234 else 235 return nullptr; 236 } 237 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; 243 else 244 return false; 245 } 246 247 void Clear() { m_data_sp.reset(); } 248 249private: 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. 253 254 void DoOnRemoval(); 255 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(); 261 } 262 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 267 268 DISALLOW_COPY_AND_ASSIGN(Event); 269 Event(); // Disallow default constructor 270}; 271 272} // namespace lldb_private 273 274#endif // LLDB_UTILITY_EVENT_H 275