summaryrefslogtreecommitdiffstats
path: root/src/lib/syscall_mutex.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/syscall_mutex.C')
-rw-r--r--src/lib/syscall_mutex.C33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/lib/syscall_mutex.C b/src/lib/syscall_mutex.C
new file mode 100644
index 000000000..8ac392792
--- /dev/null
+++ b/src/lib/syscall_mutex.C
@@ -0,0 +1,33 @@
+#include <sys/mutex.h>
+#include <sys/syscall.h>
+#include <kernel/usermutex.H>
+
+using namespace Systemcalls;
+
+mutex_t mutex_create()
+{
+ return (mutex_t) _syscall0(MUTEX_CREATE);
+}
+
+int mutex_destroy(mutex_t m)
+{
+ return (int64_t)_syscall1(MUTEX_DESTROY, m);
+}
+
+int mutex_lock(mutex_t m)
+{
+ uint64_t oldvalue = __sync_fetch_and_add(&((UserMutex*)m)->value, 1);
+ if (0 == oldvalue)
+ return 0;
+ else
+ return (int64_t)_syscall1(MUTEX_LOCK_CONTESTED, m);
+}
+
+int mutex_unlock(mutex_t m)
+{
+ uint64_t oldvalue = __sync_fetch_and_sub(&((UserMutex*)m)->value, 1);
+ if (1 == oldvalue)
+ return 0;
+ else
+ return (int64_t)_syscall1(MUTEX_UNLOCK_CONTESTED, m);
+}
OpenPOWER on IntegriCloud