summaryrefslogtreecommitdiffstats
path: root/utils.cpp
diff options
context:
space:
mode:
authorWilliam A. Kennington III <wak@google.com>2018-03-15 17:09:28 -0700
committerWilliam A. Kennington III <wak@google.com>2018-04-02 23:35:10 +0000
commite47fdfb5d79a32075ec10f5549c07a2e8310079f (patch)
tree1ce29b8f9b6a0ef219c42fe28dcf216c235288b5 /utils.cpp
parent25bc7ac647ce216b1d6a4f4dcb55beadb064ced6 (diff)
downloadphosphor-host-ipmid-e47fdfb5d79a32075ec10f5549c07a2e8310079f.tar.gz
phosphor-host-ipmid-e47fdfb5d79a32075ec10f5549c07a2e8310079f.zip
utils: Add a class to cache service lookups
Currently we are doing interface + path -> service lookups for each ipmi command sent to the daemon. For many types of commands this is not ideal as the daemon is unlikely to change often at runtime. Implement a basic cache with the ability to invalidate the service name at any time. This is used by code in a future commit. Change-Id: I85b04dd17ac19e31d49070f289704b429bd1e577 Signed-off-by: William A. Kennington III <wak@google.com>
Diffstat (limited to 'utils.cpp')
-rw-r--r--utils.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/utils.cpp b/utils.cpp
index bd8fade..31c219c 100644
--- a/utils.cpp
+++ b/utils.cpp
@@ -250,6 +250,47 @@ void setDbusProperty(sdbusplus::bus::bus& bus,
}
+ServiceCache::ServiceCache(const std::string& intf, const std::string& path)
+ : intf(intf), path(path), cachedService(std::experimental::nullopt),
+ cachedBusName(std::experimental::nullopt)
+{
+}
+
+ServiceCache::ServiceCache(std::string&& intf, std::string&& path)
+ : intf(std::move(intf)), path(std::move(path)),
+ cachedService(std::experimental::nullopt),
+ cachedBusName(std::experimental::nullopt)
+{
+}
+
+const std::string& ServiceCache::getService(sdbusplus::bus::bus& bus)
+{
+ if (!isValid(bus))
+ {
+ cachedBusName = bus.get_unique_name();
+ cachedService = ::ipmi::getService(bus, intf, path);
+ }
+ return cachedService.value();
+}
+
+void ServiceCache::invalidate()
+{
+ cachedBusName = std::experimental::nullopt;
+ cachedService = std::experimental::nullopt;
+}
+
+sdbusplus::message::message ServiceCache::newMethodCall(
+ sdbusplus::bus::bus& bus, const char *intf, const char *method)
+{
+ return bus.new_method_call(getService(bus).c_str(), path.c_str(),
+ intf, method);
+}
+
+bool ServiceCache::isValid(sdbusplus::bus::bus& bus) const
+{
+ return cachedService && cachedBusName == bus.get_unique_name();
+}
+
std::string getService(sdbusplus::bus::bus& bus,
const std::string& intf,
const std::string& path)
OpenPOWER on IntegriCloud