Removed unnecessary use of std::string for event management, in an attempt to reduce memory consumption.

Now using 16 bit enums for event types.
This commit is contained in:
Nav
2021-08-19 22:06:59 +01:00
parent 11415ce99a
commit 3554960a19
42 changed files with 336 additions and 72 deletions

View File

@@ -3,7 +3,7 @@
using namespace Bloom; using namespace Bloom;
using namespace Bloom::Events; using namespace Bloom::Events;
std::set<std::string> EventListener::getRegisteredEventTypeNames() { std::set<Events::EventType> EventListener::getRegisteredEventTypes() {
return this->registeredEventTypes.getValue(); return this->registeredEventTypes.getValue();
} }
@@ -13,13 +13,12 @@ void EventListener::clearAllCallbacks() {
} }
void EventListener::registerEvent(SharedGenericEventPointer event) { void EventListener::registerEvent(SharedGenericEventPointer event) {
auto eventType = event->getName(); Logger::debug("Event \"" + event->getName() + "\" (" + std::to_string(event->id)
Logger::debug("Event \"" + eventType + "\" (" + std::to_string(event->id)
+ ") registered for listener " + this->name); + ") registered for listener " + this->name);
auto queueLock = this->eventQueueByEventType.acquireLock(); auto queueLock = this->eventQueueByEventType.acquireLock();
auto& eventQueueByType = this->eventQueueByEventType.getReference(); auto& eventQueueByType = this->eventQueueByEventType.getReference();
eventQueueByType[eventType].push(std::move(event)); eventQueueByType[event->getType()].push(std::move(event));
this->eventQueueByEventTypeCV.notify_all(); this->eventQueueByEventTypeCV.notify_all();
if (this->interruptEventNotifier != nullptr && this->interruptEventNotifier->isInitialised()) { if (this->interruptEventNotifier != nullptr && this->interruptEventNotifier->isInitialised()) {
@@ -47,11 +46,10 @@ std::vector<SharedGenericEventPointer> EventListener::getEvents() {
} }
void EventListener::dispatchEvent(const SharedGenericEventPointer& event) { void EventListener::dispatchEvent(const SharedGenericEventPointer& event) {
auto eventName = event->getName(); Logger::debug("Dispatching event " + event->getName() + " (" + std::to_string(event->id) + ").");
Logger::debug("Dispatching event " + eventName + " (" + std::to_string(event->id) + ").");
// Dispatch the event to all registered handlers // Dispatch the event to all registered handlers
auto mappingLock = this->eventTypeToCallbacksMapping.acquireLock(); auto mappingLock = this->eventTypeToCallbacksMapping.acquireLock();
auto& callbacks = this->eventTypeToCallbacksMapping.getReference().find(eventName)->second; auto& callbacks = this->eventTypeToCallbacksMapping.getReference().find(event->getType())->second;
mappingLock.unlock(); mappingLock.unlock();
for (auto& callback : callbacks) { for (auto& callback : callbacks) {
@@ -70,14 +68,12 @@ void EventListener::dispatchCurrentEvents() {
void EventListener::waitAndDispatch(int msTimeout) { void EventListener::waitAndDispatch(int msTimeout) {
auto queueLock = this->eventQueueByEventType.acquireLock(); auto queueLock = this->eventQueueByEventType.acquireLock();
auto& eventQueueByType = this->eventQueueByEventType.getReference(); auto& eventQueueByType = this->eventQueueByEventType.getReference();
auto registeredEventTypes = this->getRegisteredEventTypeNames(); auto registeredEventTypes = this->getRegisteredEventTypes();
std::optional<SharedGenericEventPointer> event; std::optional<SharedGenericEventPointer> event;
auto eventsFound = [&registeredEventTypes, &event, &eventQueueByType]() -> bool { auto eventsFound = [&registeredEventTypes, &event, &eventQueueByType]() -> bool {
for (auto& eventQueue: eventQueueByType) { for (auto& eventQueue: eventQueueByType) {
if (registeredEventTypes.find(eventQueue.first) != registeredEventTypes.end() if (registeredEventTypes.contains(eventQueue.first) && !eventQueue.second.empty()) {
&& !eventQueue.second.empty()
) {
return true; return true;
} }
} }

View File

@@ -56,22 +56,22 @@ namespace Bloom
/** /**
* Holds all events registered to this listener. * Holds all events registered to this listener.
* *
* Events are grouped by event type name, and removed from their queue just *before* the dispatching to * Events are grouped by event type, and removed from their queue just *before* the dispatching to
* registered handlers begins. * registered handlers begins.
*/ */
SyncSafe<std::map<std::string, std::queue<Events::SharedGenericEventPointer>>> eventQueueByEventType; SyncSafe<std::map<Events::EventType, std::queue<Events::SharedGenericEventPointer>>> eventQueueByEventType;
std::condition_variable eventQueueByEventTypeCV; std::condition_variable eventQueueByEventTypeCV;
/** /**
* A mapping of event type names to a vector of callback functions. Events will be dispatched to these * A mapping of event types to a vector of callback functions. Events will be dispatched to these
* callback functions, during a call to EventListener::dispatchEvent(). * callback functions, during a call to EventListener::dispatchEvent().
* *
* Each callback will be passed a reference to the event (we wrap all registered callbacks in a lambda, where * Each callback will be passed a reference to the event (we wrap all registered callbacks in a lambda, where
* we perform a downcast before invoking the callback. See EventListener::registerCallbackForEventType() * we perform a downcast before invoking the callback. See EventListener::registerCallbackForEventType()
* for more) * for more)
*/ */
SyncSafe<std::map<std::string, std::vector<std::function<void(const Events::Event&)>>>> eventTypeToCallbacksMapping; SyncSafe<std::map<Events::EventType, std::vector<std::function<void(const Events::Event&)>>>> eventTypeToCallbacksMapping;
SyncSafe<std::set<std::string>> registeredEventTypes; SyncSafe<std::set<Events::EventType>> registeredEventTypes;
std::shared_ptr<EventNotifier> interruptEventNotifier = nullptr; std::shared_ptr<EventNotifier> interruptEventNotifier = nullptr;
@@ -85,11 +85,41 @@ namespace Bloom
}; };
/** /**
* Generates a list of event types names currently registered in the listener. * Generates a list of event types currently registered in the listener.
* *
* @return * @return
*/ */
std::set<std::string> getRegisteredEventTypeNames(); std::set<Events::EventType> getRegisteredEventTypes();
template <class EventType>
bool isEventTypeRegistered() {
return this->registeredEventTypes.getReference().contains(EventType::type);
}
bool isEventTypeRegistered(Events::EventType eventType) {
return this->registeredEventTypes.getReference().contains(eventType);
};
/**
* Registers an event type for the listener.
*
* Any events of EventType that are triggered from the point of calling this function, will be stored in
* listener queue until they are dispatched to a callback, or retrieved via a call to this->waitForEvent() or
* similar.
*
* @tparam EventType
*/
template<class EventType>
void registerEventType() {
auto registeredEventTypesLock = this->registeredEventTypes.acquireLock();
this->registeredEventTypes.getReference().insert(EventType::type);
}
template<class EventType>
void deRegisterEventType() {
auto registeredEventTypesLock = this->registeredEventTypes.acquireLock();
this->registeredEventTypes.getReference().erase(EventType::type);
}
/** /**
* Registers an event with the event listener * Registers an event with the event listener
@@ -122,9 +152,8 @@ namespace Bloom
auto mappingLock = this->eventTypeToCallbacksMapping.acquireLock(); auto mappingLock = this->eventTypeToCallbacksMapping.acquireLock();
auto& mapping = this->eventTypeToCallbacksMapping.getReference(); auto& mapping = this->eventTypeToCallbacksMapping.getReference();
mapping[EventType::name].push_back(parentCallback); mapping[EventType::type].push_back(parentCallback);
auto registeredEventTypesLock = this->registeredEventTypes.acquireLock(); this->template registerEventType<EventType>();
this->registeredEventTypes.getReference().insert(EventType::name);
} }
/** /**
@@ -143,21 +172,21 @@ namespace Bloom
auto mappingLock = this->eventTypeToCallbacksMapping.acquireLock(); auto mappingLock = this->eventTypeToCallbacksMapping.acquireLock();
auto& mapping = this->eventTypeToCallbacksMapping.getReference(); auto& mapping = this->eventTypeToCallbacksMapping.getReference();
if (mapping.contains(EventType::name)) { if (mapping.contains(EventType::type)) {
mapping.at(EventType::name).clear(); mapping.at(EventType::type).clear();
} }
} }
{ {
auto registeredEventTypesLock = this->registeredEventTypes.acquireLock(); auto registeredEventTypesLock = this->registeredEventTypes.acquireLock();
this->registeredEventTypes.getReference().erase(EventType::name); this->registeredEventTypes.getReference().erase(EventType::type);
} }
auto queueLock = this->eventQueueByEventType.acquireLock(); auto queueLock = this->eventQueueByEventType.acquireLock();
auto& eventQueueByType = this->eventQueueByEventType.getReference(); auto& eventQueueByType = this->eventQueueByEventType.getReference();
if (eventQueueByType.contains(EventType::name)) { if (eventQueueByType.contains(EventType::type)) {
eventQueueByType.erase(EventType::name); eventQueueByType.erase(EventType::type);
} }
} }
@@ -217,15 +246,15 @@ namespace Bloom
auto queueLock = this->eventQueueByEventType.acquireLock(); auto queueLock = this->eventQueueByEventType.acquireLock();
auto& eventQueueByType = this->eventQueueByEventType.getReference(); auto& eventQueueByType = this->eventQueueByEventType.getReference();
auto eventTypeNames = std::set<std::string>({EventTypeA::name}); auto eventTypes = std::set<Events::EventType>({EventTypeA::type});
auto eventTypeNamesToDeRegister = std::set<std::string>(); auto eventTypesToDeRegister = std::set<Events::EventType>();
if constexpr (!std::is_same_v<EventTypeA, EventTypeB>) { if constexpr (!std::is_same_v<EventTypeA, EventTypeB>) {
static_assert( static_assert(
std::is_base_of_v<Events::Event, EventTypeB>, std::is_base_of_v<Events::Event, EventTypeB>,
"All event types must be derived from the Event base class." "All event types must be derived from the Event base class."
); );
eventTypeNames.insert(EventTypeB::name); eventTypes.insert(EventTypeB::type);
} }
if constexpr (!std::is_same_v<EventTypeB, EventTypeC>) { if constexpr (!std::is_same_v<EventTypeB, EventTypeC>) {
@@ -233,28 +262,28 @@ namespace Bloom
std::is_base_of_v<Events::Event, EventTypeC>, std::is_base_of_v<Events::Event, EventTypeC>,
"All event types must be derived from the Event base class." "All event types must be derived from the Event base class."
); );
eventTypeNames.insert(EventTypeC::name); eventTypes.insert(EventTypeC::type);
} }
{ {
auto registeredEventTypesLock = this->registeredEventTypes.acquireLock(); auto registeredEventTypesLock = this->registeredEventTypes.acquireLock();
auto& registeredEventTypes = this->registeredEventTypes.getReference(); auto& registeredEventTypes = this->registeredEventTypes.getReference();
for (const auto& eventTypeName : eventTypeNames) { for (const auto& eventType : eventTypes) {
if (registeredEventTypes.find(eventTypeName) == registeredEventTypes.end()) { if (!registeredEventTypes.contains(eventType)) {
registeredEventTypes.insert(eventTypeName); registeredEventTypes.insert(eventType);
eventTypeNamesToDeRegister.insert(eventTypeName); eventTypesToDeRegister.insert(eventType);
} }
} }
} }
Events::SharedGenericEventPointer foundEvent = nullptr; Events::SharedGenericEventPointer foundEvent = nullptr;
auto eventsFound = [&eventTypeNames, &eventQueueByType, &correlationId, &foundEvent]() -> bool { auto eventsFound = [&eventTypes, &eventQueueByType, &correlationId, &foundEvent]() -> bool {
for (const auto& eventTypeName : eventTypeNames) { for (const auto& eventType : eventTypes) {
if (eventQueueByType.find(eventTypeName) != eventQueueByType.end() if (eventQueueByType.find(eventType) != eventQueueByType.end()
&& !eventQueueByType.find(eventTypeName)->second.empty() && !eventQueueByType.find(eventType)->second.empty()
) { ) {
auto& queue = eventQueueByType.find(eventTypeName)->second; auto& queue = eventQueueByType.find(eventType)->second;
while (!queue.empty()) { while (!queue.empty()) {
auto event = queue.front(); auto event = queue.front();
@@ -266,7 +295,7 @@ namespace Bloom
return true; return true;
} }
// Events that match in type but not correlation ID are disregarded // Events that match in type but not correlation ID are discarded
queue.pop(); queue.pop();
} }
} }
@@ -282,25 +311,25 @@ namespace Bloom
this->eventQueueByEventTypeCV.wait(queueLock, eventsFound); this->eventQueueByEventTypeCV.wait(queueLock, eventsFound);
} }
if (!eventTypeNamesToDeRegister.empty()) { if (!eventTypesToDeRegister.empty()) {
auto registeredEventTypesLock = this->registeredEventTypes.acquireLock(); auto registeredEventTypesLock = this->registeredEventTypes.acquireLock();
auto& registeredEventTypes = this->registeredEventTypes.getReference(); auto& registeredEventTypes = this->registeredEventTypes.getReference();
for (const auto& eventTypeName : eventTypeNamesToDeRegister) { for (const auto& eventType : eventTypesToDeRegister) {
registeredEventTypes.erase(eventTypeName); registeredEventTypes.erase(eventType);
} }
} }
if (foundEvent != nullptr) { if (foundEvent != nullptr) {
// If we're looking for multiple event types, use an std::variant. // If we're looking for multiple event types, use an std::variant.
if constexpr (!std::is_same_v<EventTypeA, EventTypeB> || !std::is_same_v<EventTypeB, EventTypeC>) { if constexpr (!std::is_same_v<EventTypeA, EventTypeB> || !std::is_same_v<EventTypeB, EventTypeC>) {
if (foundEvent->getName() == EventTypeA::name) { if (foundEvent->getType() == EventTypeA::type) {
output = std::optional<typename decltype(output)::value_type>( output = std::optional<typename decltype(output)::value_type>(
std::dynamic_pointer_cast<const EventTypeA>(foundEvent) std::dynamic_pointer_cast<const EventTypeA>(foundEvent)
); );
} else if constexpr (!std::is_same_v<EventTypeA, EventTypeB>) { } else if constexpr (!std::is_same_v<EventTypeA, EventTypeB>) {
if (foundEvent->getName() == EventTypeB::name) { if (foundEvent->getType() == EventTypeB::type) {
output = std::optional<typename decltype(output)::value_type>( output = std::optional<typename decltype(output)::value_type>(
std::dynamic_pointer_cast<const EventTypeB>(foundEvent) std::dynamic_pointer_cast<const EventTypeB>(foundEvent)
); );
@@ -308,7 +337,7 @@ namespace Bloom
} }
if constexpr (!std::is_same_v<EventTypeB, EventTypeC>) { if constexpr (!std::is_same_v<EventTypeB, EventTypeC>) {
if (foundEvent->getName() == EventTypeC::name) { if (foundEvent->getType() == EventTypeC::type) {
output = std::optional<typename decltype(output)::value_type>( output = std::optional<typename decltype(output)::value_type>(
std::dynamic_pointer_cast<const EventTypeC>(foundEvent) std::dynamic_pointer_cast<const EventTypeC>(foundEvent)
); );
@@ -316,7 +345,7 @@ namespace Bloom
} }
} else { } else {
if (foundEvent->getName() == EventTypeA::name) { if (foundEvent->getType() == EventTypeA::type) {
output = std::dynamic_pointer_cast<const EventTypeA>(foundEvent); output = std::dynamic_pointer_cast<const EventTypeA>(foundEvent);
} }
} }

View File

@@ -14,10 +14,9 @@ void EventManager::deregisterListener(size_t listenerId) {
void EventManager::triggerEvent(const std::shared_ptr<const Events::Event>& event) { void EventManager::triggerEvent(const std::shared_ptr<const Events::Event>& event) {
auto registerListenersLock = std::unique_lock(this->registerListenerMutex); auto registerListenersLock = std::unique_lock(this->registerListenerMutex);
for(auto const& [listenerId, listener] : this->registeredListeners) {
auto registeredEventTypes = listener->getRegisteredEventTypeNames();
if (registeredEventTypes.contains(event->getName())) { for(auto const& [listenerId, listener] : this->registeredListeners) {
if (listener->isEventTypeRegistered(event->getType())) {
listener->registerEvent(event); listener->registerEvent(event);
} }
} }

View File

@@ -9,8 +9,13 @@ namespace Bloom::Events
class BreakpointRemovedOnTarget: public Event class BreakpointRemovedOnTarget: public Event
{ {
public: public:
static inline EventType type = EventType::BREAKPOINT_REMOVED_ON_TARGET;
static inline const std::string name = "BreakpointRemovedOnTarget"; static inline const std::string name = "BreakpointRemovedOnTarget";
[[nodiscard]] EventType getType() const override {
return BreakpointRemovedOnTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return BreakpointRemovedOnTarget::name; return BreakpointRemovedOnTarget::name;
} }

View File

@@ -9,8 +9,13 @@ namespace Bloom::Events
class BreakpointSetOnTarget: public Event class BreakpointSetOnTarget: public Event
{ {
public: public:
static inline EventType type = EventType::BREAKPOINT_SET_ON_TARGET;
static inline const std::string name = "BreakpointSetOnTarget"; static inline const std::string name = "BreakpointSetOnTarget";
[[nodiscard]] EventType getType() const override {
return BreakpointSetOnTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return BreakpointSetOnTarget::name; return BreakpointSetOnTarget::name;
} }

View File

@@ -12,9 +12,14 @@ namespace Bloom::Events
private: private:
ThreadState state; ThreadState state;
public: public:
static inline EventType type = EventType::DEBUG_SERVER_THREAD_STATE_CHANGED;
static inline const std::string name = "DebugServerThreadStateChanged";
explicit DebugServerThreadStateChanged(ThreadState state): state(state) {}; explicit DebugServerThreadStateChanged(ThreadState state): state(state) {};
static inline const std::string name = "DebugServerThreadStateChanged"; [[nodiscard]] EventType getType() const override {
return DebugServerThreadStateChanged::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return DebugServerThreadStateChanged::name; return DebugServerThreadStateChanged::name;

View File

@@ -9,8 +9,13 @@ namespace Bloom::Events
class DebugSessionFinished: public Event class DebugSessionFinished: public Event
{ {
public: public:
static inline EventType type = EventType::DEBUG_SESSION_FINISHED;
static inline const std::string name = "DebugSessionFinished"; static inline const std::string name = "DebugSessionFinished";
[[nodiscard]] EventType getType() const override {
return DebugSessionFinished::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return DebugSessionFinished::name; return DebugSessionFinished::name;
} }

View File

@@ -9,8 +9,13 @@ namespace Bloom::Events
class DebugSessionStarted: public Event class DebugSessionStarted: public Event
{ {
public: public:
static inline EventType type = EventType::DEBUG_SESSION_STARTED;
static inline const std::string name = "DebugSessionStarted"; static inline const std::string name = "DebugSessionStarted";
[[nodiscard]] EventType getType() const override {
return DebugSessionStarted::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return DebugSessionStarted::name; return DebugSessionStarted::name;
} }

View File

@@ -4,6 +4,7 @@
#include <memory> #include <memory>
#include <atomic> #include <atomic>
#include <optional> #include <optional>
#include <cstdint>
#include "src/Helpers/DateTime.hpp" #include "src/Helpers/DateTime.hpp"
@@ -11,6 +12,48 @@ namespace Bloom::Events
{ {
static_assert(std::atomic<int>::is_always_lock_free); static_assert(std::atomic<int>::is_always_lock_free);
enum EventType: std::uint16_t
{
GENERIC,
STOP_TARGET_EXECUTION,
RESUME_TARGET_EXECUTION,
RESET_TARGET,
DEBUG_SESSION_STARTED,
DEBUG_SESSION_FINISHED,
TARGET_CONTROLLER_THREAD_STATE_CHANGED,
REPORT_TARGET_CONTROLLER_STATE,
TARGET_CONTROLLER_STATE_REPORTED,
SHUTDOWN_TARGET_CONTROLLER,
TARGET_CONTROLLER_ERROR_OCCURRED,
SHUTDOWN_APPLICATION,
DEBUG_SERVER_THREAD_STATE_CHANGED,
SHUTDOWN_DEBUG_SERVER,
RETRIEVE_REGISTERS_FROM_TARGET,
REGISTERS_RETRIEVED_FROM_TARGET,
WRITE_REGISTERS_TO_TARGET,
REGISTERS_WRITTEN_TO_TARGET,
TARGET_EXECUTION_RESUMED,
TARGET_EXECUTION_STOPPED,
RETRIEVE_MEMORY_FROM_TARGET,
MEMORY_RETRIEVED_FROM_TARGET,
WRITE_MEMORY_TO_TARGET,
MEMORY_WRITTEN_TO_TARGET,
SET_BREAKPOINT_ON_TARGET,
REMOVE_BREAKPOINT_ON_TARGET,
BREAKPOINT_SET_ON_TARGET,
BREAKPOINT_REMOVED_ON_TARGET,
STEP_TARGET_EXECUTION,
SET_PROGRAM_COUNTER_ON_TARGET,
PROGRAM_COUNTER_SET_ON_TARGET,
EXTRACT_TARGET_DESCRIPTOR,
TARGET_DESCRIPTOR_EXTRACTED,
INSIGHT_THREAD_STATE_CHANGED,
RETRIEVE_TARGET_PIN_STATES,
TARGET_PIN_STATES_RETRIEVED,
SET_TARGET_PIN_STATE,
TARGET_IO_PORTS_UPDATED,
};
class Event class Event
{ {
private: private:
@@ -21,10 +64,15 @@ namespace Bloom::Events
QDateTime createdTimestamp = DateTime::currentDateTime(); QDateTime createdTimestamp = DateTime::currentDateTime();
std::optional<int> correlationId; std::optional<int> correlationId;
static inline EventType type = EventType::GENERIC;
static inline const std::string name = "GenericEvent"; static inline const std::string name = "GenericEvent";
[[nodiscard]] virtual std::string getName() const { [[nodiscard]] virtual std::string getName() const {
return Event::name; return Event::name;
} }
[[nodiscard]] virtual EventType getType() const {
return Event::type;
}
}; };
} }

View File

@@ -46,5 +46,8 @@ namespace Bloom::Events
template <class EventType> template <class EventType>
using SharedEventPointer = std::shared_ptr<const EventType>; using SharedEventPointer = std::shared_ptr<const EventType>;
template <class EventType>
using SharedEventPointerNonConst = std::shared_ptr<EventType>;
using SharedGenericEventPointer = SharedEventPointer<Event>; using SharedGenericEventPointer = SharedEventPointer<Event>;
} }

View File

@@ -4,13 +4,22 @@
#include "Event.hpp" #include "Event.hpp"
#include "TargetDescriptorExtracted.hpp"
namespace Bloom::Events namespace Bloom::Events
{ {
class ExtractTargetDescriptor: public Event class ExtractTargetDescriptor: public Event
{ {
public: public:
using TargetControllerResponseType = TargetDescriptorExtracted;
static inline EventType type = EventType::EXTRACT_TARGET_DESCRIPTOR;
static inline const std::string name = "ExtractTargetDescriptor"; static inline const std::string name = "ExtractTargetDescriptor";
[[nodiscard]] EventType getType() const override {
return ExtractTargetDescriptor::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return ExtractTargetDescriptor::name; return ExtractTargetDescriptor::name;
} }

View File

@@ -11,11 +11,17 @@ namespace Bloom::Events
{ {
private: private:
ThreadState state; ThreadState state;
public: public:
explicit InsightThreadStateChanged(ThreadState state): state(state) {}; explicit InsightThreadStateChanged(ThreadState state): state(state) {};
static inline EventType type = EventType::INSIGHT_THREAD_STATE_CHANGED;
static inline const std::string name = "InsightThreadStateChanged"; static inline const std::string name = "InsightThreadStateChanged";
[[nodiscard]] EventType getType() const override {
return InsightThreadStateChanged::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return InsightThreadStateChanged::name; return InsightThreadStateChanged::name;
} }

View File

@@ -10,9 +10,14 @@ namespace Bloom::Events
class MemoryRetrievedFromTarget: public Event class MemoryRetrievedFromTarget: public Event
{ {
public: public:
static inline EventType type = EventType::MEMORY_RETRIEVED_FROM_TARGET;
static inline const std::string name = "MemoryRetrievedFromTarget"; static inline const std::string name = "MemoryRetrievedFromTarget";
Targets::TargetMemoryBuffer data; Targets::TargetMemoryBuffer data;
[[nodiscard]] EventType getType() const override {
return MemoryRetrievedFromTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return MemoryRetrievedFromTarget::name; return MemoryRetrievedFromTarget::name;
} }

View File

@@ -10,12 +10,17 @@ namespace Bloom::Events
class MemoryWrittenToTarget: public Event class MemoryWrittenToTarget: public Event
{ {
public: public:
static inline EventType type = EventType::MEMORY_WRITTEN_TO_TARGET;
static inline const std::string name = "MemoryWrittenToTarget"; static inline const std::string name = "MemoryWrittenToTarget";
MemoryWrittenToTarget() = default;
[[nodiscard]] EventType getType() const override {
return MemoryWrittenToTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return MemoryWrittenToTarget::name; return MemoryWrittenToTarget::name;
} }
MemoryWrittenToTarget() = default;
}; };
} }

View File

@@ -9,8 +9,13 @@ namespace Bloom::Events
class ProgramCounterSetOnTarget: public Event class ProgramCounterSetOnTarget: public Event
{ {
public: public:
static inline EventType type = EventType::PROGRAM_COUNTER_SET_ON_TARGET;
static inline const std::string name = "ProgramCounterSetOnTarget"; static inline const std::string name = "ProgramCounterSetOnTarget";
[[nodiscard]] EventType getType() const override {
return ProgramCounterSetOnTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return ProgramCounterSetOnTarget::name; return ProgramCounterSetOnTarget::name;
} }

View File

@@ -10,9 +10,14 @@ namespace Bloom::Events
class RegistersRetrievedFromTarget: public Event class RegistersRetrievedFromTarget: public Event
{ {
public: public:
static inline EventType type = EventType::REGISTERS_RETRIEVED_FROM_TARGET;
static inline const std::string name = "RegistersRetrievedFromTarget"; static inline const std::string name = "RegistersRetrievedFromTarget";
Targets::TargetRegisters registers; Targets::TargetRegisters registers;
[[nodiscard]] EventType getType() const override {
return RegistersRetrievedFromTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return RegistersRetrievedFromTarget::name; return RegistersRetrievedFromTarget::name;
} }

View File

@@ -9,8 +9,13 @@ namespace Bloom::Events
class RegistersWrittenToTarget: public Event class RegistersWrittenToTarget: public Event
{ {
public: public:
static inline EventType type = EventType::REGISTERS_WRITTEN_TO_TARGET;
static inline const std::string name = "RegistersWrittenToTarget"; static inline const std::string name = "RegistersWrittenToTarget";
[[nodiscard]] EventType getType() const override {
return RegistersWrittenToTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return RegistersWrittenToTarget::name; return RegistersWrittenToTarget::name;
} }

View File

@@ -11,9 +11,14 @@ namespace Bloom::Events
class RemoveBreakpointOnTarget: public Event class RemoveBreakpointOnTarget: public Event
{ {
public: public:
static inline EventType type = EventType::REMOVE_BREAKPOINT_ON_TARGET;
static inline const std::string name = "RemoveBreakpointOnTarget"; static inline const std::string name = "RemoveBreakpointOnTarget";
Targets::TargetBreakpoint breakpoint; Targets::TargetBreakpoint breakpoint;
[[nodiscard]] EventType getType() const override {
return RemoveBreakpointOnTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return RemoveBreakpointOnTarget::name; return RemoveBreakpointOnTarget::name;
} }

View File

@@ -9,9 +9,14 @@ namespace Bloom::Events
class ReportTargetControllerState: public Event class ReportTargetControllerState: public Event
{ {
public: public:
static inline EventType type = EventType::REPORT_TARGET_CONTROLLER_STATE;
static inline const std::string name = "ReportTargetControllerState";
ReportTargetControllerState() {}; ReportTargetControllerState() {};
static inline const std::string name = "ReportTargetControllerState"; [[nodiscard]] EventType getType() const override {
return ReportTargetControllerState::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return ReportTargetControllerState::name; return ReportTargetControllerState::name;

View File

@@ -9,8 +9,13 @@ namespace Bloom::Events
class ResetTarget: public Event class ResetTarget: public Event
{ {
public: public:
static inline EventType type = EventType::RESET_TARGET;
static inline const std::string name = "ResetTargetEvent"; static inline const std::string name = "ResetTargetEvent";
[[nodiscard]] EventType getType() const override {
return ResetTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return ResetTarget::name; return ResetTarget::name;
} }

View File

@@ -10,14 +10,19 @@ namespace Bloom::Events
class ResumeTargetExecution: public Event class ResumeTargetExecution: public Event
{ {
public: public:
static inline EventType type = EventType::RESUME_TARGET_EXECUTION;
static inline const std::string name = "ResumeTargetExecutionEvent"; static inline const std::string name = "ResumeTargetExecutionEvent";
std::optional<std::uint32_t> fromProgramCounter; std::optional<std::uint32_t> fromProgramCounter;
ResumeTargetExecution() = default;
explicit ResumeTargetExecution(std::uint32_t fromProgramCounter): fromProgramCounter(fromProgramCounter) {};
[[nodiscard]] EventType getType() const override {
return ResumeTargetExecution::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return ResumeTargetExecution::name; return ResumeTargetExecution::name;
} }
ResumeTargetExecution() = default;
explicit ResumeTargetExecution(std::uint32_t fromProgramCounter): fromProgramCounter(fromProgramCounter) {};
}; };
} }

View File

@@ -11,11 +11,16 @@ namespace Bloom::Events
class RetrieveMemoryFromTarget: public Event class RetrieveMemoryFromTarget: public Event
{ {
public: public:
static inline EventType type = EventType::RETRIEVE_MEMORY_FROM_TARGET;
static inline const std::string name = "RetrieveMemoryFromTarget"; static inline const std::string name = "RetrieveMemoryFromTarget";
Targets::TargetMemoryType memoryType = Targets::TargetMemoryType::RAM; Targets::TargetMemoryType memoryType = Targets::TargetMemoryType::RAM;
std::uint32_t startAddress = 0; std::uint32_t startAddress = 0;
std::uint32_t bytes = 0; std::uint32_t bytes = 0;
[[nodiscard]] EventType getType() const override {
return RetrieveMemoryFromTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return RetrieveMemoryFromTarget::name; return RetrieveMemoryFromTarget::name;
} }

View File

@@ -10,9 +10,14 @@ namespace Bloom::Events
class RetrieveRegistersFromTarget: public Event class RetrieveRegistersFromTarget: public Event
{ {
public: public:
static inline EventType type = EventType::RETRIEVE_REGISTERS_FROM_TARGET;
static inline const std::string name = "RetrieveRegistersFromTarget"; static inline const std::string name = "RetrieveRegistersFromTarget";
Targets::TargetRegisterDescriptors descriptors; Targets::TargetRegisterDescriptors descriptors;
[[nodiscard]] EventType getType() const override {
return RetrieveRegistersFromTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return RetrieveRegistersFromTarget::name; return RetrieveRegistersFromTarget::name;
} }

View File

@@ -9,9 +9,14 @@ namespace Bloom::Events
class RetrieveTargetPinStates: public Event class RetrieveTargetPinStates: public Event
{ {
public: public:
static inline EventType type = EventType::RETRIEVE_TARGET_PIN_STATES;
static inline const std::string name = "RetrieveTargetPinStates"; static inline const std::string name = "RetrieveTargetPinStates";
int variantId = 0; int variantId = 0;
[[nodiscard]] EventType getType() const override {
return RetrieveTargetPinStates::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return RetrieveTargetPinStates::name; return RetrieveTargetPinStates::name;
} }

View File

@@ -11,9 +11,14 @@ namespace Bloom::Events
class SetBreakpointOnTarget: public Event class SetBreakpointOnTarget: public Event
{ {
public: public:
static inline EventType type = EventType::SET_BREAKPOINT_ON_TARGET;
static inline const std::string name = "SetBreakpointOnTarget"; static inline const std::string name = "SetBreakpointOnTarget";
Targets::TargetBreakpoint breakpoint; Targets::TargetBreakpoint breakpoint;
[[nodiscard]] EventType getType() const override {
return SetBreakpointOnTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return SetBreakpointOnTarget::name; return SetBreakpointOnTarget::name;
} }

View File

@@ -10,9 +10,14 @@ namespace Bloom::Events
class SetProgramCounterOnTarget: public Event class SetProgramCounterOnTarget: public Event
{ {
public: public:
static inline EventType type = EventType::SET_PROGRAM_COUNTER_ON_TARGET;
static inline const std::string name = "SetProgramCounterOnTarget"; static inline const std::string name = "SetProgramCounterOnTarget";
std::uint32_t address = 0; std::uint32_t address = 0;
[[nodiscard]] EventType getType() const override {
return SetProgramCounterOnTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return SetProgramCounterOnTarget::name; return SetProgramCounterOnTarget::name;
} }

View File

@@ -10,11 +10,16 @@ namespace Bloom::Events
class SetTargetPinState: public Event class SetTargetPinState: public Event
{ {
public: public:
static inline EventType type = EventType::SET_TARGET_PIN_STATE;
static inline const std::string name = "SetTargetPinState"; static inline const std::string name = "SetTargetPinState";
int variantId = 0; int variantId = 0;
Targets::TargetPinDescriptor pinDescriptor; Targets::TargetPinDescriptor pinDescriptor;
Targets::TargetPinState pinState; Targets::TargetPinState pinState;
[[nodiscard]] EventType getType() const override {
return SetTargetPinState::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return SetTargetPinState::name; return SetTargetPinState::name;
} }

View File

@@ -9,8 +9,13 @@ namespace Bloom::Events
class ShutdownApplication: public Event class ShutdownApplication: public Event
{ {
public: public:
static inline EventType type = EventType::SHUTDOWN_APPLICATION;
static inline const std::string name = "ShutdownApplicationEvent"; static inline const std::string name = "ShutdownApplicationEvent";
[[nodiscard]] EventType getType() const override {
return ShutdownApplication::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return ShutdownApplication::name; return ShutdownApplication::name;
} }

View File

@@ -9,8 +9,13 @@ namespace Bloom::Events
class ShutdownDebugServer: public Event class ShutdownDebugServer: public Event
{ {
public: public:
static inline EventType type = EventType::SHUTDOWN_DEBUG_SERVER;
static inline const std::string name = "ShutdownDebugServer"; static inline const std::string name = "ShutdownDebugServer";
[[nodiscard]] EventType getType() const override {
return ShutdownDebugServer::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return ShutdownDebugServer::name; return ShutdownDebugServer::name;
} }

View File

@@ -9,8 +9,13 @@ namespace Bloom::Events
class ShutdownTargetController: public Event class ShutdownTargetController: public Event
{ {
public: public:
static inline EventType type = EventType::SHUTDOWN_TARGET_CONTROLLER;
static inline const std::string name = "ShutdownTargetControllerEvent"; static inline const std::string name = "ShutdownTargetControllerEvent";
[[nodiscard]] EventType getType() const override {
return ShutdownTargetController::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return ShutdownTargetController::name; return ShutdownTargetController::name;
} }

View File

@@ -10,14 +10,19 @@ namespace Bloom::Events
class StepTargetExecution: public Event class StepTargetExecution: public Event
{ {
public: public:
static inline EventType type = EventType::STEP_TARGET_EXECUTION;
static inline const std::string name = "StepTargetExecution"; static inline const std::string name = "StepTargetExecution";
std::optional<std::uint32_t> fromProgramCounter; std::optional<std::uint32_t> fromProgramCounter;
StepTargetExecution() = default;
explicit StepTargetExecution(std::uint32_t fromProgramCounter): fromProgramCounter(fromProgramCounter) {};
[[nodiscard]] EventType getType() const override {
return StepTargetExecution::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return StepTargetExecution::name; return StepTargetExecution::name;
} }
StepTargetExecution() = default;
explicit StepTargetExecution(std::uint32_t fromProgramCounter): fromProgramCounter(fromProgramCounter) {};
}; };
} }

View File

@@ -9,7 +9,12 @@ namespace Bloom::Events
class StopTargetExecution: public Event class StopTargetExecution: public Event
{ {
public: public:
static inline const std::string name = "StopTargetEvent"; static inline EventType type = EventType::STOP_TARGET_EXECUTION;
static inline const std::string name = "StopTargetExecution";
[[nodiscard]] EventType getType() const override {
return StopTargetExecution::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return StopTargetExecution::name; return StopTargetExecution::name;

View File

@@ -9,10 +9,15 @@ namespace Bloom::Events
class TargetControllerErrorOccurred: public Event class TargetControllerErrorOccurred: public Event
{ {
public: public:
static inline EventType type = EventType::TARGET_CONTROLLER_ERROR_OCCURRED;
static inline const std::string name = "TargetControllerErrorOccurred"; static inline const std::string name = "TargetControllerErrorOccurred";
TargetControllerErrorOccurred() = default; TargetControllerErrorOccurred() = default;
[[nodiscard]] EventType getType() const override {
return TargetControllerErrorOccurred::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return TargetControllerErrorOccurred::name; return TargetControllerErrorOccurred::name;
} }

View File

@@ -10,11 +10,15 @@ namespace Bloom::Events
class TargetControllerStateReported: public Event class TargetControllerStateReported: public Event
{ {
public: public:
TargetControllerState state; static inline EventType type = EventType::TARGET_CONTROLLER_STATE_REPORTED;
static inline const std::string name = "TargetControllerStateReported";
TargetControllerState state;
explicit TargetControllerStateReported(TargetControllerState state): state(state) {}; explicit TargetControllerStateReported(TargetControllerState state): state(state) {};
static inline const std::string name = "TargetControllerStateReported"; [[nodiscard]] EventType getType() const override {
return TargetControllerStateReported::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return TargetControllerStateReported::name; return TargetControllerStateReported::name;

View File

@@ -13,9 +13,14 @@ namespace Bloom::Events
ThreadState state; ThreadState state;
public: public:
static inline EventType type = EventType::TARGET_CONTROLLER_THREAD_STATE_CHANGED;
static inline const std::string name = "TargetControllerThreadStateChanged";
explicit TargetControllerThreadStateChanged(ThreadState state): state(state) {}; explicit TargetControllerThreadStateChanged(ThreadState state): state(state) {};
static inline const std::string name = "TargetControllerThreadStateChanged"; [[nodiscard]] EventType getType() const override {
return TargetControllerThreadStateChanged::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return TargetControllerThreadStateChanged::name; return TargetControllerThreadStateChanged::name;

View File

@@ -10,9 +10,14 @@ namespace Bloom::Events
class TargetDescriptorExtracted: public Event class TargetDescriptorExtracted: public Event
{ {
public: public:
static inline EventType type = EventType::TARGET_DESCRIPTOR_EXTRACTED;
static inline const std::string name = "TargetDescriptorExtracted"; static inline const std::string name = "TargetDescriptorExtracted";
Targets::TargetDescriptor targetDescriptor; Targets::TargetDescriptor targetDescriptor;
[[nodiscard]] EventType getType() const override {
return TargetDescriptorExtracted::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return TargetDescriptorExtracted::name; return TargetDescriptorExtracted::name;
} }

View File

@@ -9,10 +9,15 @@ namespace Bloom::Events
class TargetExecutionResumed: public Event class TargetExecutionResumed: public Event
{ {
public: public:
static inline EventType type = EventType::TARGET_EXECUTION_RESUMED;
static inline const std::string name = "TargetExecutionResumed"; static inline const std::string name = "TargetExecutionResumed";
TargetExecutionResumed() = default; TargetExecutionResumed() = default;
[[nodiscard]] EventType getType() const override {
return TargetExecutionResumed::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return TargetExecutionResumed::name; return TargetExecutionResumed::name;
} }

View File

@@ -11,6 +11,7 @@ namespace Bloom::Events
class TargetExecutionStopped: public Event class TargetExecutionStopped: public Event
{ {
public: public:
static inline EventType type = EventType::TARGET_EXECUTION_STOPPED;
static inline const std::string name = "TargetExecutionStopped"; static inline const std::string name = "TargetExecutionStopped";
std::uint32_t programCounter; std::uint32_t programCounter;
Targets::TargetBreakCause breakCause; Targets::TargetBreakCause breakCause;
@@ -18,6 +19,10 @@ namespace Bloom::Events
TargetExecutionStopped(std::uint32_t programCounter, Targets::TargetBreakCause breakCause) : TargetExecutionStopped(std::uint32_t programCounter, Targets::TargetBreakCause breakCause) :
programCounter(programCounter), breakCause(breakCause) {} programCounter(programCounter), breakCause(breakCause) {}
[[nodiscard]] EventType getType() const override {
return TargetExecutionStopped::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return TargetExecutionStopped::name; return TargetExecutionStopped::name;
} }

View File

@@ -9,8 +9,13 @@ namespace Bloom::Events
class TargetIoPortsUpdated: public Event class TargetIoPortsUpdated: public Event
{ {
public: public:
static inline EventType type = EventType::TARGET_IO_PORTS_UPDATED;
static inline const std::string name = "TargetIoPortsUpdated"; static inline const std::string name = "TargetIoPortsUpdated";
[[nodiscard]] EventType getType() const override {
return TargetIoPortsUpdated::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return TargetIoPortsUpdated::name; return TargetIoPortsUpdated::name;
} }

View File

@@ -11,10 +11,15 @@ namespace Bloom::Events
class TargetPinStatesRetrieved: public Event class TargetPinStatesRetrieved: public Event
{ {
public: public:
static inline EventType type = EventType::TARGET_PIN_STATES_RETRIEVED;
static inline const std::string name = "TargetPinStatesRetrieved"; static inline const std::string name = "TargetPinStatesRetrieved";
int variantId = 0; int variantId = 0;
std::map<int, Targets::TargetPinState> pinSatesByNumber; std::map<int, Targets::TargetPinState> pinSatesByNumber;
[[nodiscard]] EventType getType() const override {
return TargetPinStatesRetrieved::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return TargetPinStatesRetrieved::name; return TargetPinStatesRetrieved::name;
} }

View File

@@ -12,20 +12,25 @@ namespace Bloom::Events
class WriteMemoryToTarget: public Event class WriteMemoryToTarget: public Event
{ {
public: public:
static inline EventType type = EventType::WRITE_MEMORY_TO_TARGET;
static inline const std::string name = "WriteMemoryToTarget"; static inline const std::string name = "WriteMemoryToTarget";
Targets::TargetMemoryType memoryType = Targets::TargetMemoryType::RAM; Targets::TargetMemoryType memoryType = Targets::TargetMemoryType::RAM;
std::uint32_t startAddress = 0; std::uint32_t startAddress = 0;
Targets::TargetMemoryBuffer buffer; Targets::TargetMemoryBuffer buffer;
[[nodiscard]] std::string getName() const override {
return WriteMemoryToTarget::name;
}
WriteMemoryToTarget() = default; WriteMemoryToTarget() = default;
WriteMemoryToTarget( WriteMemoryToTarget(
Targets::TargetMemoryType memoryType, Targets::TargetMemoryType memoryType,
std::uint32_t startAddress, std::uint32_t startAddress,
Targets::TargetMemoryBuffer buffer Targets::TargetMemoryBuffer buffer
): memoryType(memoryType), startAddress(startAddress), buffer(std::move(buffer)) {}; ): memoryType(memoryType), startAddress(startAddress), buffer(std::move(buffer)) {};
[[nodiscard]] EventType getType() const override {
return WriteMemoryToTarget::type;
}
[[nodiscard]] std::string getName() const override {
return WriteMemoryToTarget::name;
}
}; };
} }

View File

@@ -11,14 +11,19 @@ namespace Bloom::Events
class WriteRegistersToTarget: public Event class WriteRegistersToTarget: public Event
{ {
public: public:
static inline EventType type = EventType::WRITE_REGISTERS_TO_TARGET;
static inline const std::string name = "WriteRegistersToTarget"; static inline const std::string name = "WriteRegistersToTarget";
Targets::TargetRegisters registers; Targets::TargetRegisters registers;
WriteRegistersToTarget() = default;
explicit WriteRegistersToTarget(Targets::TargetRegisters registers): registers(std::move(registers)) {};
[[nodiscard]] EventType getType() const override {
return WriteRegistersToTarget::type;
}
[[nodiscard]] std::string getName() const override { [[nodiscard]] std::string getName() const override {
return WriteRegistersToTarget::name; return WriteRegistersToTarget::name;
} }
WriteRegistersToTarget() = default;
explicit WriteRegistersToTarget(Targets::TargetRegisters registers): registers(std::move(registers)) {};
}; };
} }