mutex.c 621 B

12345678910111213141516171819202122232425262728293031
  1. #include <stdint.h>
  2. #include <stdbool.h>
  3. #include "mutex.h"
  4. enum zv_mutex_e zv_mutex_create() {
  5. return ZV_MUTEX_FREE;
  6. }
  7. bool zv_mutex_try_lock(zv_mutex_t *self) {
  8. zv_mutex_t required = ZV_MUTEX_FREE;
  9. return __atomic_compare_exchange_n(
  10. self,
  11. (void *) &required,
  12. ZV_MUTEX_LOCKED,
  13. false,
  14. __ATOMIC_ACQ_REL,
  15. __ATOMIC_ACQUIRE
  16. );
  17. }
  18. bool zv_mutex_is_free(zv_mutex_t *self) {
  19. return __atomic_load_n(self, __ATOMIC_ACQUIRE) == ZV_MUTEX_FREE;
  20. }
  21. void zv_mutex_unlock(zv_mutex_t *self) {
  22. __atomic_store_n(self, ZV_MUTEX_FREE, __ATOMIC_RELEASE);
  23. }