1 #include <lunaix/ds/mutex.h>
2 #include <lunaix/process.h>
3 #include <lunaix/kpreempt.h>
5 #define __do_lock(mutext) \
7 atomic_fetch_add(&mutex->lk, 1);\
8 mutex->owner = __current->pid; \
11 static inline bool must_inline
12 __mutex_check_owner(mutex_t* mutex)
14 return mutex->owner == __current->pid;
17 static inline void must_inline
18 __mutext_lock(mutex_t* mutex)
20 while (atomic_load(&mutex->lk)) {
27 static inline void must_inline
28 __mutext_unlock(mutex_t* mutex)
30 if (__mutex_check_owner(mutex))
31 atomic_fetch_sub(&mutex->lk, 1);
35 mutex_lock(mutex_t* mutex)
41 mutex_trylock(mutex_t* mutex)
43 if (atomic_load(&mutex->lk))
51 mutex_unlock(mutex_t* mutex)
53 __mutext_unlock(mutex);
57 mutex_unlock_for(mutex_t* mutex, pid_t pid)
59 if (mutex->owner != pid || !atomic_load(&mutex->lk)) {
62 atomic_fetch_sub(&mutex->lk, 1);
66 mutex_lock_nested(mutex_t* mutex)
68 if (atomic_load(&mutex->lk) && __mutex_check_owner(mutex)) {
69 atomic_fetch_add(&mutex->lk, 1);
77 mutex_unlock_nested(mutex_t* mutex)
79 mutex_unlock_for(mutex, __current->pid);