blob: 025830967865e41ca7d4bf8bef373c58274d5fc7 [file]
#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_STATIC_SHARED_MEMORY_CLIENT_IMPL_H
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_STATIC_SHARED_MEMORY_CLIENT_IMPL_H
#include <cstdint>
#include <memory>
#include <string>
#include <utility>
#include "absl/base/thread_annotations.h"
#include "absl/container/flat_hash_map.h"
#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/synchronization/mutex.h"
#include "boost/interprocess/exceptions.hpp" // NOLINT
#include "boost/interprocess/managed_shared_memory.hpp" //NOLINT
#include "tlbmc/hal/shared_mem/client_interface.h"
#include "tlbmc/hal/shared_mem/client_segment.h"
// copybara:strip_begin(g3-shared-libs)
#include "tlbmc/hal/shared_mem/metrics.h"
// copybara:strip_end
#include "tlbmc/hal/shared_mem/sensors.h"
namespace milotic_tlbmc {
class StaticSharedMemoryClient : public IpcClient {
class Token {
explicit Token() = default;
friend class StaticSharedMemoryClient;
};
public:
static IpcClient& GetInstance();
static IpcClient& GetInstance(const std::string& initialized_file_path,
const std::string& shared_memory_name);
static void SetupInstanceForUnitTest();
absl::StatusOr<ClientSegment*> GetOrCreateClientSegment();
absl::StatusOr<std::pair<float, uint64_t>> ReadSensorValue(
const std::string& sensor_name);
bool IsSharedMemoryReady() override;
absl::Status UpdateSensorValue(const std::string& sensor_name,
float value) override;
absl::Status UpdateSensorValue(const std::string& sensor_name, float value,
uint64_t timestamp) override;
// copybara:strip_begin(g3-shared-libs)
const TlbmcMetrics* GetMetrics() override;
// copybara:strip_end
~StaticSharedMemoryClient() override = default;
StaticSharedMemoryClient(Token /*unused*/,
const std::string& initialized_file_path,
const std::string& shared_memory_name)
: initialized_file_path_(initialized_file_path),
shared_memory_name_(shared_memory_name) {}
protected:
static std::unique_ptr<StaticSharedMemoryClient> CreateInstanceForTesting(
const std::string& initialized_file_path,
const std::string& shared_memory_name);
StaticSharedMemoryClient() = default;
absl::StatusOr<IpcSensor*> FindSensor(const std::string& sensor_name)
ABSL_LOCKS_EXCLUDED(sensors_mutex_);
private:
std::string initialized_file_path_;
std::string shared_memory_name_;
absl::Mutex sensors_mutex_;
absl::Mutex client_segment_mutex_;
std::unique_ptr<ClientSegment> client_segment_;
absl::flat_hash_map<std::string, IpcSensor*> sensors_
ABSL_GUARDED_BY(sensors_mutex_);
};
using SharedMemoryClient = StaticSharedMemoryClient;
} // namespace milotic_tlbmc
#endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_STATIC_SHARED_MEMORY_CLIENT_IMPL_H