X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/a0655e5d30f3cdc73b1aaaa4825d8fae9f92ce4a..ec4ff182252b6d7b3cb81f4fa783c5348a6c30fd:/lunaix-os/includes/lunaix/ds/mutex.h diff --git a/lunaix-os/includes/lunaix/ds/mutex.h b/lunaix-os/includes/lunaix/ds/mutex.h index 5e166e5..304cc6d 100644 --- a/lunaix-os/includes/lunaix/ds/mutex.h +++ b/lunaix-os/includes/lunaix/ds/mutex.h @@ -1,26 +1,43 @@ #ifndef __LUNAIX_MUTEX_H #define __LUNAIX_MUTEX_H -#include "semaphore.h" +#include +#include + +typedef struct mutex_s +{ + atomic_uint lk; + pid_t owner; +} mutex_t; + +static inline void +mutex_init(mutex_t* mutex) +{ + mutex->lk = ATOMIC_VAR_INIT(0); +} -// TODO: implement mutex lock +static inline int +mutex_on_hold(mutex_t* mutex) +{ + return atomic_load(&mutex->lk); +} -typedef struct sem_t mutex_t; +void +mutex_lock(mutex_t* mutex); -static inline void mutex_init(mutex_t *mutex) { - sem_init(mutex, 1); -} +void +mutex_unlock(mutex_t* mutex); -static inline unsigned int mutex_on_hold(mutex_t *mutex) { - return !atomic_load(&mutex->counter); -} +void +mutex_lock_nested(mutex_t* mutex); -static inline void mutex_lock(mutex_t *mutex) { - sem_wait(mutex); -} +void +mutex_unlock_nested(mutex_t* mutex); -static inline void mutex_unlock(mutex_t *mutex) { - sem_post(mutex); -} +void +mutex_unlock_for(mutex_t* mutex, pid_t pid); + +bool +mutex_trylock(mutex_t* mutex); #endif /* __LUNAIX_MUTEX_H */