X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/270869139db617e29a35bb9ded41087bb702f9ac..HEAD:/lunaix-os/kernel/ds/mutex.c diff --git a/lunaix-os/kernel/ds/mutex.c b/lunaix-os/kernel/ds/mutex.c index a27c8db..4aac422 100644 --- a/lunaix-os/kernel/ds/mutex.c +++ b/lunaix-os/kernel/ds/mutex.c @@ -2,6 +2,12 @@ #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) { @@ -15,8 +21,7 @@ __mutext_lock(mutex_t* mutex) preempt_current(); } - atomic_fetch_add(&mutex->lk, 1); - mutex->owner = __current->pid; + __do_lock(mutex); } static inline void must_inline @@ -32,6 +37,16 @@ mutex_lock(mutex_t* mutex) __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) { @@ -44,7 +59,7 @@ mutex_unlock_for(mutex_t* mutex, pid_t pid) if (mutex->owner != pid || !atomic_load(&mutex->lk)) { return; } - __mutext_unlock(mutex); + atomic_fetch_sub(&mutex->lk, 1); } void