atomic.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #ifndef ATOMIC_H
  2. #define ATOMIC_H
  3. #include "cpu.h"
  4. #include "irq.h"
  5. typedef struct {
  6. int counter;
  7. } atomic_t;
  8. static inline int atomic_add_return(int i, atomic_t *v)
  9. {
  10. int val;
  11. CPU_SR_ALLOC();
  12. CPU_CRITICAL_ENTER();
  13. val = v->counter;
  14. v->counter = val += i;
  15. CPU_CRITICAL_EXIT();
  16. return val;
  17. }
  18. static inline int atomic_sub_return(int i, atomic_t *v)
  19. {
  20. int val;
  21. CPU_SR_ALLOC();
  22. CPU_CRITICAL_ENTER();
  23. val = v->counter;
  24. v->counter = val -= i;
  25. CPU_CRITICAL_EXIT();
  26. return val;
  27. }
  28. static inline int atomic_set(atomic_t *v, int i)
  29. {
  30. int val = 0;
  31. CPU_SR_ALLOC();
  32. CPU_CRITICAL_ENTER();
  33. v->counter = i;
  34. CPU_CRITICAL_EXIT();
  35. return val;
  36. }
  37. #define DEFINE_ATOMIC(x) \
  38. atomic_t x = {.counter = 0}
  39. #define atomic_add(i, v) atomic_add_return(i, v)
  40. #define atomic_sub(i, v) atomic_sub_return(i, v)
  41. #define atomic_read(v) arch_atomic_read(v)
  42. /*#define atomic_set(v,i) (((v)->counter) = (i))*/
  43. #define atomic_inc(v) atomic_add(1, v)
  44. #define atomic_dec(v) atomic_sub(1, v)
  45. #define atomic_inc_and_test(v) (atomic_add_return(1, v) == 0)
  46. #define atomic_dec_and_test(v) (atomic_sub_return(1, v) == 0)
  47. #define atomic_inc_return(v) (atomic_add_return(1, v))
  48. #define atomic_dec_return(v) (atomic_sub_return(1, v))
  49. #define atomic_sub_and_test(i, v) (atomic_sub_return(i, v) == 0)
  50. #define atomic_add_negative(i,v) (atomic_add_return(i, v) < 0)
  51. #endif