From 560b7230e3ca56c903cc8acf3b138f1e5d9185c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Gillot-Lamure?= Date: Wed, 17 Jul 2024 19:44:15 +0200 Subject: [PATCH] feat(portability): Support Gauge:: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Léo Gillot-Lamure --- src/encoding/text.rs | 3 +++ src/metrics/gauge.rs | 48 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/encoding/text.rs b/src/encoding/text.rs index ed51fba0..0186bc4a 100644 --- a/src/encoding/text.rs +++ b/src/encoding/text.rs @@ -783,6 +783,9 @@ mod tests { let gauge = Gauge::::default(); registry.register("u32_gauge", "Gauge::", gauge); + let gauge_f32 = Gauge::::default(); + registry.register("f32_gauge", "Gauge::", gauge_f32); + let mut encoded = String::new(); encode(&mut encoded, ®istry).unwrap(); diff --git a/src/metrics/gauge.rs b/src/metrics/gauge.rs index fcf7e6a7..5c8bef9b 100644 --- a/src/metrics/gauge.rs +++ b/src/metrics/gauge.rs @@ -262,6 +262,54 @@ impl Atomic for AtomicU64 { } } +impl Atomic for AtomicU32 { + fn inc(&self) -> f32 { + self.inc_by(1.0) + } + + fn inc_by(&self, v: f32) -> f32 { + let mut old_u32 = self.load(Ordering::Relaxed); + let mut old_f32; + loop { + old_f32 = f32::from_bits(old_u32); + let new = f32::to_bits(old_f32 + v); + match self.compare_exchange_weak(old_u32, new, Ordering::Relaxed, Ordering::Relaxed) { + Ok(_) => break, + Err(x) => old_u32 = x, + } + } + + old_f32 + } + + fn dec(&self) -> f32 { + self.dec_by(1.0) + } + + fn dec_by(&self, v: f32) -> f32 { + let mut old_u32 = self.load(Ordering::Relaxed); + let mut old_f32; + loop { + old_f32 = f32::from_bits(old_u32); + let new = f32::to_bits(old_f32 - v); + match self.compare_exchange_weak(old_u32, new, Ordering::Relaxed, Ordering::Relaxed) { + Ok(_) => break, + Err(x) => old_u32 = x, + } + } + + old_f32 + } + + fn set(&self, v: f32) -> f32 { + f32::from_bits(self.swap(f32::to_bits(v), Ordering::Relaxed)) + } + + fn get(&self) -> f32 { + f32::from_bits(self.load(Ordering::Relaxed)) + } +} + impl TypedMetric for Gauge { const TYPE: MetricType = MetricType::Gauge; }