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