platform-mc: Support multi-handlers for polled events
platform-mc only supports one event handler for the polled events.
Update the code to allow multiple event handlers.
Change-Id: Icfb531ce89a49bb417ca94bd608442f9323810b4
Signed-off-by: Thu Nguyen <thu@os.amperecomputing.com>
diff --git a/platform-mc/event_manager.hpp b/platform-mc/event_manager.hpp
index 08ec3bc..21199e0 100644
--- a/platform-mc/event_manager.hpp
+++ b/platform-mc/event_manager.hpp
@@ -19,7 +19,8 @@
using HandlerFunc =
std::function<int(pldm_tid_t tid, uint16_t eventId,
const uint8_t* eventData, size_t eventDataSize)>;
-using EventMap = std::map<EventType, HandlerFunc>;
+using HandlerFuncs = std::vector<HandlerFunc>;
+using EventMap = std::map<EventType, HandlerFuncs>;
/**
* @brief EventManager
@@ -46,19 +47,19 @@
// Default response handler for PollForPlatFormEventMessage
registerPolledEventHandler(
PLDM_MESSAGE_POLL_EVENT,
- [this](pldm_tid_t tid, uint16_t eventId, const uint8_t* eventData,
- size_t eventDataSize) {
+ {[this](pldm_tid_t tid, uint16_t eventId, const uint8_t* eventData,
+ size_t eventDataSize) {
return this->handlePlatformEvent(tid, eventId,
PLDM_MESSAGE_POLL_EVENT,
eventData, eventDataSize);
- });
+ }});
registerPolledEventHandler(
PLDM_CPER_EVENT,
- [this](pldm_tid_t tid, uint16_t eventId, const uint8_t* eventData,
- size_t eventDataSize) {
+ {[this](pldm_tid_t tid, uint16_t eventId, const uint8_t* eventData,
+ size_t eventDataSize) {
return this->handlePlatformEvent(tid, eventId, PLDM_CPER_EVENT,
eventData, eventDataSize);
- });
+ }});
};
/** @brief Handle platform event
@@ -111,9 +112,15 @@
* PollForPlatFormEventMessage
*/
void registerPolledEventHandler(uint8_t eventClass,
- pldm::platform_mc::HandlerFunc function)
+ pldm::platform_mc::HandlerFuncs handlers)
{
- eventHandlers.insert_or_assign(eventClass, std::move(function));
+ auto [iter, inserted] = eventHandlers.try_emplace(
+ eventClass, pldm::platform_mc::HandlerFuncs{});
+
+ for (const auto& handler : handlers)
+ {
+ iter->second.emplace_back(handler);
+ }
}
protected:
@@ -202,6 +209,18 @@
uint32_t nextDataTransferHandle, uint8_t* transferOperationFlag,
uint32_t* dataTransferHandle, uint32_t* eventIdToAcknowledge);
+ /** @brief Helper function to call the event handler for polled events
+ *
+ * @param[in] tid - terminus ID
+ * @param[out] eventClass - Event class
+ * @param[out] eventId - Event ID
+ * @param[in] eventMessage - event data of response message
+ *
+ */
+ void callPolledEventHandlers(pldm_tid_t tid, uint8_t eventClass,
+ uint16_t eventId,
+ std::vector<uint8_t>& eventMessage);
+
/** @brief Reference of terminusManager */
TerminusManager& terminusManager;