40 #include "../../rtt-config.h" 41 #ifndef __ORO_ARCH_I386__ 42 #define __ORO_ARCH_I386__ 44 #ifndef CONFIG_FORCE_UP 45 #define ORO_LOCK "lock ; " 52 #define ORO_ATOMIC_SETUP oro_atomic_set 53 #define ORO_ATOMIC_CLEANUP(v) 55 #define oro_atomic_read(v) ((v)->counter) 57 #define oro_atomic_set(v,i) (((v)->counter) = (i)) 101 __asm__ __volatile__(
107 #define oro_atomic_inc_return(v) (oro_atomic_add_return(v, 1)) 108 #define oro_atomic_dec_return(v) (oro_atomic_sub_return(v, 1)) 114 __asm__ __volatile__(
125 __asm__ __volatile__(
132 #define smp_mb__before_oro_atomic_dec() barrier() 133 #define smp_mb__after_oro_atomic_dec() barrier() 134 #define smp_mb__before_oro_atomic_inc() barrier() 135 #define smp_mb__after_oro_atomic_inc() barrier() 137 #ifndef CONFIG_FORCE_UP 138 #define ORO_LOCK_PREFIX "lock ; " 140 #define ORO_LOCK_PREFIX "" 144 #define oro__xg(x) ((struct oro__xchg_dummy *)(x)) 146 static inline unsigned long __oro_cmpxchg(
volatile void *ptr,
unsigned long old,
147 unsigned long _new,
int size)
154 :
"q"(_new),
"m"(*
oro__xg(ptr)),
"0"(old)
160 :
"q"(_new),
"m"(*
oro__xg(ptr)),
"0"(old)
166 :
"q"(_new),
"m"(*
oro__xg(ptr)),
"0"(old)
173 #define oro_cmpxchg(ptr,o,n)\ 174 ((__typeof__(*(ptr)))__oro_cmpxchg((ptr),(unsigned long)(o),\ 175 (unsigned long)(n),sizeof(*(ptr)))) 178 #undef ORO_LOCK_PREFIX
int oro_atomic_inc_and_test(oro_atomic_t *a)
Increment a atomically and test for zero.
int oro_atomic_sub_return(int n, oro_atomic_t *a, int n)
Subtract n from a and return the new value.
void oro_atomic_inc(oro_atomic_t *a)
Increment a atomically.
volatile long oro_atomic_t
void oro_atomic_sub(int n, oro_atomic_t *a, int n)
Subtract n from a.
int oro_atomic_dec_and_test(oro_atomic_t *a)
Decrement a atomically and test for zero.
void oro_atomic_dec(oro_atomic_t *a)
Decrement a atomically.
Structure that contains an int for atomic operations.
int oro_atomic_add_return(oro_atomic_t *a, int n)
Add n to a and return the new value.
void oro_atomic_add(oro_atomic_t *a, int n)
Add n to a.