1 #include <lunaix/ds/mutex.h>
2 #include <lunaix/process.h>
3 #include <lunaix/kpreempt.h>
5 static inline bool must_inline
6 __mutex_check_owner(mutex_t* mutex)
8 return mutex->owner == __current->pid;
11 static inline void must_inline
12 __mutext_lock(mutex_t* mutex)
14 while (atomic_load(&mutex->lk)) {
18 atomic_fetch_add(&mutex->lk, 1);
19 mutex->owner = __current->pid;
22 static inline void must_inline
23 __mutext_unlock(mutex_t* mutex)
25 if (__mutex_check_owner(mutex))
26 atomic_fetch_sub(&mutex->lk, 1);
30 mutex_lock(mutex_t* mutex)
36 mutex_unlock(mutex_t* mutex)
38 __mutext_unlock(mutex);
42 mutex_unlock_for(mutex_t* mutex, pid_t pid)
44 if (mutex->owner != pid || !atomic_load(&mutex->lk)) {
47 __mutext_unlock(mutex);
51 mutex_lock_nested(mutex_t* mutex)
53 if (atomic_load(&mutex->lk) && __mutex_check_owner(mutex)) {
54 atomic_fetch_add(&mutex->lk, 1);
62 mutex_unlock_nested(mutex_t* mutex)
64 mutex_unlock_for(mutex, __current->pid);