kernel/eka/nkernsmp/nk_timer.cpp
changeset 90 947f0dc9f7a8
parent 0 a41df078684a
child 257 3e88ff8f41d5
--- 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)));
 	}