summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-06-11 21:40:31 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-06-11 21:40:31 -0500
commit24e81bc664f5cdbfc8be1badf00b025ec122af00 (patch)
tree2d41e3305fb903024541d105dfec6adf1824839a /src/include
parent165e6bed506f9fddd7e9da8ad1f4c7f186e29b00 (diff)
downloadtalos-hostboot-24e81bc664f5cdbfc8be1badf00b025ec122af00.tar.gz
talos-hostboot-24e81bc664f5cdbfc8be1badf00b025ec122af00.zip
Add mutex userspace / syscalls.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/kernel/syscalls.H5
-rw-r--r--src/include/kernel/usermutex.H16
-rw-r--r--src/include/sys/mutex.h20
-rw-r--r--src/include/sys/task.h8
-rw-r--r--src/include/util/locked/lock.H20
-rw-r--r--src/include/util/locked/queue.H33
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();
}
+
+
};
};
OpenPOWER on IntegriCloud