summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Barth <msbarth@us.ibm.com>2017-09-27 09:33:42 -0500
committerMatthew Barth <msbarth@us.ibm.com>2017-11-17 13:14:10 -0600
commite59fdf707514ed00fa1ab432a052de1fac07b56c (patch)
tree38ca2bc1a3e4bee8d5b1a0fbc8d2dba55024000c
parent8fa02dabe17db9761086d77c390ceb281e2936c9 (diff)
downloadphosphor-fan-presence-e59fdf707514ed00fa1ab432a052de1fac07b56c.tar.gz
phosphor-fan-presence-e59fdf707514ed00fa1ab432a052de1fac07b56c.zip
Set/update a service name owner for a group
Adds a service name associated with a group when the group or given service name is not found within the map of services otherwise updates the service name owner associated with the group. Change-Id: I602ddaa7e06e354e01ea70d6c5c0a45e74a14e99 Signed-off-by: Matthew Barth <msbarth@us.ibm.com>
-rw-r--r--control/types.hpp4
-rw-r--r--control/zone.cpp30
-rw-r--r--control/zone.hpp16
3 files changed, 50 insertions, 0 deletions
diff --git a/control/types.hpp b/control/types.hpp
index d3ddb16..915b8b4 100644
--- a/control/types.hpp
+++ b/control/types.hpp
@@ -53,6 +53,10 @@ using PrecondGroup = std::tuple<std::string,
std::string,
PropertyVariantType>;
+constexpr auto namePos = 0;
+constexpr auto hasOwnerPos = 1;
+using Service = std::tuple<std::string, bool>;
+
constexpr auto intervalPos = 0;
using Timer = std::tuple<std::chrono::seconds>;
diff --git a/control/zone.cpp b/control/zone.cpp
index 3d7852e..b9a7583 100644
--- a/control/zone.cpp
+++ b/control/zone.cpp
@@ -115,6 +115,36 @@ void Zone::setActiveAllow(const Group* group, bool isActiveAllow)
}
}
+void Zone::setServiceOwner(const Group* group,
+ const std::string& name,
+ const bool hasOwner)
+{
+ try
+ {
+ auto& sNames = _services.at(*group);
+ auto it = std::find_if(
+ sNames.begin(),
+ sNames.end(),
+ [&name](auto const& entry)
+ {
+ return name == std::get<namePos>(entry);
+ }
+ );
+ if (it != std::end(sNames))
+ {
+ std::get<hasOwnerPos>(*it) = hasOwner;
+ }
+ else
+ {
+ _services[*group].emplace_back(name, hasOwner);
+ }
+ }
+ catch (const std::out_of_range& oore)
+ {
+ _services[*group].emplace_back(name, hasOwner);
+ }
+}
+
void Zone::setFloor(uint64_t speed)
{
_floorSpeed = speed;
diff --git a/control/zone.hpp b/control/zone.hpp
index 8869f91..9c08032 100644
--- a/control/zone.hpp
+++ b/control/zone.hpp
@@ -128,6 +128,17 @@ class Zone
};
/**
+ * @brief Set or update a service name owner in use
+ *
+ * @param[in] group - Group associated with service
+ * @param[in] name - Service name
+ * @param[in] hasOwner - Whether the service is owned or not
+ */
+ void setServiceOwner(const Group* group,
+ const std::string& name,
+ const bool hasOwner);
+
+ /**
* @brief Initialize a set speed event properties and actions
*
* @param[in] event - Set speed event
@@ -372,6 +383,11 @@ class Zone
std::map<const Group, bool> _active;
/**
+ * @brief Map of group service names
+ */
+ std::map<const Group, std::vector<Service>> _services;
+
+ /**
* @brief List of signal event arguments and Dbus matches for callbacks
*/
std::vector<SignalEvent> _signalEvents;
OpenPOWER on IntegriCloud