summaryrefslogtreecommitdiffstats
path: root/src/kernel/timemgr.C
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-10-04 17:48:47 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-10-04 17:48:47 -0500
commit3e9ed72a3b6442eaebadf26294e448862c3a4400 (patch)
treef3745143af3f1f87d99f3dec1256549195bf7fe1 /src/kernel/timemgr.C
parent706838262ce47efeb8f983920a218460b81f2dc3 (diff)
downloadtalos-hostboot-3e9ed72a3b6442eaebadf26294e448862c3a4400.tar.gz
talos-hostboot-3e9ed72a3b6442eaebadf26294e448862c3a4400.zip
Add nanosleep syscall.
Diffstat (limited to 'src/kernel/timemgr.C')
-rw-r--r--src/kernel/timemgr.C51
1 files changed, 48 insertions, 3 deletions
diff --git a/src/kernel/timemgr.C b/src/kernel/timemgr.C
index 73a920524..3871e1ceb 100644
--- a/src/kernel/timemgr.C
+++ b/src/kernel/timemgr.C
@@ -1,7 +1,8 @@
#include <kernel/timemgr.H>
+#include <kernel/scheduler.H>
#include <util/singleton.H>
-uint64_t TimeManager::iv_timeSlice = 0xFFFFFFFF;
+uint64_t TimeManager::iv_timebaseFreq = 0xFFFFFFFF;
void TimeManager::init()
{
@@ -10,6 +11,50 @@ void TimeManager::init()
void TimeManager::_init()
{
- /* TB freq / Timeslice per Sec */
- iv_timeSlice = 512000000 / 1000;
+ iv_timebaseFreq = 512000000ULL;
+}
+
+uint64_t TimeManager::convertSecToTicks(uint64_t i_sec, uint64_t i_nsec)
+{
+ // This code will handle times almost up to a year without overflowing a
+ // uint64. This should be more than sufficient for our purposes.
+
+ // Result = ((sec * 10^9 + nsec) * tb) / 10^9.
+ uint64_t result = ((i_sec * 1000000000ULL) + i_nsec);
+ result *= (iv_timebaseFreq / 1000000);
+ result /= 1000;
+ return result;
+}
+
+void TimeManager::delayTask(task_t* t, uint64_t i_sec, uint64_t i_nsec)
+{
+ Singleton<TimeManager>::instance()._delayTask(t,i_sec,i_nsec);
+}
+
+void TimeManager::_delayTask(task_t* t, uint64_t i_sec, uint64_t i_nsec)
+{
+ _TimeManager_Delay_t* node = new _TimeManager_Delay_t();
+
+ node->key = this->getCurrentTimeBase() +
+ this->convertSecToTicks(i_sec, i_nsec);
+ node->task = t;
+
+ iv_taskList.insert(node);
+}
+
+void TimeManager::checkReleaseTasks(Scheduler* s)
+{
+ Singleton<TimeManager>::instance()._checkReleaseTasks(s);
+}
+
+void TimeManager::_checkReleaseTasks(Scheduler* s)
+{
+ uint64_t l_currentTime = getCurrentTimeBase();
+ _TimeManager_Delay_t* node = NULL;
+
+ while(NULL != (node = iv_taskList.remove_if(l_currentTime)))
+ {
+ s->addTask(node->task);
+ delete node;
+ }
}
OpenPOWER on IntegriCloud