diff options
Diffstat (limited to 'src/lib/syscall_mutex.C')
-rw-r--r-- | src/lib/syscall_mutex.C | 33 |
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); +} |