diff options
author | William A. Kennington III <wak@google.com> | 2018-03-15 17:09:28 -0700 |
---|---|---|
committer | William A. Kennington III <wak@google.com> | 2018-04-02 23:35:10 +0000 |
commit | e47fdfb5d79a32075ec10f5549c07a2e8310079f (patch) | |
tree | 1ce29b8f9b6a0ef219c42fe28dcf216c235288b5 /utils.cpp | |
parent | 25bc7ac647ce216b1d6a4f4dcb55beadb064ced6 (diff) | |
download | phosphor-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.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
@@ -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) |