summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-06-09 13:54:08 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-06-09 13:54:08 -0500
commitcbbd9e5b225e743ee3b4688ac6a3b69a9876926a (patch)
treeac9ccc37c35855edeeecbf3ebe1cb55d3c2f6f89
parent9a4698af6ee4c095a97b8800d2d5f0a4bb282b15 (diff)
downloadtalos-hostboot-cbbd9e5b225e743ee3b4688ac6a3b69a9876926a.tar.gz
talos-hostboot-cbbd9e5b225e743ee3b4688ac6a3b69a9876926a.zip
Refactor task-manager tid counter to generic lockfree algorithm.
-rw-r--r--src/include/kernel/taskmgr.H6
-rw-r--r--src/include/util/lockfree/counter.H23
-rw-r--r--src/kernel/taskmgr.C7
3 files changed, 27 insertions, 9 deletions
diff --git a/src/include/kernel/taskmgr.H b/src/include/kernel/taskmgr.H
index 2bdb39c16..3cf036f37 100644
--- a/src/include/kernel/taskmgr.H
+++ b/src/include/kernel/taskmgr.H
@@ -2,6 +2,7 @@
#define __KENREL_TASKMGR_H
#include <kernel/types.h>
+#include <util/lockfree/counter.H>
class TaskManager
{
@@ -20,9 +21,8 @@ class TaskManager
static task_t* createIdleTask();
private:
- tid_t getNextTid();
-
- tid_t iv_nextTid;
+ tid_t getNextTid() { return iv_nextTid.next(); };
+ Util::Lockfree::Counter<tid_t> iv_nextTid;
static void idleTaskLoop(void*);
task_t* _createIdleTask();
diff --git a/src/include/util/lockfree/counter.H b/src/include/util/lockfree/counter.H
new file mode 100644
index 000000000..1ff61fc77
--- /dev/null
+++ b/src/include/util/lockfree/counter.H
@@ -0,0 +1,23 @@
+#ifndef __UTIL_LOCKFREE_COUNTER_H
+#define __UTIL_LOCKFREE_COUNTER_H
+
+namespace Util
+{
+ namespace Lockfree
+ {
+ template <typename _T>
+ class Counter
+ {
+ public:
+ Counter() : value(_T()) {};
+
+ _T next() { return __sync_fetch_and_add(&value, 1); };
+
+ private:
+ _T value;
+ };
+ };
+};
+
+
+#endif
diff --git a/src/kernel/taskmgr.C b/src/kernel/taskmgr.C
index d060b0029..35042c021 100644
--- a/src/kernel/taskmgr.C
+++ b/src/kernel/taskmgr.C
@@ -24,7 +24,7 @@ void TaskManager::setCurrentTask(task_t* t)
return;
}
-TaskManager::TaskManager() : iv_nextTid(0)
+TaskManager::TaskManager() : iv_nextTid()
{
}
@@ -38,11 +38,6 @@ task_t* TaskManager::createTask(TaskManager::task_fn_t t, void* p)
return Singleton<TaskManager>::instance()._createTask(t, p, true);
}
-tid_t TaskManager::getNextTid()
-{
- return __sync_fetch_and_add(&iv_nextTid, 1);
-}
-
task_t* TaskManager::_createIdleTask()
{
return this->_createTask(&TaskManager::idleTaskLoop, NULL, false);
OpenPOWER on IntegriCloud