threading-posix.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * Copyright (c) 2023 Lain Bailey <[email protected]>
  3. *
  4. * Permission to use, copy, modify, and distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #pragma once
  17. static inline long os_atomic_inc_long(volatile long *val)
  18. {
  19. return __atomic_add_fetch(val, 1, __ATOMIC_SEQ_CST);
  20. }
  21. static inline long os_atomic_dec_long(volatile long *val)
  22. {
  23. return __atomic_sub_fetch(val, 1, __ATOMIC_SEQ_CST);
  24. }
  25. static inline void os_atomic_store_long(volatile long *ptr, long val)
  26. {
  27. __atomic_store_n(ptr, val, __ATOMIC_SEQ_CST);
  28. }
  29. static inline long os_atomic_set_long(volatile long *ptr, long val)
  30. {
  31. return __atomic_exchange_n(ptr, val, __ATOMIC_SEQ_CST);
  32. }
  33. static inline long os_atomic_exchange_long(volatile long *ptr, long val)
  34. {
  35. return os_atomic_set_long(ptr, val);
  36. }
  37. static inline long os_atomic_load_long(const volatile long *ptr)
  38. {
  39. return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
  40. }
  41. static inline bool os_atomic_compare_swap_long(volatile long *val, long old_val,
  42. long new_val)
  43. {
  44. return __atomic_compare_exchange_n(val, &old_val, new_val, false,
  45. __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
  46. }
  47. static inline bool os_atomic_compare_exchange_long(volatile long *val,
  48. long *old_val, long new_val)
  49. {
  50. return __atomic_compare_exchange_n(val, old_val, new_val, false,
  51. __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
  52. }
  53. static inline void os_atomic_store_bool(volatile bool *ptr, bool val)
  54. {
  55. __atomic_store_n(ptr, val, __ATOMIC_SEQ_CST);
  56. }
  57. static inline bool os_atomic_set_bool(volatile bool *ptr, bool val)
  58. {
  59. return __atomic_exchange_n(ptr, val, __ATOMIC_SEQ_CST);
  60. }
  61. static inline bool os_atomic_exchange_bool(volatile bool *ptr, bool val)
  62. {
  63. return os_atomic_set_bool(ptr, val);
  64. }
  65. static inline bool os_atomic_load_bool(const volatile bool *ptr)
  66. {
  67. return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
  68. }