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/util | |
parent | 165e6bed506f9fddd7e9da8ad1f4c7f186e29b00 (diff) | |
download | talos-hostboot-24e81bc664f5cdbfc8be1badf00b025ec122af00.tar.gz talos-hostboot-24e81bc664f5cdbfc8be1badf00b025ec122af00.zip |
Add mutex userspace / syscalls.
Diffstat (limited to 'src/include/util')
-rw-r--r-- | src/include/util/locked/lock.H | 20 | ||||
-rw-r--r-- | src/include/util/locked/queue.H | 33 |
2 files changed, 44 insertions, 9 deletions
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(); } + + }; }; |