Move signals to event triggers
Move the generation and initialization of signals to be included in the
available event triggers. The signal trigger consists of subscribing to
a given signal match where when the signal is received and handled, it
causes the event actions to be called.
Tested:
All current event signals are still registered and received
Speed changes occur based on temperature sensor change signals
Change-Id: Iab4ccabb50ad910d5d566bd8c1922109638bd760
Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
diff --git a/control/zone.cpp b/control/zone.cpp
index 90350a7..3e06fd0 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -319,61 +319,6 @@
void Zone::initEvent(const SetSpeedEvent& event)
{
- sdbusplus::message::message nullMsg{nullptr};
-
- for (auto& sig : std::get<signalsPos>(event))
- {
- // Setup signal matches of the property for event
- std::unique_ptr<EventData> eventData =
- std::make_unique<EventData>(
- std::get<groupPos>(event),
- std::get<sigMatchPos>(sig),
- std::get<sigHandlerPos>(sig),
- std::get<actionsPos>(event)
- );
-
- // When match is empty, handle if zone object member
- if (std::get<sigMatchPos>(sig).empty())
- {
- // Set event data for each host group member
- for (auto it = std::get<groupPos>(event).begin();
- it != std::get<groupPos>(event).end(); ++it)
- {
- if (it->first == _path)
- {
- // Group member interface in list owned by zone
- if (std::find(_ifaces.begin(), _ifaces.end(),
- std::get<intfPos>(it->second)) != _ifaces.end())
- {
- // Store path,interface,property as a managed object
- _objects[it->first]
- [std::get<intfPos>(it->second)]
- [std::get<propPos>(it->second)] =
- eventData.get();
- }
- }
- }
- }
-
- // Initialize the event signal using handler
- std::get<sigHandlerPos>(sig)(_bus, nullMsg, *this);
-
- // Subscribe to signal match
- std::unique_ptr<sdbusplus::server::match::match> match = nullptr;
- if (!std::get<sigMatchPos>(sig).empty())
- {
- match = std::make_unique<sdbusplus::server::match::match>(
- _bus,
- std::get<sigMatchPos>(sig).c_str(),
- std::bind(std::mem_fn(&Zone::handleEvent),
- this,
- std::placeholders::_1,
- eventData.get())
- );
- }
-
- _signalEvents.emplace_back(std::move(eventData), std::move(match));
- }
// Enable event triggers
std::for_each(
std::get<triggerPos>(event).begin(),
@@ -399,10 +344,10 @@
void Zone::removeEvent(const SetSpeedEvent& event)
{
- // Remove signals of the event
- for (auto& sig : std::get<signalsPos>(event))
+ // Remove triggers of the event
+ for (auto& trig : std::get<triggerPos>(event))
{
- auto it = findSignal(sig,
+ auto it = findSignal(trig,
std::get<groupPos>(event),
std::get<actionsPos>(event));
if (it != std::end(getSignalEvents()))
@@ -420,7 +365,7 @@
}
std::vector<SignalEvent>::iterator Zone::findSignal(
- const Signal& signal,
+ const Trigger& signal,
const Group& eGroup,
const std::vector<Action>& eActions)
{
@@ -429,10 +374,6 @@
{
const auto& seEventData = *std::get<signalEventDataPos>(*it);
if (eGroup == std::get<eventGroupPos>(seEventData) &&
- std::get<sigMatchPos>(signal) ==
- std::get<eventMatchPos>(seEventData) &&
- std::get<sigHandlerPos>(signal).target_type().name() ==
- std::get<eventHandlerPos>(seEventData).target_type().name() &&
eActions.size() == std::get<eventActionsPos>(seEventData).size())
{
// TODO openbmc/openbmc#2328 - Use the function target