diff --git a/Cargo.toml b/Cargo.toml index 3f119360d1..d3559c790b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,6 +53,7 @@ tracing = { version = ">=0.1.40", default-features = false } tracing-core = { version = ">=0.1.33", default-features = false } tracing-subscriber = { version = "0.3", default-features = false } url = { version = "2.5", default-features = false } +portable-atomic = "1.9.0" # Aviod use of crates.io version of these crates through the tracing-opentelemetry dependencies [patch.crates-io] diff --git a/opentelemetry-sdk/Cargo.toml b/opentelemetry-sdk/Cargo.toml index 56491c6ac2..98bd622948 100644 --- a/opentelemetry-sdk/Cargo.toml +++ b/opentelemetry-sdk/Cargo.toml @@ -29,6 +29,9 @@ tokio-stream = { workspace = true, optional = true } http = { workspace = true, optional = true } tracing = {workspace = true, optional = true} +[target.'cfg(any(target_arch = "powerpc", target_arch = "mips"))'.dependencies] +portable-atomic = {workspace = true} + [package.metadata.docs.rs] all-features = true rustdoc-args = ["--cfg", "docsrs"] diff --git a/opentelemetry-sdk/src/metrics/internal/mod.rs b/opentelemetry-sdk/src/metrics/internal/mod.rs index 6316c97b23..016ee22bba 100644 --- a/opentelemetry-sdk/src/metrics/internal/mod.rs +++ b/opentelemetry-sdk/src/metrics/internal/mod.rs @@ -9,7 +9,14 @@ use core::fmt; use std::collections::{HashMap, HashSet}; use std::mem::swap; use std::ops::{Add, AddAssign, DerefMut, Sub}; -use std::sync::atomic::{AtomicBool, AtomicI64, AtomicU64, AtomicUsize, Ordering}; +use std::sync::atomic::Ordering; + +#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))] +use std::sync::atomic::{AtomicBool, AtomicI64, AtomicU64, AtomicUsize}; + +#[cfg(any(target_arch = "mips", target_arch = "powerpc"))] +use portable_atomic::{AtomicBool, AtomicI64, AtomicU64, AtomicUsize}; + use std::sync::{Arc, OnceLock, RwLock}; use aggregate::{is_under_cardinality_limit, STREAM_CARDINALITY_LIMIT}; @@ -439,8 +446,8 @@ mod tests { #[test] fn can_add_and_get_u64_atomic_value() { let atomic = u64::new_atomic_tracker(0); - atomic.add(15); - atomic.add(10); + AtomicTracker::add(&atomic, 15); + AtomicTracker::add(&atomic, 10); let value = atomic.get_value(); assert_eq!(value, 25); @@ -449,7 +456,7 @@ mod tests { #[test] fn can_reset_u64_atomic_value() { let atomic = u64::new_atomic_tracker(0); - atomic.add(15); + AtomicTracker::add(&atomic, 15); let value = atomic.get_and_reset_value(); let value2 = atomic.get_value(); @@ -478,8 +485,8 @@ mod tests { #[test] fn can_add_and_get_i64_atomic_value() { let atomic = i64::new_atomic_tracker(0); - atomic.add(15); - atomic.add(-10); + AtomicTracker::add(&atomic, 15); + AtomicTracker::add(&atomic, -10); let value = atomic.get_value(); assert_eq!(value, 5); @@ -488,7 +495,7 @@ mod tests { #[test] fn can_reset_i64_atomic_value() { let atomic = i64::new_atomic_tracker(0); - atomic.add(15); + AtomicTracker::add(&atomic, 15); let value = atomic.get_and_reset_value(); let value2 = atomic.get_value();