277 lines
8.0 KiB
C++
277 lines
8.0 KiB
C++
//===-- Event.h -------------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef liblldb_Event_h_
|
|
#define liblldb_Event_h_
|
|
|
|
#include "lldb/Core/Broadcaster.h"
|
|
#include "lldb/Core/StructuredData.h"
|
|
#include "lldb/Host/Predicate.h"
|
|
#include "lldb/Utility/ConstString.h"
|
|
#include "lldb/lldb-defines.h" // for DISALLOW_COPY_AND_ASSIGN
|
|
#include "lldb/lldb-forward.h" // for EventDataSP, ProcessSP, Struct...
|
|
|
|
#include "llvm/ADT/StringRef.h" // for StringRef
|
|
|
|
#include <chrono>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include <stddef.h> // for size_t
|
|
#include <stdint.h> // for uint32_t
|
|
|
|
namespace lldb_private {
|
|
class Event;
|
|
}
|
|
namespace lldb_private {
|
|
class Stream;
|
|
}
|
|
|
|
namespace lldb_private {
|
|
|
|
//----------------------------------------------------------------------
|
|
// lldb::EventData
|
|
//----------------------------------------------------------------------
|
|
class EventData {
|
|
friend class Event;
|
|
|
|
public:
|
|
EventData();
|
|
|
|
virtual ~EventData();
|
|
|
|
virtual const ConstString &GetFlavor() const = 0;
|
|
|
|
virtual void Dump(Stream *s) const;
|
|
|
|
private:
|
|
virtual void DoOnRemoval(Event *event_ptr) {}
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(EventData);
|
|
};
|
|
|
|
//----------------------------------------------------------------------
|
|
// lldb::EventDataBytes
|
|
//----------------------------------------------------------------------
|
|
class EventDataBytes : public EventData {
|
|
public:
|
|
//------------------------------------------------------------------
|
|
// Constructors
|
|
//------------------------------------------------------------------
|
|
EventDataBytes();
|
|
|
|
EventDataBytes(const char *cstr);
|
|
|
|
EventDataBytes(llvm::StringRef str);
|
|
|
|
EventDataBytes(const void *src, size_t src_len);
|
|
|
|
~EventDataBytes() override;
|
|
|
|
//------------------------------------------------------------------
|
|
// Member functions
|
|
//------------------------------------------------------------------
|
|
const ConstString &GetFlavor() const override;
|
|
|
|
void Dump(Stream *s) const override;
|
|
|
|
const void *GetBytes() const;
|
|
|
|
size_t GetByteSize() const;
|
|
|
|
void SetBytes(const void *src, size_t src_len);
|
|
|
|
void SwapBytes(std::string &new_bytes);
|
|
|
|
void SetBytesFromCString(const char *cstr);
|
|
|
|
//------------------------------------------------------------------
|
|
// Static functions
|
|
//------------------------------------------------------------------
|
|
static const EventDataBytes *GetEventDataFromEvent(const Event *event_ptr);
|
|
|
|
static const void *GetBytesFromEvent(const Event *event_ptr);
|
|
|
|
static size_t GetByteSizeFromEvent(const Event *event_ptr);
|
|
|
|
static const ConstString &GetFlavorString();
|
|
|
|
private:
|
|
std::string m_bytes;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(EventDataBytes);
|
|
};
|
|
|
|
class EventDataReceipt : public EventData {
|
|
public:
|
|
EventDataReceipt() : EventData(), m_predicate(false) {}
|
|
|
|
~EventDataReceipt() override {}
|
|
|
|
static const ConstString &GetFlavorString() {
|
|
static ConstString g_flavor("Process::ProcessEventData");
|
|
return g_flavor;
|
|
}
|
|
|
|
const ConstString &GetFlavor() const override { return GetFlavorString(); }
|
|
|
|
bool WaitForEventReceived(
|
|
const std::chrono::microseconds &abstime = std::chrono::microseconds(0),
|
|
bool *timed_out = nullptr) {
|
|
return m_predicate.WaitForValueEqualTo(true, abstime, timed_out);
|
|
}
|
|
|
|
private:
|
|
Predicate<bool> m_predicate;
|
|
|
|
void DoOnRemoval(Event *event_ptr) override {
|
|
m_predicate.SetValue(true, eBroadcastAlways);
|
|
}
|
|
};
|
|
|
|
//----------------------------------------------------------------------
|
|
/// This class handles one or more StructuredData::Dictionary entries
|
|
/// that are raised for structured data events.
|
|
//----------------------------------------------------------------------
|
|
|
|
class EventDataStructuredData : public EventData {
|
|
public:
|
|
//------------------------------------------------------------------
|
|
// Constructors
|
|
//------------------------------------------------------------------
|
|
EventDataStructuredData();
|
|
|
|
EventDataStructuredData(const lldb::ProcessSP &process_sp,
|
|
const StructuredData::ObjectSP &object_sp,
|
|
const lldb::StructuredDataPluginSP &plugin_sp);
|
|
|
|
~EventDataStructuredData() override;
|
|
|
|
//------------------------------------------------------------------
|
|
// Member functions
|
|
//------------------------------------------------------------------
|
|
const ConstString &GetFlavor() const override;
|
|
|
|
void Dump(Stream *s) const override;
|
|
|
|
const lldb::ProcessSP &GetProcess() const;
|
|
|
|
const StructuredData::ObjectSP &GetObject() const;
|
|
|
|
const lldb::StructuredDataPluginSP &GetStructuredDataPlugin() const;
|
|
|
|
void SetProcess(const lldb::ProcessSP &process_sp);
|
|
|
|
void SetObject(const StructuredData::ObjectSP &object_sp);
|
|
|
|
void SetStructuredDataPlugin(const lldb::StructuredDataPluginSP &plugin_sp);
|
|
|
|
//------------------------------------------------------------------
|
|
// Static functions
|
|
//------------------------------------------------------------------
|
|
static const EventDataStructuredData *
|
|
GetEventDataFromEvent(const Event *event_ptr);
|
|
|
|
static lldb::ProcessSP GetProcessFromEvent(const Event *event_ptr);
|
|
|
|
static StructuredData::ObjectSP GetObjectFromEvent(const Event *event_ptr);
|
|
|
|
static lldb::StructuredDataPluginSP
|
|
GetPluginFromEvent(const Event *event_ptr);
|
|
|
|
static const ConstString &GetFlavorString();
|
|
|
|
private:
|
|
lldb::ProcessSP m_process_sp;
|
|
StructuredData::ObjectSP m_object_sp;
|
|
lldb::StructuredDataPluginSP m_plugin_sp;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(EventDataStructuredData);
|
|
};
|
|
|
|
//----------------------------------------------------------------------
|
|
// lldb::Event
|
|
//----------------------------------------------------------------------
|
|
class Event {
|
|
friend class Listener;
|
|
friend class EventData;
|
|
friend class Broadcaster::BroadcasterImpl;
|
|
|
|
public:
|
|
Event(Broadcaster *broadcaster, uint32_t event_type,
|
|
EventData *data = nullptr);
|
|
|
|
Event(Broadcaster *broadcaster, uint32_t event_type,
|
|
const lldb::EventDataSP &event_data_sp);
|
|
|
|
Event(uint32_t event_type, EventData *data = nullptr);
|
|
|
|
Event(uint32_t event_type, const lldb::EventDataSP &event_data_sp);
|
|
|
|
~Event();
|
|
|
|
void Dump(Stream *s) const;
|
|
|
|
EventData *GetData() { return m_data_sp.get(); }
|
|
|
|
const EventData *GetData() const { return m_data_sp.get(); }
|
|
|
|
void SetData(EventData *new_data) { m_data_sp.reset(new_data); }
|
|
|
|
uint32_t GetType() const { return m_type; }
|
|
|
|
void SetType(uint32_t new_type) { m_type = new_type; }
|
|
|
|
Broadcaster *GetBroadcaster() const {
|
|
Broadcaster::BroadcasterImplSP broadcaster_impl_sp =
|
|
m_broadcaster_wp.lock();
|
|
if (broadcaster_impl_sp)
|
|
return broadcaster_impl_sp->GetBroadcaster();
|
|
else
|
|
return nullptr;
|
|
}
|
|
|
|
bool BroadcasterIs(Broadcaster *broadcaster) {
|
|
Broadcaster::BroadcasterImplSP broadcaster_impl_sp =
|
|
m_broadcaster_wp.lock();
|
|
if (broadcaster_impl_sp)
|
|
return broadcaster_impl_sp->GetBroadcaster() == broadcaster;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
void Clear() { m_data_sp.reset(); }
|
|
|
|
private:
|
|
// This is only called by Listener when it pops an event off the queue for
|
|
// the listener. It calls the Event Data's DoOnRemoval() method, which is
|
|
// virtual and can be overridden by the specific data classes.
|
|
|
|
void DoOnRemoval();
|
|
|
|
// Called by Broadcaster::BroadcastEvent prior to letting all the listeners
|
|
// know about it update the contained broadcaster so that events can be
|
|
// popped off one queue and re-broadcast to others.
|
|
void SetBroadcaster(Broadcaster *broadcaster) {
|
|
m_broadcaster_wp = broadcaster->GetBroadcasterImpl();
|
|
}
|
|
|
|
Broadcaster::BroadcasterImplWP
|
|
m_broadcaster_wp; // The broadcaster that sent this event
|
|
uint32_t m_type; // The bit describing this event
|
|
lldb::EventDataSP m_data_sp; // User specific data for this event
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(Event);
|
|
Event(); // Disallow default constructor
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // liblldb_Event_h_
|