@@ -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+
227245impl < N , A > TypedMetric for Gauge < N , A > {
228246 const TYPE : MetricType = MetricType :: Gauge ;
229247}
0 commit comments