X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/ea77b9c3fc7fb9bf9d7f9604fc187c8049212a2a..084eac3d5fa7deeab2296cf20653f4f7b3f75cd0:/lunaix-os/kernel/ds/mutex.c diff --git a/lunaix-os/kernel/ds/mutex.c b/lunaix-os/kernel/ds/mutex.c index 7bfbf10..4aac422 100644 --- a/lunaix-os/kernel/ds/mutex.c +++ b/lunaix-os/kernel/ds/mutex.c @@ -1,24 +1,80 @@ #include #include +#include + +#define __do_lock(mutext) \ + ({ \ + atomic_fetch_add(&mutex->lk, 1);\ + mutex->owner = __current->pid; \ + }) + +static inline bool must_inline +__mutex_check_owner(mutex_t* mutex) +{ + return mutex->owner == __current->pid; +} + +static inline void must_inline +__mutext_lock(mutex_t* mutex) +{ + while (atomic_load(&mutex->lk)) { + preempt_current(); + } + + __do_lock(mutex); +} + +static inline void must_inline +__mutext_unlock(mutex_t* mutex) +{ + if (__mutex_check_owner(mutex)) + atomic_fetch_sub(&mutex->lk, 1); +} void mutex_lock(mutex_t* mutex) { - sem_wait(&mutex->sem); - mutex->owner = __current->pid; + __mutext_lock(mutex); +} + +bool +mutex_trylock(mutex_t* mutex) +{ + if (atomic_load(&mutex->lk)) + return false; + + __do_lock(mutex); + return true; } void mutex_unlock(mutex_t* mutex) { - mutex_unlock_for(mutex, __current->pid); + __mutext_unlock(mutex); } void mutex_unlock_for(mutex_t* mutex, pid_t pid) { - if (mutex->owner != pid) { + if (mutex->owner != pid || !atomic_load(&mutex->lk)) { + return; + } + atomic_fetch_sub(&mutex->lk, 1); +} + +void +mutex_lock_nested(mutex_t* mutex) +{ + if (atomic_load(&mutex->lk) && __mutex_check_owner(mutex)) { + atomic_fetch_add(&mutex->lk, 1); return; } - sem_post(&mutex->sem); + + __mutext_lock(mutex); +} + +void +mutex_unlock_nested(mutex_t* mutex) +{ + mutex_unlock_for(mutex, __current->pid); } \ No newline at end of file