git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'master' into isa/arm64
[lunaix-os.git]
/
lunaix-os
/
includes
/
lunaix
/
ds
/
mutex.h
diff --git
a/lunaix-os/includes/lunaix/ds/mutex.h
b/lunaix-os/includes/lunaix/ds/mutex.h
index 5e166e55ac2456c503e559caaef0b5a19ca193e3..510f1fb6b13a2825c4154a9cf23c60fa917064b0 100644
(file)
--- a/
lunaix-os/includes/lunaix/ds/mutex.h
+++ b/
lunaix-os/includes/lunaix/ds/mutex.h
@@
-1,26
+1,40
@@
#ifndef __LUNAIX_MUTEX_H
#define __LUNAIX_MUTEX_H
#ifndef __LUNAIX_MUTEX_H
#define __LUNAIX_MUTEX_H
-#include "semaphore.h"
+#include <lunaix/types.h>
+#include <stdatomic.h>
+
+typedef struct mutex_s
+{
+ atomic_ulong 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);
#endif /* __LUNAIX_MUTEX_H */
#endif /* __LUNAIX_MUTEX_H */