xref: /openbmc/telemetry/src/sensor_cache.hpp (revision 583ba441654657bb4ba9d051b747144a7258c159)
17f06f613SKrzysztof Grobelny #pragma once
27f06f613SKrzysztof Grobelny 
37f06f613SKrzysztof Grobelny #include "interfaces/sensor.hpp"
47f06f613SKrzysztof Grobelny 
57f06f613SKrzysztof Grobelny #include <boost/container/flat_map.hpp>
67f06f613SKrzysztof Grobelny #include <boost/system/error_code.hpp>
77f06f613SKrzysztof Grobelny 
87f06f613SKrzysztof Grobelny #include <memory>
97f06f613SKrzysztof Grobelny #include <string_view>
107f06f613SKrzysztof Grobelny 
117f06f613SKrzysztof Grobelny class SensorCache
127f06f613SKrzysztof Grobelny {
137f06f613SKrzysztof Grobelny   public:
147f06f613SKrzysztof Grobelny     template <class SensorType, class... Args>
makeSensor(std::string_view service,std::string_view path,Args &&...args)15*583ba441SPatrick Williams     std::shared_ptr<SensorType> makeSensor(
16*583ba441SPatrick Williams         std::string_view service, std::string_view path, Args&&... args)
177f06f613SKrzysztof Grobelny     {
187f06f613SKrzysztof Grobelny         cleanupExpiredSensors();
197f06f613SKrzysztof Grobelny 
207f06f613SKrzysztof Grobelny         auto id = SensorType::makeId(service, path);
217f06f613SKrzysztof Grobelny         auto it = sensors.find(id);
227f06f613SKrzysztof Grobelny 
237f06f613SKrzysztof Grobelny         if (it == sensors.end())
247f06f613SKrzysztof Grobelny         {
257f06f613SKrzysztof Grobelny             auto sensor = std::make_shared<SensorType>(
267f06f613SKrzysztof Grobelny                 std::move(id), std::forward<Args>(args)...);
277f06f613SKrzysztof Grobelny 
287f06f613SKrzysztof Grobelny             sensors[sensor->id()] = sensor;
297f06f613SKrzysztof Grobelny 
307f06f613SKrzysztof Grobelny             return sensor;
317f06f613SKrzysztof Grobelny         }
327f06f613SKrzysztof Grobelny 
337f06f613SKrzysztof Grobelny         return std::static_pointer_cast<SensorType>(it->second.lock());
347f06f613SKrzysztof Grobelny     }
357f06f613SKrzysztof Grobelny 
367f06f613SKrzysztof Grobelny   private:
377f06f613SKrzysztof Grobelny     using SensorsContainer =
387f06f613SKrzysztof Grobelny         boost::container::flat_map<interfaces::Sensor::Id,
397f06f613SKrzysztof Grobelny                                    std::weak_ptr<interfaces::Sensor>>;
407f06f613SKrzysztof Grobelny 
417f06f613SKrzysztof Grobelny     SensorsContainer sensors;
427f06f613SKrzysztof Grobelny 
437f06f613SKrzysztof Grobelny     SensorsContainer::iterator findExpiredSensor(SensorsContainer::iterator);
447f06f613SKrzysztof Grobelny     void cleanupExpiredSensors();
457f06f613SKrzysztof Grobelny };
46