Fix file system racing and ext2 directory insertion (#58)
[lunaix-os.git] / lunaix-os / includes / lunaix / ds / mutex.h
index 5e166e55ac2456c503e559caaef0b5a19ca193e3..304cc6de7cb1ae5a6830cf2722b9acd89a0fa648 100644 (file)
@@ -1,26 +1,43 @@
 #ifndef __LUNAIX_MUTEX_H
 #define __LUNAIX_MUTEX_H
 
-#include "semaphore.h"
+#include <lunaix/types.h>
+#include <stdatomic.h>
+
+typedef struct mutex_s
+{
+    atomic_uint lk;
+    pid_t owner;
+} mutex_t;
+
+static inline void
+mutex_init(mutex_t* mutex)
+{
+    mutex->lk = ATOMIC_VAR_INIT(0);
+}
 
-// TODO: implement mutex lock
+static inline int
+mutex_on_hold(mutex_t* mutex)
+{
+    return atomic_load(&mutex->lk);
+}
 
-typedef struct sem_t mutex_t;
+void
+mutex_lock(mutex_t* mutex);
 
-static inline void mutex_init(mutex_t *mutex) {
-    sem_init(mutex, 1);
-}
+void
+mutex_unlock(mutex_t* mutex);
 
-static inline unsigned int mutex_on_hold(mutex_t *mutex) {
-    return !atomic_load(&mutex->counter);
-}
+void
+mutex_lock_nested(mutex_t* mutex);
 
-static inline void mutex_lock(mutex_t *mutex) {
-    sem_wait(mutex);
-}
+void
+mutex_unlock_nested(mutex_t* mutex);
 
-static inline void mutex_unlock(mutex_t *mutex) {
-    sem_post(mutex);
-}
+void
+mutex_unlock_for(mutex_t* mutex, pid_t pid);
+
+bool
+mutex_trylock(mutex_t* mutex);
 
 #endif /* __LUNAIX_MUTEX_H */