LLDB mainline
Event.cpp
Go to the documentation of this file.
1//===-- Event.cpp ---------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10
13#include "lldb/Utility/Endian.h"
15#include "lldb/Utility/Stream.h"
18
19#include "llvm/ADT/StringExtras.h"
20
21#include <algorithm>
22
23#include <cctype>
24
25using namespace lldb;
26using namespace lldb_private;
27
28#pragma mark -
29#pragma mark Event
30
31// Event functions
32
33Event::Event(Broadcaster *broadcaster, uint32_t event_type, EventData *data)
34 : m_broadcaster_wp(broadcaster->GetBroadcasterImpl()), m_type(event_type),
35 m_data_sp(data) {}
36
37Event::Event(Broadcaster *broadcaster, uint32_t event_type,
38 const EventDataSP &event_data_sp)
39 : m_broadcaster_wp(broadcaster->GetBroadcasterImpl()), m_type(event_type),
40 m_data_sp(event_data_sp) {}
41
42Event::Event(uint32_t event_type, EventData *data)
43 : m_broadcaster_wp(), m_type(event_type), m_data_sp(data) {}
44
45Event::Event(uint32_t event_type, const EventDataSP &event_data_sp)
46 : m_broadcaster_wp(), m_type(event_type), m_data_sp(event_data_sp) {}
47
48Event::~Event() = default;
49
50void Event::Dump(Stream *s) const {
51 Broadcaster *broadcaster;
52 Broadcaster::BroadcasterImplSP broadcaster_impl_sp(m_broadcaster_wp.lock());
53 if (broadcaster_impl_sp)
54 broadcaster = broadcaster_impl_sp->GetBroadcaster();
55 else
56 broadcaster = nullptr;
57
58 if (broadcaster) {
59 StreamString event_name;
60 if (broadcaster->GetEventNames(event_name, m_type, false))
61 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x (%s), data = ",
62 static_cast<const void *>(this),
63 static_cast<void *>(broadcaster),
64 broadcaster->GetBroadcasterName().c_str(), m_type,
65 event_name.GetData());
66 else
67 s->Printf("%p Event: broadcaster = %p (%s), type = 0x%8.8x, data = ",
68 static_cast<const void *>(this),
69 static_cast<void *>(broadcaster),
70 broadcaster->GetBroadcasterName().c_str(), m_type);
71 } else
72 s->Printf("%p Event: broadcaster = NULL, type = 0x%8.8x, data = ",
73 static_cast<const void *>(this), m_type);
74
75 if (m_data_sp) {
76 s->PutChar('{');
77 m_data_sp->Dump(s);
78 s->PutChar('}');
79 } else
80 s->Printf("<NULL>");
81}
82
84 std::lock_guard<std::mutex> guard(m_listeners_mutex);
85
86 if (m_data_sp)
87 m_data_sp->DoOnRemoval(this);
88 // Now that the event has been handled by the primary event Listener, forward
89 // it to the other Listeners.
90 EventSP me_sp = shared_from_this();
91 for (auto listener_sp : m_pending_listeners)
92 listener_sp->AddEvent(me_sp);
93 m_pending_listeners.clear();
94}
95
96#pragma mark -
97#pragma mark EventData
98
99// EventData functions
100
101EventData::EventData() = default;
102
103EventData::~EventData() = default;
104
105void EventData::Dump(Stream *s) const { s->PutCString("Generic Event Data"); }
106
107#pragma mark -
108#pragma mark EventDataBytes
109
110// EventDataBytes functions
111
113
114EventDataBytes::EventDataBytes(llvm::StringRef str) : m_bytes(str.str()) {}
115
117
118llvm::StringRef EventDataBytes::GetFlavorString() { return "EventDataBytes"; }
119
120llvm::StringRef EventDataBytes::GetFlavor() const {
122}
123
125 if (llvm::all_of(m_bytes, llvm::isPrint))
126 s->Format("\"{0}\"", m_bytes);
127 else
128 s->Format("{0:$[ ]@[x-2]}", llvm::make_range(
129 reinterpret_cast<const uint8_t *>(m_bytes.data()),
130 reinterpret_cast<const uint8_t *>(m_bytes.data() +
131 m_bytes.size())));
132}
133
134const void *EventDataBytes::GetBytes() const {
135 return (m_bytes.empty() ? nullptr : m_bytes.data());
136}
137
138size_t EventDataBytes::GetByteSize() const { return m_bytes.size(); }
139
140const void *EventDataBytes::GetBytesFromEvent(const Event *event_ptr) {
141 const EventDataBytes *e = GetEventDataFromEvent(event_ptr);
142 if (e != nullptr)
143 return e->GetBytes();
144 return nullptr;
145}
146
148 const EventDataBytes *e = GetEventDataFromEvent(event_ptr);
149 if (e != nullptr)
150 return e->GetByteSize();
151 return 0;
152}
153
154const EventDataBytes *
156 if (event_ptr != nullptr) {
157 const EventData *event_data = event_ptr->GetData();
158 if (event_data &&
160 return static_cast<const EventDataBytes *>(event_data);
161 }
162 return nullptr;
163}
164
166 return "Process::ProcessEventData";
167}
168
169#pragma mark -
170#pragma mark EventStructuredData
171
172// EventDataStructuredData definitions
173
175 : EventData(), m_process_sp(), m_object_sp(), m_plugin_sp() {}
176
178 const ProcessSP &process_sp, const StructuredData::ObjectSP &object_sp,
179 const lldb::StructuredDataPluginSP &plugin_sp)
180 : EventData(), m_process_sp(process_sp), m_object_sp(object_sp),
181 m_plugin_sp(plugin_sp) {}
182
184
185// EventDataStructuredData member functions
186
187llvm::StringRef EventDataStructuredData::GetFlavor() const {
189}
190
192 if (!s)
193 return;
194
195 if (m_object_sp)
196 m_object_sp->Dump(*s);
197}
198
200 return m_process_sp;
201}
202
204 return m_object_sp;
205}
206
209 return m_plugin_sp;
210}
211
213 m_process_sp = process_sp;
214}
215
217 const StructuredData::ObjectSP &object_sp) {
218 m_object_sp = object_sp;
219}
220
222 const lldb::StructuredDataPluginSP &plugin_sp) {
223 m_plugin_sp = plugin_sp;
224}
225
226// EventDataStructuredData static functions
227
230 if (event_ptr == nullptr)
231 return nullptr;
232
233 const EventData *event_data = event_ptr->GetData();
234 if (!event_data ||
236 return nullptr;
237
238 return static_cast<const EventDataStructuredData *>(event_data);
239}
240
242 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
243 if (event_data)
244 return event_data->GetProcess();
245 else
246 return ProcessSP();
247}
248
251 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
252 if (event_data)
253 return event_data->GetObject();
254 else
256}
257
260 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);
261 if (event_data)
262 return event_data->GetStructuredDataPlugin();
263 else
264 return StructuredDataPluginSP();
265}
266
268 return "EventDataStructuredData";
269}
An event broadcasting class.
Definition: Broadcaster.h:145
const std::string & GetBroadcasterName()
Get this broadcaster's name.
Definition: Broadcaster.h:222
std::shared_ptr< BroadcasterImpl > BroadcasterImplSP
Definition: Broadcaster.h:463
bool GetEventNames(Stream &s, const uint32_t event_mask, bool prefix_with_broadcaster_name) const
Get the event name(s) for one or more event bits.
Definition: Broadcaster.h:231
const void * GetBytes() const
Definition: Event.cpp:134
static llvm::StringRef GetFlavorString()
Definition: Event.cpp:118
static const void * GetBytesFromEvent(const Event *event_ptr)
Definition: Event.cpp:140
static size_t GetByteSizeFromEvent(const Event *event_ptr)
Definition: Event.cpp:147
llvm::StringRef GetFlavor() const override
Definition: Event.cpp:120
void Dump(Stream *s) const override
Definition: Event.cpp:124
static const EventDataBytes * GetEventDataFromEvent(const Event *event_ptr)
Definition: Event.cpp:155
size_t GetByteSize() const
Definition: Event.cpp:138
static llvm::StringRef GetFlavorString()
Definition: Event.cpp:165
This class handles one or more StructuredData::Dictionary entries that are raised for structured data...
Definition: Event.h:117
llvm::StringRef GetFlavor() const override
Definition: Event.cpp:187
const StructuredData::ObjectSP & GetObject() const
Definition: Event.cpp:203
const lldb::ProcessSP & GetProcess() const
Definition: Event.cpp:199
void SetStructuredDataPlugin(const lldb::StructuredDataPluginSP &plugin_sp)
Definition: Event.cpp:221
lldb::StructuredDataPluginSP m_plugin_sp
Definition: Event.h:161
const lldb::StructuredDataPluginSP & GetStructuredDataPlugin() const
Definition: Event.cpp:208
void SetObject(const StructuredData::ObjectSP &object_sp)
Definition: Event.cpp:216
StructuredData::ObjectSP m_object_sp
Definition: Event.h:160
static llvm::StringRef GetFlavorString()
Definition: Event.cpp:267
static lldb::ProcessSP GetProcessFromEvent(const Event *event_ptr)
Definition: Event.cpp:241
void SetProcess(const lldb::ProcessSP &process_sp)
Definition: Event.cpp:212
static lldb::StructuredDataPluginSP GetPluginFromEvent(const Event *event_ptr)
Definition: Event.cpp:259
static StructuredData::ObjectSP GetObjectFromEvent(const Event *event_ptr)
Definition: Event.cpp:250
static const EventDataStructuredData * GetEventDataFromEvent(const Event *event_ptr)
Definition: Event.cpp:229
void Dump(Stream *s) const override
Definition: Event.cpp:191
virtual void Dump(Stream *s) const
Definition: Event.cpp:105
virtual llvm::StringRef GetFlavor() const =0
EventData * GetData()
Definition: Event.h:189
Broadcaster::BroadcasterImplWP m_broadcaster_wp
Definition: Event.h:240
lldb::EventDataSP m_data_sp
Definition: Event.h:242
void DoOnRemoval()
Definition: Event.cpp:83
uint32_t m_type
Definition: Event.h:241
std::mutex m_listeners_mutex
Definition: Event.h:244
void Dump(Stream *s) const
Definition: Event.cpp:50
std::vector< lldb::ListenerSP > m_pending_listeners
Definition: Event.h:243
const char * GetData() const
Definition: StreamString.h:43
A stream class that can stream formatted output to a file.
Definition: Stream.h:28
void Format(const char *format, Args &&... args)
Definition: Stream.h:353
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition: Stream.cpp:134
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
Definition: Stream.cpp:65
size_t PutChar(char ch)
Definition: Stream.cpp:131
std::shared_ptr< Object > ObjectSP
A class that represents a running process on the host machine.
Definition: SBAttachInfo.h:14
Definition: SBAddress.h:15
std::shared_ptr< lldb_private::StructuredDataPlugin > StructuredDataPluginSP
Definition: lldb-forward.h:426
std::shared_ptr< lldb_private::Process > ProcessSP
Definition: lldb-forward.h:381
std::shared_ptr< lldb_private::Event > EventSP
Definition: lldb-forward.h:337
std::shared_ptr< lldb_private::EventData > EventDataSP
Definition: lldb-forward.h:338