threading-posix.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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, long new_val)
  42. {
  43. return __atomic_compare_exchange_n(val, &old_val, new_val, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
  44. }
  45. static inline bool os_atomic_compare_exchange_long(volatile long *val, long *old_val, long new_val)
  46. {
  47. return __atomic_compare_exchange_n(val, old_val, new_val, false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
  48. }
  49. static inline void os_atomic_store_bool(volatile bool *ptr, bool val)
  50. {
  51. __atomic_store_n(ptr, val, __ATOMIC_SEQ_CST);
  52. }
  53. static inline bool os_atomic_set_bool(volatile bool *ptr, bool val)
  54. {
  55. return __atomic_exchange_n(ptr, val, __ATOMIC_SEQ_CST);
  56. }
  57. static inline bool os_atomic_exchange_bool(volatile bool *ptr, bool val)
  58. {
  59. return os_atomic_set_bool(ptr, val);
  60. }
  61. static inline bool os_atomic_load_bool(const volatile bool *ptr)
  62. {
  63. return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
  64. }