Skip to content

Commit f2a204d

Browse files
committed
*: impl Atomic for f32
1 parent d6105f1 commit f2a204d

File tree

3 files changed

+99
-61
lines changed

3 files changed

+99
-61
lines changed

src/encoding/text.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,13 @@ impl Encode for f64 {
103103
}
104104
}
105105

106+
impl Encode for f32 {
107+
fn encode(&self, writer: &mut dyn Write) -> Result<(), std::io::Error> {
108+
writer.write_all(dtoa::Buffer::new().format(*self).as_bytes())?;
109+
Ok(())
110+
}
111+
}
112+
106113
impl Encode for u64 {
107114
fn encode(&self, writer: &mut dyn Write) -> Result<(), std::io::Error> {
108115
writer.write_all(itoa::Buffer::new().format(*self).as_bytes())?;

src/metrics/counter.rs

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -134,31 +134,44 @@ impl Atomic<u32> for AtomicU32 {
134134
}
135135
}
136136

137-
#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))]
138-
impl Atomic<f64> for AtomicU64 {
139-
fn inc(&self) -> f64 {
140-
self.inc_by(1.0)
141-
}
137+
macro_rules! atomic_float {
138+
($F:ty, $A:ty) => {
139+
impl Atomic<$F> for $A {
140+
fn inc(&self) -> $F {
141+
self.inc_by(1.0)
142+
}
142143

143-
fn inc_by(&self, v: f64) -> f64 {
144-
let mut old_u64 = self.load(Ordering::Relaxed);
145-
let mut old_f64;
146-
loop {
147-
old_f64 = f64::from_bits(old_u64);
148-
let new = f64::to_bits(old_f64 + v);
149-
match self.compare_exchange_weak(old_u64, new, Ordering::Relaxed, Ordering::Relaxed) {
150-
Ok(_) => break,
151-
Err(x) => old_u64 = x,
144+
fn inc_by(&self, v: $F) -> $F {
145+
let mut old_atom = self.load(Ordering::Relaxed);
146+
let mut old_flt;
147+
loop {
148+
old_flt = <$F>::from_bits(old_atom);
149+
let new = <$F>::to_bits(old_flt + v);
150+
match self.compare_exchange_weak(
151+
old_atom,
152+
new,
153+
Ordering::Relaxed,
154+
Ordering::Relaxed,
155+
) {
156+
Ok(_) => break,
157+
Err(x) => old_atom = x,
158+
}
159+
}
160+
161+
old_flt
162+
}
163+
164+
fn get(&self) -> $F {
165+
<$F>::from_bits(self.load(Ordering::Relaxed))
152166
}
153167
}
168+
};
169+
}
154170

155-
old_f64
156-
}
171+
#[cfg(not(any(target_arch = "mips", target_arch = "powerpc", target_arch = "xtensa")))]
172+
atomic_float!(f64, AtomicU64);
157173

158-
fn get(&self) -> f64 {
159-
f64::from_bits(self.load(Ordering::Relaxed))
160-
}
161-
}
174+
atomic_float!(f32, AtomicU32);
162175

163176
impl<N, A> TypedMetric for Counter<N, A> {
164177
const TYPE: MetricType = MetricType::Counter;
@@ -176,7 +189,7 @@ mod tests {
176189
assert_eq!(1, counter.get());
177190
}
178191

179-
#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))]
192+
#[cfg(not(any(target_arch = "mips", target_arch = "powerpc", target_arch = "xtensa")))]
180193
#[test]
181194
fn f64_stored_in_atomic_u64() {
182195
fn prop(fs: Vec<f64>) {

src/metrics/gauge.rs

Lines changed: 58 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -175,55 +175,73 @@ impl Atomic<u32> for AtomicU32 {
175175
}
176176
}
177177

178-
#[cfg(not(any(target_arch = "mips", target_arch = "powerpc")))]
179-
impl Atomic<f64> for AtomicU64 {
180-
fn inc(&self) -> f64 {
181-
self.inc_by(1.0)
182-
}
183-
184-
fn inc_by(&self, v: f64) -> f64 {
185-
let mut old_u64 = self.load(Ordering::Relaxed);
186-
let mut old_f64;
187-
loop {
188-
old_f64 = f64::from_bits(old_u64);
189-
let new = f64::to_bits(old_f64 + v);
190-
match self.compare_exchange_weak(old_u64, new, Ordering::Relaxed, Ordering::Relaxed) {
191-
Ok(_) => break,
192-
Err(x) => old_u64 = x,
178+
macro_rules! atomic_float {
179+
($F:ty, $A:ty) => {
180+
impl Atomic<$F> for $A {
181+
fn inc(&self) -> $F {
182+
self.inc_by(1.0)
193183
}
194-
}
195-
196-
old_f64
197-
}
198184

199-
fn dec(&self) -> f64 {
200-
self.dec_by(1.0)
201-
}
185+
fn inc_by(&self, v: $F) -> $F {
186+
let mut old_atom = self.load(Ordering::Relaxed);
187+
let mut old_flt;
188+
loop {
189+
old_flt = <$F>::from_bits(old_atom);
190+
let new = <$F>::to_bits(old_flt + v);
191+
match self.compare_exchange_weak(
192+
old_atom,
193+
new,
194+
Ordering::Relaxed,
195+
Ordering::Relaxed,
196+
) {
197+
Ok(_) => break,
198+
Err(x) => old_atom = x,
199+
}
200+
}
201+
202+
old_flt
203+
}
202204

203-
fn dec_by(&self, v: f64) -> f64 {
204-
let mut old_u64 = self.load(Ordering::Relaxed);
205-
let mut old_f64;
206-
loop {
207-
old_f64 = f64::from_bits(old_u64);
208-
let new = f64::to_bits(old_f64 - v);
209-
match self.compare_exchange_weak(old_u64, new, Ordering::Relaxed, Ordering::Relaxed) {
210-
Ok(_) => break,
211-
Err(x) => old_u64 = x,
205+
fn dec(&self) -> $F {
206+
self.dec_by(1.0)
212207
}
213-
}
214208

215-
old_f64
216-
}
209+
fn dec_by(&self, v: $F) -> $F {
210+
let mut old_atom = self.load(Ordering::Relaxed);
211+
let mut old_flt;
212+
loop {
213+
old_flt = <$F>::from_bits(old_atom);
214+
let new = <$F>::to_bits(old_flt - v);
215+
match self.compare_exchange_weak(
216+
old_atom,
217+
new,
218+
Ordering::Relaxed,
219+
Ordering::Relaxed,
220+
) {
221+
Ok(_) => break,
222+
Err(x) => old_atom = x,
223+
}
224+
}
225+
226+
old_flt
227+
}
217228

218-
fn set(&self, v: f64) -> f64 {
219-
f64::from_bits(self.swap(f64::to_bits(v), Ordering::Relaxed))
220-
}
229+
fn set(&self, v: $F) -> $F {
230+
<$F>::from_bits(self.swap(<$F>::to_bits(v), Ordering::Relaxed))
231+
}
221232

222-
fn get(&self) -> f64 {
223-
f64::from_bits(self.load(Ordering::Relaxed))
224-
}
233+
fn get(&self) -> $F {
234+
<$F>::from_bits(self.load(Ordering::Relaxed))
235+
}
236+
}
237+
};
225238
}
226239

240+
#[cfg(not(any(target_arch = "mips", target_arch = "powerpc", target_arch = "xtensa")))]
241+
atomic_float!(f64, AtomicU64);
242+
243+
atomic_float!(f32, AtomicU32);
244+
227245
impl<N, A> TypedMetric for Gauge<N, A> {
228246
const TYPE: MetricType = MetricType::Gauge;
229247
}

0 commit comments

Comments
 (0)