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
Fix file system racing and ext2 directory insertion (#58)
[lunaix-os.git]
/
lunaix-os
/
kernel
/
ds
/
mutex.c
diff --git
a/lunaix-os/kernel/ds/mutex.c
b/lunaix-os/kernel/ds/mutex.c
index 41e131d6d57db71bdfec25a412bf125da10dde45..4aac422191e5f3cc21721e18c59c7e9ba23c2642 100644
(file)
--- a/
lunaix-os/kernel/ds/mutex.c
+++ b/
lunaix-os/kernel/ds/mutex.c
@@
-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)
{