mutex.h 735 B

123456789101112131415161718192021222324252627282930313233
  1. #ifndef CX_ZIVUOS_MUTEX_H_INCLUDED
  2. #define CX_ZIVUOS_MUTEX_H_INCLUDED
  3. #include <stdint.h>
  4. #include <stdbool.h>
  5. typedef volatile enum zv_mutex_e {
  6. ZV_MUTEX_FREE,
  7. ZV_MUTEX_LOCKED
  8. } zv_mutex_t;
  9. static inline bool zv_mutex_try_lock(zv_mutex_t *self) {
  10. zv_mutex_t required = ZV_MUTEX_FREE;
  11. return __atomic_compare_exchange_n(
  12. self,
  13. &required,
  14. ZV_MUTEX_LOCKED,
  15. false,
  16. __ATOMIC_ACQ_REL,
  17. __ATOMIC_ACQUIRE
  18. );
  19. }
  20. static inline bool zv_mutex_is_free(zv_mutex_t *self) {
  21. return __atomic_load_n(self, __ATOMIC_ACQUIRE) == ZV_MUTEX_FREE;
  22. }
  23. static inline void zv_mutex_unlock(zv_mutex_t *self) {
  24. __atomic_store_n(self, ZV_MUTEX_FREE, __ATOMIC_RELEASE);
  25. }
  26. #endif