--- a/kernel/eka/nkernsmp/nk_timer.cpp Tue Feb 02 01:24:03 2010 +0200
+++ b/kernel/eka/nkernsmp/nk_timer.cpp Fri Apr 16 16:24:37 2010 +0300
@@ -26,7 +26,7 @@
GLDEF_D NTimerQ TheTimerQ;
-extern "C" void send_irq_ipi(TSubScheduler*);
+extern "C" void send_irq_ipi(TSubScheduler*, TInt);
#ifndef __MSTIM_MACHINE_CODED__
#ifdef _DEBUG
@@ -345,7 +345,6 @@
// Wait aTime from last trigger time - used for periodic timers
//
{
- __NK_ASSERT_DEBUG(aTime>0);
TInt irq = TheTimerQ.iTimerSpinLock.LockIrqSave();
if (!IsValid())
{
@@ -586,6 +585,8 @@
{
__KTRACE_OPT(KBOOT,DEBUGPRINT("NTimerQ::Init3 DFCQ at %08x",aDfcQ));
TheTimerQ.iDfc.SetDfcQ(aDfcQ);
+ NThreadBase* t = aDfcQ->iThread;
+ t->iRebalanceAttr = 1;
}
#ifndef __MSTIM_MACHINE_CODED__
@@ -742,8 +743,7 @@
EXPORT_C void NTimerQ::Tick()
{
TInt irq = iTimerSpinLock.LockIrqSave();
- TInt i=iMsCount & ETimerQMask;
- iMsCount++;
+ TInt i = TInt(__e32_atomic_add_rlx64(&iMsCount64, 1)) & ETimerQMask;
STimerQ* pQ=iTickQ+i;
iPresent &= ~(1<<i);
TBool doDfc=FALSE;
@@ -802,10 +802,10 @@
{
pC->i_NTimer_iState = TUint8(NTimer::EEventQ + cpu);
TSubScheduler* ss = TheSubSchedulers + cpu;
- TBool kick = ss->QueueEvent(pC);
+ TInt kick = ss->QueueEvent(pC);
iTimerSpinLock.UnlockIrqRestore(irq);
if (kick)
- send_irq_ipi(ss);
+ send_irq_ipi(ss, kick);
continue;
}
}
@@ -921,8 +921,8 @@
*/
EXPORT_C void NTimerQ::Advance(TInt aTicks)
{
- CHECK_PRECONDITIONS(MASK_INTERRUPTS_DISABLED,"NTimerQ::Advance");
- TheTimerQ.iMsCount+=(TUint32)aTicks;
+ CHECK_PRECONDITIONS(MASK_INTERRUPTS_DISABLED,"NTimerQ::Advance");
+ __e32_atomic_add_rlx64(&TheTimerQ.iMsCount64, TUint64(TUint32(aTicks)));
}