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/triggers.cpp b/control/triggers.cpp
index 410732d..706fdc1 100644
--- a/control/triggers.cpp
+++ b/control/triggers.cpp
@@ -75,7 +75,7 @@
                 }
             }
         }
-        zone.addSignal(std::move(eventData), std::move(mPtr));
+        zone.addSignal(name, std::move(eventData), std::move(mPtr));
     };
 }
 
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)
diff --git a/control/zone.hpp b/control/zone.hpp
index 59f9743..e28e02b 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -412,43 +412,17 @@
         }
 
         /**
-         * @brief Get the list of signal events
-         *
-         * @return - List of signal events
-         */
-        inline auto& getSignalEvents()
-        {
-            return _signalEvents;
-        }
-
-        /**
-         * @brief Find the first instance of a signal event
-         *
-         * @param[in] signal - Event signal to find
-         * @param[in] eGroup - Group associated with the signal
-         * @param[in] eActions - List of actions associated with the signal
-         *
-         * @return - Iterator to the stored signal event
-         */
-        std::vector<SignalEvent>::iterator findSignal(
-            const Trigger& signal,
-            const Group& eGroup,
-            const std::vector<Action>& eActions);
-
-        /**
          * @brief Remove the given signal event
          *
          * @param[in] seIter - Iterator pointing to the signal event to remove
          */
         inline void removeSignal(std::vector<SignalEvent>::iterator& seIter)
         {
-            assert(seIter != std::end(_signalEvents));
             std::get<signalEventDataPos>(*seIter).reset();
             if (std::get<signalMatchPos>(*seIter) != nullptr)
             {
                 std::get<signalMatchPos>(*seIter).reset();
             }
-            _signalEvents.erase(seIter);
         }
 
         /**
@@ -544,14 +518,16 @@
         /**
          * @brief Add a signal to the list of signal based events
          *
+         * @param[in] name - Event name
          * @param[in] data - Event data for signal
          * @param[in] match - Subscribed signal match
          */
         inline void addSignal(
+                const std::string& name,
                 std::unique_ptr<EventData>&& data,
                 std::unique_ptr<sdbusplus::server::match::match>&& match)
         {
-            _signalEvents.emplace_back(std::move(data), std::move(match));
+            _signalEvents[name].emplace_back(std::move(data), std::move(match));
         }
 
         /**
@@ -793,9 +769,10 @@
                 std::vector<std::string>>> _servTree;
 
         /**
-         * @brief List of signal event arguments and Dbus matches for callbacks
+         * @brief List of signal event arguments and Dbus matches
+         * for callbacks per event name
          */
-        std::vector<SignalEvent> _signalEvents;
+        std::map<std::string, std::vector<SignalEvent>> _signalEvents;
 
         /**
          * @brief List of timers for events