SLIDE 15 Università degli studi di Udine
Linux atomic operations
int atomic_inc_and_test(atomic_t *v); (fb)
return true if result is 0
int atomic_dec_and_test(atomic_t *v); (fb)
return true if result is 0
void atomic_clear_mask(int i, atomic_t *v); (nb) void atomic_set_mask(int i, atomic_t *v); (nb) unsigned long atomic_cmpxchg(atomic_t *v, unsigned long testval, unsigned long newval); (fb)
perform the swap if v contains testval; return the previous value of v also: cmpxchg
unsigned long atomic_xchg(volatile void *ptr, type val); (fb)
return the previous value stored in ptr also: xchg
not in all architectures
Università degli studi di Udine
Linux atomic operations
types:
atomic_t (32 bit) atomic64_t (64 bit)
ATOMIC64_INIT(i) long long atomic64_read(const atomic64_t *v); void atomic64_set(atomic64_t *v, long long i); void atomic64_add(long long a, atomic64_t *v); long long atomic64_add_return(long long a, atomic64_t *v); void atomic64_sub(long long a, atomic64_t *v); long long atomic64_sub_return(long long a, atomic64_t *v);
Università degli studi di Udine
Linux atomic operations
void atomic64_inc(atomic64_t *v); long long atomic64_inc_return(atomic64_t *v); long long atomic64_inc_and_test(atomic64_t *v);
return true if result is 0
void atomic64_dec(atomic64_t *v); long long atomic64_dec_return(atomic64_t *v); long long atomic64_dec_and_test(atomic64_t *v);
return true if result is 0
long long atomic64_dec_if_positive(atomic64_t *v); int atomic64_inc_not_zero(atomic64_t *v);
increment v if not null; return true if the increment is performed
int atomic64_add_negative(long long a, atomic64_t *v);
return true if result is negative
Università degli studi di Udine
Linux atomic operations
int atomic64_add_unless(atomic64_t *v, long long a, long long u);
add a unless v contains u; return true if the sum is performed
long long atomic64_sub_and_test(long long a, atomic64_t *v);
return true if result is 0
long long atomic64_cmpxchg(atomic64_t *v, long long testval, long long newval); long long atomic64_xchg(atomic64_t *v, long long newval);