Baselib_Atomic_Macros.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #pragma once
  2. #include "Baselib_Alignment.h"
  3. //
  4. // order - relaxed, acquire, release, acq_rel, seq_cst
  5. //
  6. // MACRO_(order, ...)
  7. //
  8. #define Baselib_Atomic_FOR_EACH_MEMORY_ORDER(MACRO_, ...) \
  9. DETAIL__Baselib_Atomic_EVAL(MACRO_(relaxed, __VA_ARGS__)) \
  10. DETAIL__Baselib_Atomic_EVAL(MACRO_(acquire, __VA_ARGS__)) \
  11. DETAIL__Baselib_Atomic_EVAL(MACRO_(release, __VA_ARGS__)) \
  12. DETAIL__Baselib_Atomic_EVAL(MACRO_(acq_rel, __VA_ARGS__)) \
  13. DETAIL__Baselib_Atomic_EVAL(MACRO_(seq_cst, __VA_ARGS__))
  14. //
  15. // operation - load, store, fetch_add, fetch_and, fetch_or, fetch_xor, exchange, compare_exchange_weak, compare_exchange_strong
  16. // order - relaxed, acquire, release, acq_rel, seq_cst
  17. // order_success - relaxed, acquire, release, acq_rel, seq_cst
  18. // order_failure - relaxed, acquire, seq_cst
  19. //
  20. // LOAD_MACRO_(operation, order, ...)
  21. // STORE_MACRO_(operation, order, ...)
  22. // ADD_MACRO_(operation, order, ...)
  23. // AND_MACRO_(operation, order, ...)
  24. // OR_MACRO_(operation, order, ...)
  25. // XOR_MACRO_(operation, order, ...)
  26. // XCHG_MACRO_(operation, order, ...)
  27. // CMP_XCHG_WEAK_MACRO_(operation, order_success, order_failure, ...)
  28. // CMP_XCHG_STRONG_MACRO_(operation, order_success, order_failure, ...)
  29. //
  30. #define Baselib_Atomic_FOR_EACH_ATOMIC_OP_AND_MEMORY_ORDER(LOAD_MACRO_, STORE_MACRO_, ADD_MACRO_, AND_MACRO_, OR_MACRO_, XOR_MACRO_, XCHG_MACRO_, CMP_XCHG_WEAK_MACRO_, CMP_XCHG_STRONG_MACRO_, ...) \
  31. DETAIL__Baselib_Atomic_FOR_EACH_LOAD_MEMORY_ORDER(LOAD_MACRO_, load, __VA_ARGS__) \
  32. DETAIL__Baselib_Atomic_FOR_EACH_STORE_MEMORY_ORDER(STORE_MACRO_, store, __VA_ARGS__) \
  33. DETAIL__Baselib_Atomic_FOR_EACH_LOAD_STORE_MEMORY_ORDER(ADD_MACRO_, fetch_add, __VA_ARGS__) \
  34. DETAIL__Baselib_Atomic_FOR_EACH_LOAD_STORE_MEMORY_ORDER(AND_MACRO_, fetch_and, __VA_ARGS__) \
  35. DETAIL__Baselib_Atomic_FOR_EACH_LOAD_STORE_MEMORY_ORDER(OR_MACRO_, fetch_or, __VA_ARGS__) \
  36. DETAIL__Baselib_Atomic_FOR_EACH_LOAD_STORE_MEMORY_ORDER(XOR_MACRO_, fetch_xor, __VA_ARGS__) \
  37. DETAIL__Baselib_Atomic_FOR_EACH_LOAD_STORE_MEMORY_ORDER(XCHG_MACRO_, exchange, __VA_ARGS__) \
  38. DETAIL__Baselib_Atomic_FOR_EACH_CMP_XCHG_MEMORY_ORDER(CMP_XCHG_WEAK_MACRO_, compare_exchange_weak, __VA_ARGS__) \
  39. DETAIL__Baselib_Atomic_FOR_EACH_CMP_XCHG_MEMORY_ORDER(CMP_XCHG_STRONG_MACRO_, compare_exchange_strong, __VA_ARGS__)
  40. //
  41. // LOAD_MACRO_(operation, order, ...)
  42. // STORE_MACRO_(operation, order, ...)
  43. // LOAD_STORE_MACRO_(operation, order, ...)
  44. // CMP_XCHG_MACRO_(operation, order_success, order_failure, ...)
  45. //
  46. #define Baselib_Atomic_FOR_EACH_ATOMIC_OP_AND_MEMORY_ORDER2(LOAD_MACRO_, STORE_MACRO_, LOAD_STORE_MACRO_, CMP_XCHG_MACRO_, ...) \
  47. Baselib_Atomic_FOR_EACH_ATOMIC_OP_AND_MEMORY_ORDER( \
  48. LOAD_MACRO_, \
  49. STORE_MACRO_, \
  50. LOAD_STORE_MACRO_, \
  51. LOAD_STORE_MACRO_, \
  52. LOAD_STORE_MACRO_, \
  53. LOAD_STORE_MACRO_, \
  54. LOAD_STORE_MACRO_, \
  55. CMP_XCHG_MACRO_, \
  56. CMP_XCHG_MACRO_, \
  57. __VA_ARGS__)
  58. //
  59. // operation - load, store, fetch_add, fetch_and, fetch_or, fetch_xor, exchange, compare_exchange_weak, compare_exchange_strong
  60. // order - relaxed, acquire, release, acq_rel, seq_cst
  61. // order_success - relaxed, acquire, release, acq_rel, seq_cst
  62. // order_failure - relaxed, acquire, seq_cst
  63. // id - 8, 16, 32, 64
  64. // bits - 8, 16, 32, 64
  65. // int_type - int8_t, int16_t, int32_t, int64_t
  66. //
  67. // LOAD_MACRO_(operation, order, id, bits, int_type, ...)
  68. // STORE_MACRO_(operation, order, id, bits, int_type, ...)
  69. // ADD_MACRO_(operation, order, id, bits, int_type, ...)
  70. // AND_MACRO_(operation, order, id, bits, int_type, ...)
  71. // OR_MACRO_(operation, order, id, bits, int_type, ...)
  72. // XOR_MACRO_(operation, order, id, bits, int_type, ...)
  73. // XCHG_MACRO_(operation, order, id, bits, int_type, ...)
  74. // CMP_XCHG_WEAK_MACRO_(operation, order_success, order_failure, id , bits, int_type, ...)
  75. // CMP_XCHG_STRONG_MACRO_(operation, order_success, order_failure, id , bits, int_type, ...)
  76. //
  77. #define Baselib_Atomic_FOR_EACH_ATOMIC_OP_MEMORY_ORDER_AND_INT_TYPE(LOAD_MACRO_, STORE_MACRO_, ADD_MACRO_, AND_MACRO_, OR_MACRO_, XOR_MACRO_, XCHG_MACRO_, CMP_XCHG_WEAK_MACRO_, CMP_XCHG_STRONG_MACRO_, ...) \
  78. Baselib_Atomic_FOR_EACH_ATOMIC_OP_AND_MEMORY_ORDER(LOAD_MACRO_, STORE_MACRO_, ADD_MACRO_, AND_MACRO_, OR_MACRO_, XOR_MACRO_, XCHG_MACRO_, CMP_XCHG_WEAK_MACRO_, CMP_XCHG_STRONG_MACRO_, 8, 8, int8_t __VA_ARGS__) \
  79. Baselib_Atomic_FOR_EACH_ATOMIC_OP_AND_MEMORY_ORDER(LOAD_MACRO_, STORE_MACRO_, ADD_MACRO_, AND_MACRO_, OR_MACRO_, XOR_MACRO_, XCHG_MACRO_, CMP_XCHG_WEAK_MACRO_, CMP_XCHG_STRONG_MACRO_, 16, 16, int16_t, __VA_ARGS__) \
  80. Baselib_Atomic_FOR_EACH_ATOMIC_OP_AND_MEMORY_ORDER(LOAD_MACRO_, STORE_MACRO_, ADD_MACRO_, AND_MACRO_, OR_MACRO_, XOR_MACRO_, XCHG_MACRO_, CMP_XCHG_WEAK_MACRO_, CMP_XCHG_STRONG_MACRO_, 32, 32, int32_t, __VA_ARGS__) \
  81. Baselib_Atomic_FOR_EACH_ATOMIC_OP_AND_MEMORY_ORDER(LOAD_MACRO_, STORE_MACRO_, ADD_MACRO_, AND_MACRO_, OR_MACRO_, XOR_MACRO_, XCHG_MACRO_, CMP_XCHG_WEAK_MACRO_, CMP_XCHG_STRONG_MACRO_, 64, 64, int64_t, __VA_ARGS__)
  82. //
  83. // operation - load, store, fetch_add, fetch_and, fetch_or, fetch_xor, exchange, compare_exchange_weak, compare_exchange_strong
  84. // order - relaxed, acquire, release, acq_rel, seq_cst
  85. // order_success - relaxed, acquire, release, acq_rel, seq_cst
  86. // order_failure - relaxed, acquire, seq_cst
  87. // id - 8, 16, 32, 64, ptr
  88. // bits - 8, 16, 32, 64
  89. // int_type - int8_t, int16_t, int32_t, int64_t, intptr_t
  90. //
  91. // LOAD_MACRO_(operation, order, id, bits, int_type, ...)
  92. // STORE_MACRO_(operation, order, id, bits, int_type, ...)
  93. // ADD_MACRO_(operation, order, id, bits, int_type, ...)
  94. // AND_MACRO_(operation, order, id, bits, int_type, ...)
  95. // OR_MACRO_(operation, order, id, bits, int_type, ...)
  96. // XOR_MACRO_(operation, order, id, bits, int_type, ...)
  97. // XCHG_MACRO_(operation, order, id, bits, int_type, ...)
  98. // CMP_XCHG_WEAK_MACRO_(operation, order_success, order_failure, id , bits, int_type, ...)
  99. // CMP_XCHG_STRONG_MACRO_(operation, order_success, order_failure, id , bits, int_type, ...)
  100. //
  101. #define Baselib_Atomic_FOR_EACH_ATOMIC_OP_MEMORY_ORDER_AND_TYPE(LOAD_MACRO_, STORE_MACRO_, ADD_MACRO_, AND_MACRO_, OR_MACRO_, XOR_MACRO_, XCHG_MACRO_, CMP_XCHG_WEAK_MACRO_, CMP_XCHG_STRONG_MACRO_, ...) \
  102. Baselib_Atomic_FOR_EACH_ATOMIC_OP_MEMORY_ORDER_AND_INT_TYPE(LOAD_MACRO_, STORE_MACRO_, ADD_MACRO_, AND_MACRO_, OR_MACRO_, XOR_MACRO_, XCHG_MACRO_, CMP_XCHG_WEAK_MACRO_, CMP_XCHG_STRONG_MACRO_, __VA_ARGS__) \
  103. Baselib_Atomic_FOR_EACH_ATOMIC_OP_AND_MEMORY_ORDER(LOAD_MACRO_, STORE_MACRO_, ADD_MACRO_, AND_MACRO_, OR_MACRO_, XOR_MACRO_, XCHG_MACRO_, CMP_XCHG_WEAK_MACRO_, CMP_XCHG_STRONG_MACRO_, ptr, DETAIL__Baselib_Atomic_PTR_SIZE, intptr_t, __VA_ARGS__)
  104. //
  105. // LOAD_MACRO_(operation, order, id, bits, int_type, ...)
  106. // STORE_MACRO_(operation, order, id, bits, int_type, ...)
  107. // LOAD_STORE_MACRO_(operation, order, id, bits, int_type, ...)
  108. // CMP_XCHG_MACRO_(operation, order_success, order_failure, id , bits, int_type, ...)
  109. //
  110. #define Baselib_Atomic_FOR_EACH_ATOMIC_OP_MEMORY_ORDER_AND_TYPE2(LOAD_MACRO_, STORE_MACRO_, LOAD_STORE_MACRO_, CMP_XCHG_MACRO_, ...) \
  111. Baselib_Atomic_FOR_EACH_ATOMIC_OP_MEMORY_ORDER_AND_TYPE( \
  112. LOAD_MACRO_, \
  113. STORE_MACRO_, \
  114. LOAD_STORE_MACRO_, \
  115. LOAD_STORE_MACRO_, \
  116. LOAD_STORE_MACRO_, \
  117. LOAD_STORE_MACRO_, \
  118. LOAD_STORE_MACRO_, \
  119. CMP_XCHG_MACRO_, \
  120. CMP_XCHG_MACRO_, \
  121. __VA_ARGS__)
  122. //
  123. // Implementation details
  124. // ----------------------------------------------------------------------------------
  125. #if PLATFORM_ARCH_64
  126. #define DETAIL__Baselib_Atomic_PTR_SIZE 64
  127. #else
  128. #define DETAIL__Baselib_Atomic_PTR_SIZE 32
  129. #endif
  130. #define DETAIL__Baselib_Atomic_EVAL(...) __VA_ARGS__
  131. #define DETAIL__Baselib_Atomic_FOR_EACH_LOAD_MEMORY_ORDER(MACRO_, OP_, ...) \
  132. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, relaxed, __VA_ARGS__)) \
  133. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, acquire, __VA_ARGS__)) \
  134. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, seq_cst, __VA_ARGS__))
  135. #define DETAIL__Baselib_Atomic_FOR_EACH_STORE_MEMORY_ORDER(MACRO_, OP_, ...) \
  136. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, relaxed, __VA_ARGS__)) \
  137. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, release, __VA_ARGS__)) \
  138. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, seq_cst, __VA_ARGS__))
  139. #define DETAIL__Baselib_Atomic_FOR_EACH_LOAD_STORE_MEMORY_ORDER(MACRO_, OP_, ...) \
  140. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, relaxed, __VA_ARGS__)) \
  141. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, acquire, __VA_ARGS__)) \
  142. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, release, __VA_ARGS__)) \
  143. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, acq_rel, __VA_ARGS__)) \
  144. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, seq_cst, __VA_ARGS__))
  145. #define DETAIL__Baselib_Atomic_FOR_EACH_CMP_XCHG_MEMORY_ORDER(MACRO_, OP_, ...) \
  146. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, relaxed, relaxed, __VA_ARGS__)) \
  147. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, acquire, relaxed, __VA_ARGS__)) \
  148. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, acquire, acquire, __VA_ARGS__)) \
  149. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, release, relaxed, __VA_ARGS__)) \
  150. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, acq_rel, relaxed, __VA_ARGS__)) \
  151. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, acq_rel, acquire, __VA_ARGS__)) \
  152. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, seq_cst, relaxed, __VA_ARGS__)) \
  153. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, seq_cst, acquire, __VA_ARGS__)) \
  154. DETAIL__Baselib_Atomic_EVAL(MACRO_(OP_, seq_cst, seq_cst, __VA_ARGS__))