diff -r 2d65c2f76d7b -r 947f0dc9f7a8 kernel/eka/nkernsmp/arm/ncthrd.cpp --- a/kernel/eka/nkernsmp/arm/ncthrd.cpp Tue Feb 02 01:24:03 2010 +0200 +++ b/kernel/eka/nkernsmp/arm/ncthrd.cpp Fri Apr 16 16:24:37 2010 +0300 @@ -36,7 +36,7 @@ extern "C" void ExcFault(TAny*); extern TUint32 __mpid(); -extern void InitAPTimestamp(SNThreadCreateInfo& aInfo); +extern void InitTimestamp(TSubScheduler* aSS, SNThreadCreateInfo& aInfo); TInt NThread::Create(SNThreadCreateInfo& aInfo, TBool aInitial) { @@ -44,19 +44,22 @@ __NK_ASSERT_ALWAYS((aInfo.iParameterBlockSize&0x80000007)==0); __NK_ASSERT_ALWAYS(aInfo.iStackBase && aInfo.iStackSize>=aInfo.iParameterBlockSize+KNThreadMinStackSize); TInt cpu = -1; + TSubScheduler* ss = 0; new (this) NThread; if (aInitial) { cpu = __e32_atomic_add_ord32(&TheScheduler.iNumCpus, 1); aInfo.iCpuAffinity = cpu; // OK since we can't migrate yet - TSubScheduler& ss = TheSubSchedulers[cpu]; - ss.iCurrentThread = this; - iRunCount64 = UI64LIT(1); - __KTRACE_OPT(KBOOT,DEBUGPRINT("Init: cpu=%d ss=%08x", cpu, &ss)); + ss = &TheSubSchedulers[cpu]; + ss->iCurrentThread = this; + ss->iDeferShutdown = 0; + iRunCount.i64 = UI64LIT(1); + iActiveState = 1; + __KTRACE_OPT(KBOOT,DEBUGPRINT("Init: cpu=%d ss=%08x", cpu, ss)); if (cpu) { - initialiseState(cpu,&ss); + initialiseState(cpu,ss); ArmLocalTimer& T = LOCAL_TIMER; T.iWatchdogDisable = E_ArmTmrWDD_1; @@ -69,9 +72,10 @@ NIrq::HwInit2AP(); T.iTimerCtrl = E_ArmTmrCtrl_IntEn | E_ArmTmrCtrl_Reload | E_ArmTmrCtrl_Enable; - __e32_atomic_ior_ord32(&TheScheduler.iActiveCpus1, 1<0) - InitAPTimestamp(aInfo); + // Initialise timestamp + InitTimestamp(ss, aInfo); } + AddToEnumerateList(); + InitLbInfo(); #ifdef BTRACE_THREAD_IDENTIFICATION BTrace4(BTrace::EThreadIdentification,BTrace::ENanoThreadCreate,this); #endif @@ -184,7 +189,7 @@ TInt irq = NKern::DisableAllInterrupts(); TSubScheduler& ss = SubScheduler(); NThreadBase* ct = ss.iCurrentThread; - TInt inc = TInt(ss.i_IrqNestCount); + TInt inc = TInt(ss.iSSX.iIrqNestCount); TInt cpu = ss.iCpuNum; TInt klc = ss.iKernLockCount; NKern::RestoreInterrupts(irq); @@ -652,7 +657,7 @@ if (pC != this) { AcqSLock(); - if (iWaitState.ThreadIsDead()) + if (iWaitState.ThreadIsDead() || i_NThread_Initial) { RelSLock(); aAvailRegistersMask = 0; @@ -840,7 +845,7 @@ if (pC != this) { AcqSLock(); - if (iWaitState.ThreadIsDead()) + if (iWaitState.ThreadIsDead() || i_NThread_Initial) { RelSLock(); aRegMask = 0; @@ -1057,36 +1062,14 @@ return 0; } -/** Return the total CPU time so far used by the specified thread. - - @return The total CPU time in units of 1/NKern::CpuTimeMeasFreq(). -*/ -EXPORT_C TUint64 NKern::ThreadCpuTime(NThread* aThread) - { - TSubScheduler* ss = 0; - NKern::Lock(); - aThread->AcqSLock(); - if (aThread->i_NThread_Initial) - ss = &TheSubSchedulers[aThread->iLastCpu]; - else if (aThread->iReady && aThread->iParent->iReady) - ss = &TheSubSchedulers[aThread->iParent->iReady & NSchedulable::EReadyCpuMask]; - if (ss) - ss->iReadyListLock.LockOnly(); - TUint64 t = aThread->iTotalCpuTime64; - if (aThread->iCurrent || (aThread->i_NThread_Initial && !ss->iCurrentThread)) - t += (NKern::Timestamp() - ss->iLastTimestamp64); - if (ss) - ss->iReadyListLock.UnlockOnly(); - aThread->RelSLock(); - NKern::Unlock(); - return t; - } TInt NKern::QueueUserModeCallback(NThreadBase* aThread, TUserModeCallback* aCallback) { __e32_memory_barrier(); if (aCallback->iNext != KUserModeCallbackUnqueued) return KErrInUse; + if (aThread->i_NThread_Initial) + return KErrArgument; TInt result = KErrDied; NKern::Lock(); TUserModeCallback* listHead = aThread->iUserModeCallbacks;