diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-06-09 13:54:08 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-06-09 13:54:08 -0500 |
commit | cbbd9e5b225e743ee3b4688ac6a3b69a9876926a (patch) | |
tree | ac9ccc37c35855edeeecbf3ebe1cb55d3c2f6f89 | |
parent | 9a4698af6ee4c095a97b8800d2d5f0a4bb282b15 (diff) | |
download | talos-hostboot-cbbd9e5b225e743ee3b4688ac6a3b69a9876926a.tar.gz talos-hostboot-cbbd9e5b225e743ee3b4688ac6a3b69a9876926a.zip |
Refactor task-manager tid counter to generic lockfree algorithm.
-rw-r--r-- | src/include/kernel/taskmgr.H | 6 | ||||
-rw-r--r-- | src/include/util/lockfree/counter.H | 23 | ||||
-rw-r--r-- | src/kernel/taskmgr.C | 7 |
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); |