@@ -230,6 +230,18 @@ impl<T: internal::AtomicInteger> Atomic<T> {
230230 }
231231 }
232232
233+ #[ cfg( not( all( test, loom, feature = "std" ) ) ) ]
234+ #[ inline( always) ]
235+ fn get_ptr ( & self ) -> * mut T {
236+ self . data . get ( )
237+ }
238+
239+ #[ cfg( all( test, loom, feature = "std" ) ) ]
240+ #[ inline( always) ]
241+ fn get_ptr ( & self ) -> * mut T {
242+ unsafe { self . data . get ( ) . deref ( ) as * const T as * mut T }
243+ }
244+
233245 fn read_lock ( & self ) {
234246 self . lock . read_lock ( |_, _| WaitAction :: Continue ) ;
235247 }
@@ -244,10 +256,17 @@ impl<T: internal::AtomicInteger> Atomic<T> {
244256 }
245257
246258 /// See [`core::sync::atomic::AtomicU64::as_ptr()`]
259+ #[ cfg( not( all( test, loom, feature = "std" ) ) ) ]
247260 pub const fn as_ptr ( & self ) -> * mut T {
248261 self . data . get ( )
249262 }
250263
264+ /// See [`core::sync::atomic::AtomicU64::as_ptr()`]
265+ #[ cfg( all( test, loom, feature = "std" ) ) ]
266+ pub fn as_ptr ( & self ) -> * mut T {
267+ self . get_ptr ( )
268+ }
269+
251270 /// See [`core::sync::atomic::AtomicU64::compare_exchange()`]
252271 pub fn compare_exchange (
253272 & self ,
@@ -257,14 +276,14 @@ impl<T: internal::AtomicInteger> Atomic<T> {
257276 _failure : Ordering ,
258277 ) -> Result < T , T > {
259278 self . write_lock ( ) ;
260- let data = unsafe { * self . data . get ( ) } ;
279+ let data = unsafe { * self . get_ptr ( ) } ;
261280 if data != current {
262281 fence ( Ordering :: SeqCst ) ;
263282 self . unlock ( ) ;
264283 return Err ( data) ;
265284 }
266285
267- unsafe { * self . data . get ( ) = new } ;
286+ unsafe { * self . get_ptr ( ) = new } ;
268287 fence ( Ordering :: SeqCst ) ;
269288 self . unlock ( ) ;
270289 Ok ( data)
@@ -293,8 +312,8 @@ impl<T: internal::AtomicInteger> Atomic<T> {
293312 pub fn fetch_add ( & self , value : T , order : Ordering ) -> T {
294313 self . fetch_op (
295314 || {
296- let old = unsafe { * self . data . get ( ) } ;
297- unsafe { * self . data . get ( ) = old. overflowing_add ( value) . 0 } ;
315+ let old = unsafe { * self . get_ptr ( ) } ;
316+ unsafe { * self . get_ptr ( ) = old. overflowing_add ( value) . 0 } ;
298317 old
299318 } ,
300319 order,
@@ -305,8 +324,8 @@ impl<T: internal::AtomicInteger> Atomic<T> {
305324 pub fn fetch_and ( & self , value : T , order : Ordering ) -> T {
306325 self . fetch_op (
307326 || {
308- let old = unsafe { * self . data . get ( ) } ;
309- unsafe { * self . data . get ( ) &= value } ;
327+ let old = unsafe { * self . get_ptr ( ) } ;
328+ unsafe { * self . get_ptr ( ) &= value } ;
310329 old
311330 } ,
312331 order,
@@ -317,8 +336,8 @@ impl<T: internal::AtomicInteger> Atomic<T> {
317336 pub fn fetch_max ( & self , value : T , order : Ordering ) -> T {
318337 self . fetch_op (
319338 || {
320- let old = unsafe { * self . data . get ( ) } ;
321- unsafe { * self . data . get ( ) = old. max ( value) } ;
339+ let old = unsafe { * self . get_ptr ( ) } ;
340+ unsafe { * self . get_ptr ( ) = old. max ( value) } ;
322341 old
323342 } ,
324343 order,
@@ -329,8 +348,8 @@ impl<T: internal::AtomicInteger> Atomic<T> {
329348 pub fn fetch_min ( & self , value : T , order : Ordering ) -> T {
330349 self . fetch_op (
331350 || {
332- let old = unsafe { * self . data . get ( ) } ;
333- unsafe { * self . data . get ( ) = old. min ( value) } ;
351+ let old = unsafe { * self . get_ptr ( ) } ;
352+ unsafe { * self . get_ptr ( ) = old. min ( value) } ;
334353 old
335354 } ,
336355 order,
@@ -341,8 +360,8 @@ impl<T: internal::AtomicInteger> Atomic<T> {
341360 pub fn fetch_nand ( & self , value : T , order : Ordering ) -> T {
342361 self . fetch_op (
343362 || {
344- let old = unsafe { * self . data . get ( ) } ;
345- unsafe { * self . data . get ( ) = !( old & value) } ;
363+ let old = unsafe { * self . get_ptr ( ) } ;
364+ unsafe { * self . get_ptr ( ) = !( old & value) } ;
346365 old
347366 } ,
348367 order,
@@ -353,8 +372,8 @@ impl<T: internal::AtomicInteger> Atomic<T> {
353372 pub fn fetch_or ( & self , value : T , order : Ordering ) -> T {
354373 self . fetch_op (
355374 || {
356- let old = unsafe { * self . data . get ( ) } ;
357- unsafe { * self . data . get ( ) |= value } ;
375+ let old = unsafe { * self . get_ptr ( ) } ;
376+ unsafe { * self . get_ptr ( ) |= value } ;
358377 old
359378 } ,
360379 order,
@@ -365,8 +384,8 @@ impl<T: internal::AtomicInteger> Atomic<T> {
365384 pub fn fetch_sub ( & self , value : T , order : Ordering ) -> T {
366385 self . fetch_op (
367386 || {
368- let old = unsafe { * self . data . get ( ) } ;
369- unsafe { * self . data . get ( ) = old. overflowing_sub ( value) . 0 } ;
387+ let old = unsafe { * self . get_ptr ( ) } ;
388+ unsafe { * self . get_ptr ( ) = old. overflowing_sub ( value) . 0 } ;
370389 old
371390 } ,
372391 order,
@@ -381,11 +400,11 @@ impl<T: internal::AtomicInteger> Atomic<T> {
381400 mut f : F ,
382401 ) -> Result < T , T > {
383402 self . write_lock ( ) ;
384- let data = unsafe { * self . data . get ( ) } ;
403+ let data = unsafe { * self . get_ptr ( ) } ;
385404
386405 match f ( data) {
387406 Some ( v) => {
388- unsafe { * self . data . get ( ) = v } ;
407+ unsafe { * self . get_ptr ( ) = v } ;
389408 fence ( Ordering :: SeqCst ) ;
390409 self . unlock ( ) ;
391410 Ok ( data)
@@ -402,8 +421,8 @@ impl<T: internal::AtomicInteger> Atomic<T> {
402421 pub fn fetch_xor ( & self , value : T , order : Ordering ) -> T {
403422 self . fetch_op (
404423 || {
405- let old = unsafe { * self . data . get ( ) } ;
406- unsafe { * self . data . get ( ) ^= value } ;
424+ let old = unsafe { * self . get_ptr ( ) } ;
425+ unsafe { * self . get_ptr ( ) ^= value } ;
407426 old
408427 } ,
409428 order,
@@ -412,13 +431,13 @@ impl<T: internal::AtomicInteger> Atomic<T> {
412431
413432 /// See [`core::sync::atomic::AtomicU64::into_inner()`]
414433 pub fn into_inner ( self ) -> T {
415- unsafe { * self . data . get ( ) }
434+ unsafe { * self . get_ptr ( ) }
416435 }
417436
418437 /// See [`core::sync::atomic::AtomicU64::load()`]
419438 pub fn load ( & self , _order : Ordering ) -> T {
420439 self . read_lock ( ) ;
421- let data = unsafe { * self . data . get ( ) } ;
440+ let data = unsafe { * self . get_ptr ( ) } ;
422441 fence ( Ordering :: SeqCst ) ;
423442 self . unlock ( ) ;
424443 data
@@ -427,16 +446,16 @@ impl<T: internal::AtomicInteger> Atomic<T> {
427446 /// See [`core::sync::atomic::AtomicU64::store()`]
428447 pub fn store ( & self , value : T , _order : Ordering ) {
429448 self . write_lock ( ) ;
430- unsafe { * self . data . get ( ) = value } ;
449+ unsafe { * self . get_ptr ( ) = value } ;
431450 fence ( Ordering :: SeqCst ) ;
432451 self . unlock ( ) ;
433452 }
434453
435454 /// See [`core::sync::atomic::AtomicU64::swap()`]
436455 pub fn swap ( & self , value : T , _order : Ordering ) -> T {
437456 self . write_lock ( ) ;
438- let data = unsafe { * self . data . get ( ) } ;
439- unsafe { * self . data . get ( ) = value } ;
457+ let data = unsafe { * self . get_ptr ( ) } ;
458+ unsafe { * self . get_ptr ( ) = value } ;
440459 fence ( Ordering :: SeqCst ) ;
441460 self . unlock ( ) ;
442461 data
0 commit comments