123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #ifndef ATOMIC_H
- #define ATOMIC_H
- #include "cpu.h"
- #include "irq.h"
- typedef struct {
- int counter;
- } atomic_t;
- static inline int atomic_add_return(int i, atomic_t *v)
- {
- int val;
- CPU_SR_ALLOC();
- CPU_CRITICAL_ENTER();
- val = v->counter;
- v->counter = val += i;
- CPU_CRITICAL_EXIT();
- return val;
- }
- static inline int atomic_sub_return(int i, atomic_t *v)
- {
- int val;
- CPU_SR_ALLOC();
- CPU_CRITICAL_ENTER();
- val = v->counter;
- v->counter = val -= i;
- CPU_CRITICAL_EXIT();
- return val;
- }
- static inline int atomic_set(atomic_t *v, int i)
- {
- int val = 0;
- CPU_SR_ALLOC();
- CPU_CRITICAL_ENTER();
- v->counter = i;
- CPU_CRITICAL_EXIT();
- return val;
- }
- #define DEFINE_ATOMIC(x) \
- atomic_t x = {.counter = 0}
- #define atomic_add(i, v) atomic_add_return(i, v)
- #define atomic_sub(i, v) atomic_sub_return(i, v)
- #define atomic_read(v) arch_atomic_read(v)
- /*#define atomic_set(v,i) (((v)->counter) = (i))*/
- #define atomic_inc(v) atomic_add(1, v)
- #define atomic_dec(v) atomic_sub(1, v)
- #define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0)
- #define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0)
- #define atomic_inc_return(v) (atomic_add_return(1, v))
- #define atomic_dec_return(v) (atomic_sub_return(1, v))
- #define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
- #define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0)
- #endif
|