atomic.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /**
  2. * @file atomic.h
  3. * @author fslongjin ([email protected])
  4. * @brief 原子变量
  5. * @version 0.1
  6. * @date 2022-04-12
  7. *
  8. * @copyright Copyright (c) 2022
  9. *
  10. */
  11. #pragma once
  12. #define atomic_read(atomic) ((atomic)->value) // 读取原子变量
  13. #define atomic_set(atomic,val) (((atomic)->value) = (val)) // 设置原子变量的初始值
  14. typedef struct
  15. {
  16. volatile long value;
  17. } atomic_t;
  18. /**
  19. * @brief 原子变量增加值
  20. *
  21. * @param ato 原子变量对象
  22. * @param val 要增加的值
  23. */
  24. inline void atomic_add(atomic_t *ato, long val)
  25. {
  26. asm volatile("lock addq %1, %0 \n\t"
  27. : "=m"(ato->value)
  28. : "m"(val)
  29. : "memory");
  30. }
  31. /**
  32. * @brief 原子变量减少值
  33. *
  34. * @param ato 原子变量对象
  35. * @param val 要减少的值
  36. */
  37. inline void atomic_sub(atomic_t *ato, long val)
  38. {
  39. asm volatile("lock subq %1, %0 \n\t"
  40. : "=m"(ato->value)
  41. : "m"(val)
  42. : "memory");
  43. }
  44. /**
  45. * @brief 原子变量自增
  46. *
  47. * @param ato 原子变量对象
  48. */
  49. void atomic_inc(atomic_t *ato)
  50. {
  51. asm volatile("lock incq %0 \n\t"
  52. : "=m"(ato->value)
  53. : "m"(ato->value)
  54. : "memory");
  55. }
  56. /**
  57. * @brief 原子变量自减
  58. *
  59. * @param ato 原子变量对象
  60. */
  61. void atomic_dec(atomic_t *ato)
  62. {
  63. asm volatile("lock decq %0 \n\t"
  64. : "=m"(ato->value)
  65. : "m"(ato->value)
  66. : "memory");
  67. }
  68. /**
  69. * @brief 设置原子变量的mask
  70. *
  71. * @param ato 原子变量对象
  72. */
  73. inline void atomic_set_mask(atomic_t *ato, long mask)
  74. {
  75. __asm__ __volatile__("lock orq %1, %0 \n\t"
  76. : "=m"(ato->value)
  77. : "r"(mask)
  78. : "memory");
  79. }
  80. /**
  81. * @brief 清除原子变量的mask
  82. *
  83. * @param ato 原子变量对象
  84. */
  85. inline void atomic_clear_mask(atomic_t *ato, long mask)
  86. {
  87. __asm__ __volatile__("lock andq %1, %0 \n\t"
  88. : "=m"(ato->value)
  89. : "r"(mask)
  90. : "memory");
  91. }