diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-10-04 17:48:47 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-10-04 17:48:47 -0500 |
commit | 3e9ed72a3b6442eaebadf26294e448862c3a4400 (patch) | |
tree | f3745143af3f1f87d99f3dec1256549195bf7fe1 /src/kernel/timemgr.C | |
parent | 706838262ce47efeb8f983920a218460b81f2dc3 (diff) | |
download | talos-hostboot-3e9ed72a3b6442eaebadf26294e448862c3a4400.tar.gz talos-hostboot-3e9ed72a3b6442eaebadf26294e448862c3a4400.zip |
Add nanosleep syscall.
Diffstat (limited to 'src/kernel/timemgr.C')
-rw-r--r-- | src/kernel/timemgr.C | 51 |
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; + } } |