use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex};
use once_cell::sync::Lazy;
use super::collector::DataCollector;
use super::config::HlsmiConfig;
use super::parser::GaudiMetricsData;
use super::store::MetricsStore;
static HLSMI_MANAGER: Lazy<Mutex<Option<Arc<HlsmiManager>>>> = Lazy::new(|| Mutex::new(None));
static FIRST_DATA_RECEIVED: AtomicBool = AtomicBool::new(false);
pub struct HlsmiManager {
collector: Mutex<DataCollector>,
}
impl HlsmiManager {
fn new(interval_secs: u64) -> Result<Self, Box<dyn std::error::Error>> {
let config = HlsmiConfig::with_interval_secs(interval_secs);
let store = Arc::new(MetricsStore::new(config.buffer_capacity));
let mut collector = DataCollector::new(config, store);
collector.start()?;
Ok(Self {
collector: Mutex::new(collector),
})
}
fn get_latest_data_internal(&self) -> Result<GaudiMetricsData, Box<dyn std::error::Error>> {
let collector = self.collector.lock().unwrap();
let result = collector.get_latest_data();
if result.is_ok() && !FIRST_DATA_RECEIVED.load(Ordering::Relaxed) {
FIRST_DATA_RECEIVED.store(true, Ordering::Relaxed);
}
result
}
pub fn get_latest_data_result(&self) -> Result<GaudiMetricsData, Box<dyn std::error::Error>> {
self.get_latest_data_internal()
}
}
pub fn initialize_hlsmi_manager(interval_secs: u64) -> Result<(), Box<dyn std::error::Error>> {
let mut manager_guard = HLSMI_MANAGER.lock().unwrap();
if manager_guard.is_none() {
let manager = HlsmiManager::new(interval_secs)?;
*manager_guard = Some(Arc::new(manager));
}
Ok(())
}
pub fn get_hlsmi_manager() -> Option<Arc<HlsmiManager>> {
HLSMI_MANAGER.lock().unwrap().clone()
}
pub fn shutdown_hlsmi_manager() {
if let Some(_manager) = get_hlsmi_manager() {
{
let mut manager_guard = HLSMI_MANAGER.lock().unwrap();
*manager_guard = None;
}
FIRST_DATA_RECEIVED.store(false, Ordering::Relaxed);
}
}
#[allow(dead_code)]
pub fn has_hlsmi_data() -> bool {
FIRST_DATA_RECEIVED.load(Ordering::Relaxed)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_manager_not_initialized() {
shutdown_hlsmi_manager();
let manager = get_hlsmi_manager();
assert!(manager.is_none());
}
}