Add/Remove event signals by event name
Using the event name as the key, each signal trigger an event subscribes
to is added to the list of signals for that event only. This later
simplifies removal of those subscribed signals if the event is removed.
Change-Id: I8c5f7b01e69e995647408eeb41397d6160beb079
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/zone.cpp b/control/zone.cpp
index 3a0b48b..3077f08 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -335,17 +335,18 @@
void Zone::removeEvent(const SetSpeedEvent& event)
{
- // Remove triggers of the event
- for (auto& trig : std::get<triggerPos>(event))
+ // Remove event signals
+ auto sigIter = _signalEvents.find(std::get<sseNamePos>(event));
+ if (sigIter != _signalEvents.end())
{
- auto it = findSignal(trig,
- std::get<groupPos>(event),
- std::get<actionsPos>(event));
- if (it != std::end(getSignalEvents()))
+ auto& signals = sigIter->second;
+ for (auto it = signals.begin(); it != signals.end(); ++it)
{
removeSignal(it);
}
+ _signalEvents.erase(sigIter);
}
+
// Remove timers of the event
auto it = findTimer(std::get<groupPos>(event),
std::get<actionsPos>(event));
@@ -355,39 +356,6 @@
}
}
-std::vector<SignalEvent>::iterator Zone::findSignal(
- const Trigger& signal,
- const Group& eGroup,
- const std::vector<Action>& eActions)
-{
- // Find the signal in the event to be removed
- for (auto it = _signalEvents.begin(); it != _signalEvents.end(); ++ it)
- {
- const auto& seEventData = *std::get<signalEventDataPos>(*it);
- if (eGroup == std::get<eventGroupPos>(seEventData) &&
- eActions.size() == std::get<eventActionsPos>(seEventData).size())
- {
- // TODO openbmc/openbmc#2328 - Use the function target
- // for comparison
- auto actsEqual = [](auto const& a1,
- auto const& a2)
- {
- return a1.target_type().name() ==
- a2.target_type().name();
- };
- if (std::equal(eActions.begin(),
- eActions.end(),
- std::get<eventActionsPos>(seEventData).begin(),
- actsEqual))
- {
- return it;
- }
- }
- }
-
- return _signalEvents.end();
-}
-
std::vector<TimerEvent>::iterator Zone::findTimer(
const Group& eventGroup,
const std::vector<Action>& eventActions)