blob: fd03d9aef608931204e3bd8b39172d77e9733a1c [file] [log] [blame]
#ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_SERVER_H_
#define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_SERVER_H_
#include <cstdint>
#include <memory>
#include <string>
#include <string_view>
#include <utility>
#include "absl/base/thread_annotations.h"
#include "absl/container/flat_hash_map.h"
#include "absl/flags/declare.h"
#include "absl/status/statusor.h"
#include "absl/synchronization/mutex.h"
#include "absl/time/time.h"
#include "tlbmc/hal/shared_mem/metrics.h"
#include "tlbmc/hal/shared_mem/segment_manager.h"
#include "tlbmc/hal/shared_mem/sensors.h"
namespace milotic_tlbmc {
class IpcServer {
public:
virtual ~IpcServer() = default;
// Returns the sensor value and timestamp given the sensor name.
virtual absl::StatusOr<std::pair<float, uint64_t>> ReadSensorValue(
const std::string& sensor_name) = 0;
// copybara:strip_begin(g3-shared-libs)
virtual void UpdateMetricsRequestCount(bool is_tlbmc_request) = 0;
virtual void UpdateMetricsResponse(absl::Duration response_time,
int status_code,
std::string_view resource_url) = 0;
// copybara:strip_end
virtual const TlbmcMetrics* GetMetrics() const = 0;
};
// The class is thread-safe.
// Typical usage (sensor):
// SharedMemoryServer::Initialize();
// IpcServer& server = SharedMemoryServer::GetInstance();
// while (true) {
// server.ReadSensorValue("sensor001");
// time.sleep(1ms);
// }
// Typical usage (metrics):
// SharedMemoryServer::Initialize();
// IpcServer& server = SharedMemoryServer::GetInstance();
// while (true) {
// server.UpdateMetricsXxx();
// time.sleep(1ms);
// }
class SharedMemoryServer : public IpcServer {
private:
class Token;
public:
static void Initialize();
static IpcServer& GetInstance();
// Avoid permission issues in /run/.
static void SetUpInstanceForUnitTest();
virtual ~SharedMemoryServer() = default;
// Sensor APIs.
absl::StatusOr<std::pair<float, uint64_t>> ReadSensorValue(
const std::string& sensor_name) override;
// Metrics APIs.
const TlbmcMetrics* GetMetrics() const override { return metrics_; }
// copybara:strip_begin(g3-shared-libs)
void UpdateMetricsRequestCount(bool is_tlbmc_request) override;
void UpdateMetricsResponse(absl::Duration response_time, int status_code,
std::string_view resource_url) override;
// copybara:strip_end
SharedMemoryServer(Token token, const std::string& initialized_file_path,
std::unique_ptr<SegmentManager> segment_manager);
static void Initialize(const std::string& initialized_file_path);
protected:
SharedMemoryServer(const std::string& initialized_file_path,
std::unique_ptr<SegmentManager> segment_manager);
SharedMemoryServer() = default;
IpcSensor* GetSensor(const std::string& sensor_name)
ABSL_LOCKS_EXCLUDED(sensors_mutex_);
// For testing only. Provides the ability to set `initialized_file_path` which
// works in test environment.
static IpcServer& GetInstance(const std::string& initialized_file_path);
private:
class Token {
private:
explicit Token() = default;
friend SharedMemoryServer;
};
const std::string initialized_file_path_;
const std::unique_ptr<SegmentManager> segment_manager_;
absl::Mutex sensors_mutex_;
absl::flat_hash_map<std::string, IpcSensor*> sensors_
ABSL_GUARDED_BY(sensors_mutex_);
TlbmcMetrics* const metrics_ = nullptr;
};
} // namespace milotic_tlbmc
#endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_SERVER_H_