From 4129bb0482b0b55a403e985973e4ad35ddc78803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Gillot-Lamure?= Date: Tue, 25 Jun 2024 15:02:35 +0200 Subject: [PATCH 1/2] chore(portability): Support all platforms without 64 bit atomics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Notably, RISC-V 32 for ESP32-C3 chips. Signed-off-by: Léo Gillot-Lamure --- CHANGELOG.md | 9 +++++++++ src/metrics/counter.rs | 12 ++++++------ src/metrics/exemplar.rs | 8 ++++---- src/metrics/gauge.rs | 10 +++++----- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b1533d4..47df1e38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Added + +- Support all platforms with 32 bit atomics lacking 64 bit atomics. + See [PR 203]. + +[PR 203]: https://github.com/prometheus/client_rust/pull/203 + ## [0.22.2] ### Added diff --git a/src/metrics/counter.rs b/src/metrics/counter.rs index c1c5e511..63d84ffc 100644 --- a/src/metrics/counter.rs +++ b/src/metrics/counter.rs @@ -6,7 +6,7 @@ use crate::encoding::{EncodeMetric, MetricEncoder}; use super::{MetricType, TypedMetric}; use std::marker::PhantomData; -#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] +#[cfg(target_has_atomic = "64")] use std::sync::atomic::AtomicU64; use std::sync::atomic::{AtomicU32, Ordering}; use std::sync::Arc; @@ -40,7 +40,7 @@ use std::sync::Arc; /// counter.inc(); /// let _value: f64 = counter.get(); /// ``` -#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] +#[cfg(target_has_atomic = "64")] #[derive(Debug)] pub struct Counter { value: Arc, @@ -48,7 +48,7 @@ pub struct Counter { } /// Open Metrics [`Counter`] to measure discrete events. -#[cfg(any(target_arch = "mips", target_arch = "powerpc"))] +#[cfg(not(target_has_atomic = "64"))] #[derive(Debug)] pub struct Counter { value: Arc, @@ -114,7 +114,7 @@ pub trait Atomic { fn get(&self) -> N; } -#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] +#[cfg(target_has_atomic = "64")] impl Atomic for AtomicU64 { fn inc(&self) -> u64 { self.inc_by(1) @@ -143,7 +143,7 @@ impl Atomic for AtomicU32 { } } -#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] +#[cfg(target_has_atomic = "64")] impl Atomic for AtomicU64 { fn inc(&self) -> f64 { self.inc_by(1.0) @@ -231,7 +231,7 @@ mod tests { assert_eq!(1, counter.get()); } - #[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] + #[cfg(target_has_atomic = "64")] #[test] fn f64_stored_in_atomic_u64() { fn prop(fs: Vec) { diff --git a/src/metrics/exemplar.rs b/src/metrics/exemplar.rs index c8478c6a..e61f4d5a 100644 --- a/src/metrics/exemplar.rs +++ b/src/metrics/exemplar.rs @@ -11,9 +11,9 @@ use super::histogram::Histogram; use super::{MetricType, TypedMetric}; use parking_lot::{MappedRwLockReadGuard, RwLock, RwLockReadGuard}; use std::collections::HashMap; -#[cfg(any(target_arch = "mips", target_arch = "powerpc"))] +#[cfg(not(target_has_atomic = "64"))] use std::sync::atomic::AtomicU32; -#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] +#[cfg(target_has_atomic = "64")] use std::sync::atomic::AtomicU64; use std::sync::Arc; @@ -65,7 +65,7 @@ pub struct Exemplar { /// }), /// ); /// ``` -#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] +#[cfg(target_has_atomic = "64")] #[derive(Debug)] pub struct CounterWithExemplar { pub(crate) inner: Arc>>, @@ -77,7 +77,7 @@ impl TypedMetric for CounterWithExemplar { /// Open Metrics [`Counter`] with an [`Exemplar`] to both measure discrete /// events and track references to data outside of the metric set. -#[cfg(any(target_arch = "mips", target_arch = "powerpc"))] +#[cfg(not(target_has_atomic = "64"))] #[derive(Debug)] pub struct CounterWithExemplar { pub(crate) inner: Arc>>, diff --git a/src/metrics/gauge.rs b/src/metrics/gauge.rs index 7b268427..fcf7e6a7 100644 --- a/src/metrics/gauge.rs +++ b/src/metrics/gauge.rs @@ -7,7 +7,7 @@ use crate::encoding::{EncodeGaugeValue, EncodeMetric, MetricEncoder}; use super::{MetricType, TypedMetric}; use std::marker::PhantomData; use std::sync::atomic::{AtomicI32, AtomicU32, Ordering}; -#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] +#[cfg(target_has_atomic = "64")] use std::sync::atomic::{AtomicI64, AtomicU64}; use std::sync::Arc; @@ -40,7 +40,7 @@ use std::sync::Arc; /// gauge.set(42.0); /// let _value: f64 = gauge.get(); /// ``` -#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] +#[cfg(target_has_atomic = "64")] #[derive(Debug)] pub struct Gauge { value: Arc, @@ -48,7 +48,7 @@ pub struct Gauge { } /// Open Metrics [`Gauge`] to record current measurements. -#[cfg(any(target_arch = "mips", target_arch = "powerpc"))] +#[cfg(not(target_has_atomic = "64"))] #[derive(Debug)] pub struct Gauge { value: Arc, @@ -186,7 +186,7 @@ impl Atomic for AtomicU32 { } } -#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] +#[cfg(target_has_atomic = "64")] impl Atomic for AtomicI64 { fn inc(&self) -> i64 { self.inc_by(1) @@ -213,7 +213,7 @@ impl Atomic for AtomicI64 { } } -#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] +#[cfg(target_has_atomic = "64")] impl Atomic for AtomicU64 { fn inc(&self) -> f64 { self.inc_by(1.0) From c028f7bff7c35744242b1c9d1b6148cb25f9221f Mon Sep 17 00:00:00 2001 From: Max Inden Date: Tue, 2 Jul 2024 10:26:34 +0200 Subject: [PATCH 2/2] Update CHANGELOG.md Signed-off-by: Max Inden --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 47df1e38..a52b060d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [0.22.3] - unreleased ### Added