diff -r a179b74831c9 -r c1f20ce4abcf kernel/eka/nkernsmp/arm/ncsched.cpp --- a/kernel/eka/nkernsmp/arm/ncsched.cpp Thu Aug 19 11:14:22 2010 +0300 +++ b/kernel/eka/nkernsmp/arm/ncsched.cpp Tue Aug 31 16:34:26 2010 +0300 @@ -19,6 +19,7 @@ #define __INCLUDE_NTHREADBASE_DEFINES__ #include +#include extern "C" void NewThreadTrace(NThread* a) { @@ -159,3 +160,61 @@ #endif +#if !defined(__UTT_MACHINE_CODED__) +void TSubScheduler::UpdateThreadTimes(NThreadBase* aOld, NThreadBase* aNew) + { + /* If necessary update local timer frequency (DVFS) */ + SRatioInv* pNCF = iSSX.iNewCpuFreqRI; + if (pNCF) + { + iSSX.iCpuFreqRI = *pNCF; + __e32_atomic_store_rel_ptr(&iSSX.iNewCpuFreqRI, 0); + } + SRatioInv* pNTF = iSSX.iNewTimerFreqRI; + if (pNTF) + { + iSSX.iTimerFreqRI = *pNTF; + __e32_atomic_store_rel_ptr(&iSSX.iNewTimerFreqRI, 0); + } + if (!aOld) + aOld = iInitialThread; + if (!aNew) + aNew = iInitialThread; + if (aNew!=aOld || aNew->iTime<=0 || pNTF) + { + TUint32 tmrval = 0x7fffffffu; + if (aNew->iTime > 0) + { + tmrval = aNew->iTime; // this will have been computed based on the old timer frequency + iSSX.iTimerFreqRI.iR.Mult(tmrval); + } +// iSSX.iLastTimerSet = tmrval; + iSSX.iLocalTimerAddr->iTimerCount = tmrval; + } + if (aNew!=aOld) + { + TUint64 now = NKern::Timestamp(); + TUint64 delta = now - iLastTimestamp.i64; + iLastTimestamp.i64 = now; + aOld->iLastRunTime.i64 = now; + aOld->iTotalCpuTime.i64 += delta; + ++iReschedCount.i64; + ++aNew->iRunCount.i64; + if (!aOld->iActiveState) + aOld->iTotalActiveTime.i64 += (now - aOld->iLastActivationTime.i64); + NSchedulable* parent = aOld->iParent; + if (parent != aOld) + { + parent->iLastRunTime.i64 = now; + if (!parent->iActiveState) + parent->iTotalActiveTime.i64 += (now - parent->iLastActivationTime.i64); + if (parent != aNew->iParent) + parent->iTotalCpuTime.i64 += (now - parent->iLastStartTime.i64); + } + NSchedulable* np = aNew->iParent; + if (np!=aNew && np!=parent) + np->iLastStartTime.i64 = now; + } + } +#endif +