276 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9#include "lldb/Utility/Event.h"10 11#include "lldb/Utility/Broadcaster.h"12#include "lldb/Utility/DataExtractor.h"13#include "lldb/Utility/Endian.h"14#include "lldb/Utility/Listener.h"15#include "lldb/Utility/Stream.h"16#include "lldb/Utility/StreamString.h"17#include "lldb/lldb-enumerations.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 Event30 31// Event functions32 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 else56 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 else67 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 } else72 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 } else80 s->Printf("<NULL>");81}82 83void Event::DoOnRemoval() {84 std::lock_guard<std::mutex> guard(m_listeners_mutex);85 86 if (!m_data_sp)87 return;88 89 m_data_sp->DoOnRemoval(this);90 91 // Now that the event has been handled by the primary event Listener, forward92 // it to the other Listeners.93 94 EventSP me_sp = shared_from_this();95 if (m_data_sp->ForwardEventToPendingListeners(this)) {96 for (auto listener_sp : m_pending_listeners)97 listener_sp->AddEvent(me_sp);98 m_pending_listeners.clear();99 }100}101 102#pragma mark -103#pragma mark EventData104 105// EventData functions106 107EventData::EventData() = default;108 109EventData::~EventData() = default;110 111void EventData::Dump(Stream *s) const { s->PutCString("Generic Event Data"); }112 113#pragma mark -114#pragma mark EventDataBytes115 116// EventDataBytes functions117 118EventDataBytes::EventDataBytes() : m_bytes() {}119 120EventDataBytes::EventDataBytes(llvm::StringRef str) : m_bytes(str.str()) {}121 122EventDataBytes::~EventDataBytes() = default;123 124llvm::StringRef EventDataBytes::GetFlavorString() { return "EventDataBytes"; }125 126llvm::StringRef EventDataBytes::GetFlavor() const {127 return EventDataBytes::GetFlavorString();128}129 130void EventDataBytes::Dump(Stream *s) const {131 if (llvm::all_of(m_bytes, llvm::isPrint))132 s->Format("\"{0}\"", m_bytes);133 else134 s->Format("{0:$[ ]@[x-2]}", llvm::make_range(135 reinterpret_cast<const uint8_t *>(m_bytes.data()),136 reinterpret_cast<const uint8_t *>(m_bytes.data() +137 m_bytes.size())));138}139 140const void *EventDataBytes::GetBytes() const {141 return (m_bytes.empty() ? nullptr : m_bytes.data());142}143 144size_t EventDataBytes::GetByteSize() const { return m_bytes.size(); }145 146const void *EventDataBytes::GetBytesFromEvent(const Event *event_ptr) {147 const EventDataBytes *e = GetEventDataFromEvent(event_ptr);148 if (e != nullptr)149 return e->GetBytes();150 return nullptr;151}152 153size_t EventDataBytes::GetByteSizeFromEvent(const Event *event_ptr) {154 const EventDataBytes *e = GetEventDataFromEvent(event_ptr);155 if (e != nullptr)156 return e->GetByteSize();157 return 0;158}159 160const EventDataBytes *161EventDataBytes::GetEventDataFromEvent(const Event *event_ptr) {162 if (event_ptr != nullptr) {163 const EventData *event_data = event_ptr->GetData();164 if (event_data &&165 event_data->GetFlavor() == EventDataBytes::GetFlavorString())166 return static_cast<const EventDataBytes *>(event_data);167 }168 return nullptr;169}170 171llvm::StringRef EventDataReceipt::GetFlavorString() {172 return "Process::ProcessEventData";173}174 175#pragma mark -176#pragma mark EventStructuredData177 178// EventDataStructuredData definitions179 180EventDataStructuredData::EventDataStructuredData()181 : EventData(), m_process_sp(), m_object_sp(), m_plugin_sp() {}182 183EventDataStructuredData::EventDataStructuredData(184 const ProcessSP &process_sp, const StructuredData::ObjectSP &object_sp,185 const lldb::StructuredDataPluginSP &plugin_sp)186 : EventData(), m_process_sp(process_sp), m_object_sp(object_sp),187 m_plugin_sp(plugin_sp) {}188 189EventDataStructuredData::~EventDataStructuredData() = default;190 191// EventDataStructuredData member functions192 193llvm::StringRef EventDataStructuredData::GetFlavor() const {194 return EventDataStructuredData::GetFlavorString();195}196 197void EventDataStructuredData::Dump(Stream *s) const {198 if (!s)199 return;200 201 if (m_object_sp)202 m_object_sp->Dump(*s);203}204 205const ProcessSP &EventDataStructuredData::GetProcess() const {206 return m_process_sp;207}208 209const StructuredData::ObjectSP &EventDataStructuredData::GetObject() const {210 return m_object_sp;211}212 213const lldb::StructuredDataPluginSP &214EventDataStructuredData::GetStructuredDataPlugin() const {215 return m_plugin_sp;216}217 218void EventDataStructuredData::SetProcess(const ProcessSP &process_sp) {219 m_process_sp = process_sp;220}221 222void EventDataStructuredData::SetObject(223 const StructuredData::ObjectSP &object_sp) {224 m_object_sp = object_sp;225}226 227void EventDataStructuredData::SetStructuredDataPlugin(228 const lldb::StructuredDataPluginSP &plugin_sp) {229 m_plugin_sp = plugin_sp;230}231 232// EventDataStructuredData static functions233 234const EventDataStructuredData *235EventDataStructuredData::GetEventDataFromEvent(const Event *event_ptr) {236 if (event_ptr == nullptr)237 return nullptr;238 239 const EventData *event_data = event_ptr->GetData();240 if (!event_data ||241 event_data->GetFlavor() != EventDataStructuredData::GetFlavorString())242 return nullptr;243 244 return static_cast<const EventDataStructuredData *>(event_data);245}246 247ProcessSP EventDataStructuredData::GetProcessFromEvent(const Event *event_ptr) {248 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);249 if (event_data)250 return event_data->GetProcess();251 else252 return ProcessSP();253}254 255StructuredData::ObjectSP256EventDataStructuredData::GetObjectFromEvent(const Event *event_ptr) {257 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);258 if (event_data)259 return event_data->GetObject();260 else261 return StructuredData::ObjectSP();262}263 264lldb::StructuredDataPluginSP265EventDataStructuredData::GetPluginFromEvent(const Event *event_ptr) {266 auto event_data = EventDataStructuredData::GetEventDataFromEvent(event_ptr);267 if (event_data)268 return event_data->GetStructuredDataPlugin();269 else270 return StructuredDataPluginSP();271}272 273llvm::StringRef EventDataStructuredData::GetFlavorString() {274 return "EventDataStructuredData";275}276