#ifndef CX_ZIVUOS_MUTEX_H_INCLUDED #define CX_ZIVUOS_MUTEX_H_INCLUDED #include #include typedef volatile enum zv_mutex_e { ZV_MUTEX_FREE, ZV_MUTEX_LOCKED } zv_mutex_t; static inline bool zv_mutex_try_lock(zv_mutex_t *self) { zv_mutex_t required = ZV_MUTEX_FREE; return __atomic_compare_exchange_n( self, &required, ZV_MUTEX_LOCKED, false, __ATOMIC_ACQ_REL, __ATOMIC_ACQUIRE ); } static inline bool zv_mutex_is_free(zv_mutex_t *self) { return __atomic_load_n(self, __ATOMIC_ACQUIRE) == ZV_MUTEX_FREE; } static inline void zv_mutex_unlock(zv_mutex_t *self) { __atomic_store_n(self, ZV_MUTEX_FREE, __ATOMIC_RELEASE); } #endif