diff options
author | Ubuntu <ubuntu@ip-172-31-25-209.ec2.internal> | 2023-04-17 21:04:47 +0000 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2023-04-24 06:04:18 -0400 |
commit | 96adc99cef86f9ce0347c8b98a2f731b4c46b0ee (patch) | |
tree | 31d87d55ddfb5f87535a90f6f8b64ee3c1ba48ba | |
parent | 6f92a60104f2a580628d45f52f39c8c26f767cb4 (diff) | |
download | haskell-96adc99cef86f9ce0347c8b98a2f731b4c46b0ee.tar.gz |
ghc-prim: Use C11 atomics
-rw-r--r-- | libraries/ghc-prim/cbits/atomic.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/libraries/ghc-prim/cbits/atomic.c b/libraries/ghc-prim/cbits/atomic.c index c15c596ddd..a39e4594ca 100644 --- a/libraries/ghc-prim/cbits/atomic.c +++ b/libraries/ghc-prim/cbits/atomic.c @@ -291,28 +291,36 @@ extern StgWord hs_cmpxchg8(StgWord x, StgWord old, StgWord new); StgWord hs_cmpxchg8(StgWord x, StgWord old, StgWord new) { - return __sync_val_compare_and_swap((volatile StgWord8 *) x, (StgWord8) old, (StgWord8) new); + StgWord8 expected = (StgWord8) old; + __atomic_compare_exchange_n((StgWord8 *) x, &expected, (StgWord8) new, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); + return expected; } extern StgWord hs_cmpxchg16(StgWord x, StgWord old, StgWord new); StgWord hs_cmpxchg16(StgWord x, StgWord old, StgWord new) { - return __sync_val_compare_and_swap((volatile StgWord16 *) x, (StgWord16) old, (StgWord16) new); + StgWord16 expected = (StgWord16) old; + __atomic_compare_exchange_n((StgWord16 *) x, &expected, (StgWord16) new, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); + return expected; } extern StgWord hs_cmpxchg32(StgWord x, StgWord old, StgWord new); StgWord hs_cmpxchg32(StgWord x, StgWord old, StgWord new) { - return __sync_val_compare_and_swap((volatile StgWord32 *) x, (StgWord32) old, (StgWord32) new); + StgWord32 expected = (StgWord32) old; + __atomic_compare_exchange_n((StgWord32 *) x, &expected, (StgWord32) new, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); + return expected; } extern StgWord64 hs_cmpxchg64(StgWord x, StgWord64 old, StgWord64 new); StgWord64 hs_cmpxchg64(StgWord x, StgWord64 old, StgWord64 new) { - return __sync_val_compare_and_swap((volatile StgWord64 *) x, old, new); + StgWord64 expected = (StgWord64) old; + __atomic_compare_exchange_n((StgWord64 *) x, &expected, (StgWord64) new, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); + return expected; } // Atomic exchange operations |