fix dependency check logic cause config always disabled
[lunaix-os.git] / lunaix-os / kernel / ds / mutex.c
index a27c8db6163f36e91e12c719259fce81e1d17548..4aac422191e5f3cc21721e18c59c7e9ba23c2642 100644 (file)
@@ -2,6 +2,12 @@
 #include <lunaix/process.h>
 #include <lunaix/kpreempt.h>
 
 #include <lunaix/process.h>
 #include <lunaix/kpreempt.h>
 
+#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)
 {
 static inline bool must_inline
 __mutex_check_owner(mutex_t* mutex)
 {
@@ -15,8 +21,7 @@ __mutext_lock(mutex_t* mutex)
         preempt_current();
     }
 
         preempt_current();
     }
 
-    atomic_fetch_add(&mutex->lk, 1);
-    mutex->owner = __current->pid;
+    __do_lock(mutex);
 }
 
 static inline void must_inline
 }
 
 static inline void must_inline
@@ -32,6 +37,16 @@ mutex_lock(mutex_t* mutex)
     __mutext_lock(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)
 {
 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;
     }
     if (mutex->owner != pid || !atomic_load(&mutex->lk)) {
         return;
     }
-    __mutext_unlock(mutex);
+    atomic_fetch_sub(&mutex->lk, 1);
 }
 
 void
 }
 
 void