add working a_spin() atomic for non-x86 targets
authorRich Felker <dalias@aerifal.cx>
Mon, 25 Aug 2014 19:43:40 +0000 (15:43 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 25 Aug 2014 19:43:40 +0000 (15:43 -0400)
conceptually, a_spin needs to be at least a compiler barrier, so the
compiler will not optimize out loops (and the load on each iteration)
while spinning. it should also be a memory barrier, or the spinning
thread might keep spinning without noticing stores from other threads,
thus delaying for longer than it should.

ideally, an optimal a_spin implementation that avoids unnecessary
cache/memory contention should be chosen for each arch, but for now,
the easiest thing is to perform a useless a_cas on the calling
thread's stack.

arch/arm/atomic.h
arch/microblaze/atomic.h
arch/mips/atomic.h
arch/or1k/atomic.h
arch/powerpc/atomic.h
arch/sh/atomic.h

index 302e6d8f568c6abd9ca9f4463815d78d9590ff5f..521035423e7de0f3557972be8c2ccbd7815fd84c 100644 (file)
@@ -103,6 +103,7 @@ static inline void a_store(volatile int *p, int x)
 
 static inline void a_spin()
 {
+       __k_cas(&(int){0}, 0, 0));
 }
 
 static inline void a_crash()
index 96265fe6c3c706155f07a22465d1ab58770d3b40..abb79b53cdf1b5f071abf7bb2c4135373977f1a6 100644 (file)
@@ -97,6 +97,7 @@ static inline void a_store(volatile int *p, int x)
 
 static inline void a_spin()
 {
+       a_cas(&(int){0}, 0, 0);
 }
 
 static inline void a_crash()
index 3ec035869663aa121466c1f7fdf3ca4e236a2f7a..cc5bf498d1f5a507bb4181845c21d71d99889dfe 100644 (file)
@@ -137,6 +137,7 @@ static inline void a_store(volatile int *p, int x)
 
 static inline void a_spin()
 {
+       a_cas(&(int){0}, 0, 0);
 }
 
 static inline void a_crash()
index 5b0411b0a8caca5f823454fdc1ac0926e6377585..f9e698153c925eb1f3e38f02f94b41823b1da2fe 100644 (file)
@@ -74,6 +74,7 @@ static inline void a_store(volatile int *p, int x)
 
 static inline void a_spin()
 {
+       a_cas(&(int){0}, 0, 0);
 }
 
 static inline void a_crash()
index 1044886d32790d3cacf5ec06f63130c212cbd135..1c50361e3e8e269ce29b8205de1e1181c2ab443c 100644 (file)
@@ -80,6 +80,7 @@ static inline void a_store(volatile int *p, int x)
 
 static inline void a_spin()
 {
+       a_cas(&(int){0}, 0, 0);
 }
 
 static inline void a_crash()
index 93ab54fe11abdf01eeacb6330500ee996294e2b1..b95bbffccb021c911bd01dc8a876a8a3899528ba 100644 (file)
@@ -53,6 +53,7 @@ static inline void a_dec(volatile int *x)
 
 static inline void a_spin()
 {
+       a_cas(&(int){0}, 0, 0);
 }
 
 static inline void a_crash()