Atomic-c-api.h 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #pragma once
  2. #include "il2cpp-config-platforms.h"
  3. #include <stdint.h>
  4. #include "Baselib.h"
  5. #include "C/Baselib_Atomic_TypeSafe.h"
  6. inline void UnityPalFullMemoryBarrier()
  7. {
  8. Baselib_atomic_thread_fence_seq_cst();
  9. }
  10. inline int32_t UnityPalAdd(int32_t* location1, int32_t value)
  11. {
  12. return Baselib_atomic_fetch_add_32_seq_cst(location1, value) + value;
  13. }
  14. #if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT
  15. inline int64_t UnityPalAdd64(int64_t* location1, int64_t value)
  16. {
  17. return Baselib_atomic_fetch_add_64_seq_cst(location1, value) + value;
  18. }
  19. #endif
  20. inline int32_t UnityPalIncrement(int32_t* value)
  21. {
  22. return Baselib_atomic_fetch_add_32_seq_cst(value, 1) + 1;
  23. }
  24. #if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT
  25. inline int64_t UnityPalIncrement64(int64_t* value)
  26. {
  27. return Baselib_atomic_fetch_add_64_seq_cst(value, 1) + 1;
  28. }
  29. #endif
  30. inline int32_t UnityPalDecrement(int32_t* value)
  31. {
  32. return Baselib_atomic_fetch_add_32_seq_cst(value, -1) - 1;
  33. }
  34. #if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT
  35. inline int64_t UnityPalDecrement64(int64_t* value)
  36. {
  37. return Baselib_atomic_fetch_add_64_seq_cst(value, -1) - 1;
  38. }
  39. #endif
  40. inline int32_t UnityPalCompareExchange(int32_t* dest, int32_t exchange, int32_t comparand)
  41. {
  42. Baselib_atomic_compare_exchange_strong_32_seq_cst_seq_cst(dest, &comparand, exchange);
  43. return comparand;
  44. }
  45. inline int64_t UnityPalCompareExchange64(int64_t* dest, int64_t exchange, int64_t comparand)
  46. {
  47. Baselib_atomic_compare_exchange_strong_64_seq_cst_seq_cst(dest, &comparand, exchange);
  48. return comparand;
  49. }
  50. inline void* UnityPalCompareExchangePointer(void* volatile* dest, void* exchange, void* comparand)
  51. {
  52. Baselib_atomic_compare_exchange_strong_ptr_seq_cst_seq_cst((intptr_t*)dest, (intptr_t*)&comparand, (intptr_t)exchange);
  53. return comparand;
  54. }
  55. inline int32_t UnityPalExchange(int32_t* dest, int32_t exchange)
  56. {
  57. return Baselib_atomic_exchange_32_seq_cst(dest, exchange);
  58. }
  59. #if IL2CPP_ENABLE_INTERLOCKED_64_REQUIRED_ALIGNMENT
  60. inline int64_t UnityPalExchange64(int64_t* dest, int64_t exchange)
  61. {
  62. return Baselib_atomic_exchange_64_seq_cst(dest, exchange);
  63. }
  64. #endif
  65. inline void* UnityPalExchangePointer(void* volatile* dest, void* exchange)
  66. {
  67. return (void*)Baselib_atomic_exchange_ptr_seq_cst((intptr_t*)dest, (intptr_t)exchange);
  68. }
  69. inline int64_t UnityPalRead64(int64_t* addr)
  70. {
  71. return Baselib_atomic_fetch_add_64_seq_cst(addr, 0);
  72. }
  73. inline intptr_t UnityPalReadPtrVal(intptr_t* addr)
  74. {
  75. return Baselib_atomic_fetch_add_ptr_seq_cst(addr, 0);
  76. }