diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-06-11 21:40:31 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-06-11 21:40:31 -0500 |
commit | 24e81bc664f5cdbfc8be1badf00b025ec122af00 (patch) | |
tree | 2d41e3305fb903024541d105dfec6adf1824839a /src/include | |
parent | 165e6bed506f9fddd7e9da8ad1f4c7f186e29b00 (diff) | |
download | talos-hostboot-24e81bc664f5cdbfc8be1badf00b025ec122af00.tar.gz talos-hostboot-24e81bc664f5cdbfc8be1badf00b025ec122af00.zip |
Add mutex userspace / syscalls.
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/kernel/syscalls.H | 5 | ||||
-rw-r--r-- | src/include/kernel/usermutex.H | 16 | ||||
-rw-r--r-- | src/include/sys/mutex.h | 20 | ||||
-rw-r--r-- | src/include/sys/task.h | 8 | ||||
-rw-r--r-- | src/include/util/locked/lock.H | 20 | ||||
-rw-r--r-- | src/include/util/locked/queue.H | 33 |
6 files changed, 90 insertions, 12 deletions
diff --git a/src/include/kernel/syscalls.H b/src/include/kernel/syscalls.H index 826ac93b9..ebe7d0059 100644 --- a/src/include/kernel/syscalls.H +++ b/src/include/kernel/syscalls.H @@ -10,6 +10,11 @@ namespace Systemcalls TASK_END, TASK_GETTID, + MUTEX_CREATE, + MUTEX_DESTROY, + MUTEX_LOCK_CONTESTED, + MUTEX_UNLOCK_CONTESTED, + SYSCALL_MAX }; }; diff --git a/src/include/kernel/usermutex.H b/src/include/kernel/usermutex.H new file mode 100644 index 000000000..3dcd904b4 --- /dev/null +++ b/src/include/kernel/usermutex.H @@ -0,0 +1,16 @@ +#ifndef __KERNEL_USERMUTEX_H +#define __KERNEL_USERMUTEX_H + +#include <util/locked/queue.H> +#include <kernel/spinlock.H> +#include <kernel/task.H> + +struct UserMutex +{ + uint64_t value; + bool unlock_pend; + Spinlock lock; + Util::Locked::Queue<task_t> waiting; +}; + +#endif diff --git a/src/include/sys/mutex.h b/src/include/sys/mutex.h new file mode 100644 index 000000000..3eca65f06 --- /dev/null +++ b/src/include/sys/mutex.h @@ -0,0 +1,20 @@ +#ifndef __SYS_MUTEX_H +#define __SYS_MUTEX_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef void* mutex_t; + +mutex_t mutex_create(); +int mutex_destroy(mutex_t); + +int mutex_lock(mutex_t); +int mutex_unlock(mutex_t); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/include/sys/task.h b/src/include/sys/task.h index 84ddb10f9..fa9838723 100644 --- a/src/include/sys/task.h +++ b/src/include/sys/task.h @@ -1,18 +1,20 @@ #ifndef __SYS_TASK_H #define __SYS_TASK_H -#include <sys/syscall.h> +#include <stdint.h> #ifdef __cplusplus extern "C" { #endif +typedef uint64_t tid_t; + void task_yield(); -int task_create(void(*)(void*), void*); +tid_t task_create(void(*)(void*), void*); void task_end(); -uint64_t task_gettid(); +tid_t task_gettid(); #ifdef __cplusplus } diff --git a/src/include/util/locked/lock.H b/src/include/util/locked/lock.H index b5237276e..05da95900 100644 --- a/src/include/util/locked/lock.H +++ b/src/include/util/locked/lock.H @@ -14,6 +14,26 @@ namespace Util virtual void lock() = 0; virtual void unlock() = 0; }; + + template<bool _locked, typename _T> + class LockHelper + { + public: + inline LockHelper(_T& i) : l(i) {}; + inline void lock() { l.lock(); }; + inline void unlock() { l.unlock(); }; + private: + _T& l; + }; + + template<typename _T> + class LockHelper<false,_T> + { + public: + inline LockHelper(_T&i) {}; + inline void lock() {}; + inline void unlock() {}; + }; }; }; diff --git a/src/include/util/locked/queue.H b/src/include/util/locked/queue.H index 2f230819e..51d2c430e 100644 --- a/src/include/util/locked/queue.H +++ b/src/include/util/locked/queue.H @@ -1,6 +1,8 @@ #ifndef __UTIL_LOCKED_QUEUE_H #define __UTIL_LOCKED_QUEUE_H +#include <util/locked/lock.H> + namespace Util { namespace Locked @@ -21,6 +23,9 @@ namespace Util _S lock; + void __lock(); + void __unlock(); + }; template <typename _T, bool locked, typename _S> @@ -28,8 +33,7 @@ namespace Util { _T* item = NULL; - if (locked) - lock.lock(); + __lock(); if (tail != NULL) { @@ -40,17 +44,15 @@ namespace Util tail = item->prev; } - if (locked) - lock.unlock(); - + __unlock(); + return item; } template <typename _T, bool locked, typename _S> void Queue<_T,locked,_S>::insert(_T* item) { - if (locked) - lock.lock(); + __lock(); if (head == NULL) { @@ -63,10 +65,23 @@ namespace Util item->next = head; head = head->prev = item; } + + __unlock(); + } - if (locked) - lock.unlock(); + template <typename _T, bool locked, typename _S> + void Queue<_T,locked,_S>::__lock() + { + Util::Locked::LockHelper<locked,_S>(lock).lock(); + } + + template <typename _T, bool locked, typename _S> + void Queue<_T,locked,_S>::__unlock() + { + Util::Locked::LockHelper<locked,_S>(lock).unlock(); } + + }; }; |