diff -r a179b74831c9 -r c1f20ce4abcf kernel/eka/kernel/sexec.cpp --- a/kernel/eka/kernel/sexec.cpp Thu Aug 19 11:14:22 2010 +0300 +++ b/kernel/eka/kernel/sexec.cpp Tue Aug 31 16:34:26 2010 +0300 @@ -36,7 +36,7 @@ TFindHandle h; Kern::KUDesGet(match,aName); kumemget32(&h,&aFindHandle,sizeof(h)); - __KTRACE_OPT(KEXEC,Kern::Printf("ObjN: %lS %08x", &match, h.Handle())); + __KTRACE_OPT(KEXEC,Kern::Printf("ObjN: %S %08x", &match, h.Handle())); NKern::ThreadEnterCS(); TInt r=pC->FindByFullName(h, match, fn); NKern::ThreadLeaveCS(); @@ -96,14 +96,26 @@ return aChunk->Top(); } -void ExecHandler::MutexWait(DMutex* aMutex) +TInt ExecHandler::MutexWait(DMutex* aMutex, TInt aTimeout) // // Wait for the mutex. // { - -// __KTRACE_OPT(KEXEC,Kern::Printf("Exec::MutexWait")); - aMutex->Wait(); + if (aTimeout) // 0 means wait forever, -1 means poll + { + if (aTimeout<-1) + { + return KErrArgument; + } + if (aTimeout>0) + { + // Convert microseconds to NTimer ticks, rounding up + TInt ntp = NKern::TickPeriod(); + aTimeout += ntp-1; + aTimeout /= ntp; + } + } + return aMutex->Wait(aTimeout); } void ExecHandler::MutexSignal(DMutex* aMutex) @@ -555,20 +567,21 @@ // Wait for a signal. // { - __KTRACE_OPT(KEXEC,Kern::Printf("Exec::SemaphoreWait")); - if (aTimeout) + if (aTimeout) // 0 means wait forever, -1 means poll { - if (aTimeout<0) + if (aTimeout<-1) { NKern::UnlockSystem(); return KErrArgument; } - - // Convert microseconds to NTimer ticks, rounding up - TInt ntp = NKern::TickPeriod(); - aTimeout += ntp-1; - aTimeout /= ntp; + if (aTimeout>0) + { + // Convert microseconds to NTimer ticks, rounding up + TInt ntp = NKern::TickPeriod(); + aTimeout += ntp-1; + aTimeout /= ntp; + } } return aSemaphore->Wait(aTimeout); } @@ -812,7 +825,7 @@ TKName n; if (aName) Kern::KUDesGet(n,*aName); - __KTRACE_OPT(KEXEC,Kern::Printf("Exec::ChunkCreate %lS",&n)); + __KTRACE_OPT(KEXEC,Kern::Printf("Exec::ChunkCreate %S",&n)); TChunkCreate uinfo; SChunkCreateInfo info; kumemget32(&uinfo,&anInfo,sizeof(uinfo)); @@ -938,9 +951,9 @@ TInt ExecHandler::OpenObject(TObjectType aObjType, const TDesC8& aName, TOwnerType aType) { - __KTRACE_OPT(KTHREAD,Kern::Printf("Exec::OpenObject %lS",&aName)); TFullName n; Kern::KUDesGet(n,aName); + __KTRACE_OPT(KTHREAD,Kern::Printf("Exec::OpenObject %S",&n)); if (Kern::ValidateFullName(n)!=KErrNone) K::PanicKernExec(EBadName); if ((TUint)aObjType>=(TUint)ENumObjectTypes) @@ -1012,12 +1025,12 @@ { Kern::KUDesGet(n,*aName); pN=&n; + __KTRACE_OPT(KSEMAPHORE,Kern::Printf("Exec::MutexCreate %S",pN)); } else if (aType==EOwnerThread) pO=TheCurrentThread; else pO=TheCurrentThread->iOwningProcess; - __KTRACE_OPT(KSEMAPHORE,Kern::Printf("Exec::MutexCreate %lS",aName)); NKern::ThreadEnterCS(); DMutex* pM; TInt r=K::MutexCreate(pM, *pN, pO, ETrue, KMutexOrdUser); @@ -1036,7 +1049,6 @@ TInt ExecHandler::SemaphoreCreate(const TDesC8* aName, TInt aCount, TOwnerType aType) { - __KTRACE_OPT(KSEMAPHORE,Kern::Printf("Exec::SemaphoreCreate %lS",aName)); TKName n; DObject* pO=NULL; const TDesC* pN=NULL; @@ -1044,6 +1056,7 @@ { Kern::KUDesGet(n,*aName); pN=&n; + __KTRACE_OPT(KSEMAPHORE,Kern::Printf("Exec::SemaphoreCreate %S",pN)); } else if (aType==EOwnerThread) pO=TheCurrentThread; @@ -1230,7 +1243,7 @@ { TKName n; Kern::KUDesGet(n,aName); - __KTRACE_OPT(KEXEC,Kern::Printf("Exec::ThreadRename %lS",&n)); + __KTRACE_OPT(KEXEC,Kern::Printf("Exec::ThreadRename %S",&n)); NKern::LockSystem(); DThread* pT=(DThread*)K::ThreadEnterCS(aHandle,EThread); if (pT!=TheCurrentThread && @@ -1255,7 +1268,7 @@ { TKName n; Kern::KUDesGet(n,aName); - __KTRACE_OPT(KEXEC,Kern::Printf("Exec::ProcessRename %lS",&n)); + __KTRACE_OPT(KEXEC,Kern::Printf("Exec::ProcessRename %S",&n)); NKern::LockSystem(); DProcess* pP=(DProcess*)K::ThreadEnterCS(aHandle,EProcess); if (pP->iSecurityZone!=TheCurrentThread->iOwningProcess->iSecurityZone) @@ -1615,6 +1628,15 @@ break; } + case EDbgGetAllocFail: + { + NKern::ThreadEnterCS(); + TInt allocFail = K::Allocator->__DbgGetAllocFail(); + NKern::ThreadLeaveCS(); + kumemput32(a2, (TAny*)&allocFail, sizeof(TInt)); + break; + } + default: panic=EBadKernelHeapDebugFunction; break; @@ -1898,7 +1920,7 @@ { TKName n; Kern::KUDesGet(n,aName); - __KTRACE_OPT(KEXEC,Kern::Printf("Exec::ThreadCreate %lS",&n)); + __KTRACE_OPT(KEXEC,Kern::Printf("Exec::ThreadCreate %S",&n)); TUint32 infoBuf[KMaxThreadCreateInfo/sizeof(TUint32)]; SThreadCreateInfo& info = *(SThreadCreateInfo*)infoBuf; kumemget32(&info, &aInfo, sizeof(SThreadCreateInfo)); @@ -1933,7 +1955,7 @@ TInt K::MutexCreate(DMutex*& aMutex, const TDesC& aName, DObject* anOwner, TBool aVisible, TUint aOrder) { - __KTRACE_OPT(KSEMAPHORE,Kern::Printf("K::MutexCreate %lS owner %O visible=%d order=%02x",&aName,anOwner,aVisible,aOrder)); + __KTRACE_OPT(KSEMAPHORE,Kern::Printf("K::MutexCreate %S owner %O visible=%d order=%02x",&aName,anOwner,aVisible,aOrder)); DMutex* pM=new DMutex; TInt r=KErrNoMemory; if (pM) @@ -2000,7 +2022,7 @@ EXPORT_C TInt Kern::ThreadCreate(SThreadCreateInfo& aInfo) { CHECK_PRECONDITIONS(MASK_THREAD_CRITICAL,"Kern::ThreadCreate"); - __KTRACE_OPT(KEXEC,Kern::Printf("Kern::ThreadCreate %lS",&aInfo.iName)); + __KTRACE_OPT(KEXEC,Kern::Printf("Kern::ThreadCreate %S",&aInfo.iName)); aInfo.iHandle=NULL; DThread* pT=NULL; TBool svc = aInfo.iType!=EThreadUser; @@ -2146,18 +2168,23 @@ } #ifdef MONITOR_THREAD_CPU_TIME -TInt ExecHandler::ThreadGetCpuTime(DThread* aThread, Int64& aTime) +TInt ExecHandler::ThreadGetCpuTime(TInt aThreadHandle, Int64& aTime) { -#ifndef __SMP__ - TInt64 time = (1000000 * aThread->iNThread.iTotalCpuTime) / NKern::FastCounterFrequency(); - NKern::UnlockSystem(); - kumemput32(&aTime, &time, sizeof(TInt64)); -#else - TUint64 t = NKern::ThreadCpuTime(&aThread->iNThread); - NKern::UnlockSystem(); + TUint64 t = 0; + if (aThreadHandle == KCurrentThreadHandle) + { + t = NKern::ThreadCpuTime(NKern::CurrentThread()); + } + else + { + NKern::LockSystem(); + DThread* pT = (DThread*)K::ObjectFromHandle(aThreadHandle, EThread); + t = NKern::ThreadCpuTime(&pT->iNThread); + NKern::UnlockSystem(); + } TUint32 f = NKern::CpuTimeMeasFreq(); TUint64 t2 = t>>32; - t = ((t<<32)>>32)*1000000; + t = (t & KMaxTUint32)*1000000; t2 *= 1000000; t2 += (t>>32); t &= TUint64(KMaxTUint32); @@ -2167,13 +2194,11 @@ TUint64 q = t/f; q += (q2<<32); kumemput32(&aTime, &q, sizeof(TInt64)); -#endif return KErrNone; } -#else -TInt ExecHandler::ThreadGetCpuTime(DThread* /*aThread*/, Int64& /*aTime*/) +#else +TInt ExecHandler::ThreadGetCpuTime(TInt /*aThreadHandle*/, Int64& /*aTime*/) { - NKern::UnlockSystem(); return KErrNotSupported; } #endif @@ -2198,10 +2223,10 @@ __KTRACE_OPT(KBOOT,Kern::Printf("File server thread registered")); DThread* pT = TheCurrentThread; DProcess* pP = pT->iOwningProcess; + if (K::TheFileServerProcess && K::TheFileServerProcess!=pP) + K::PanicCurrentThread(EAccessDenied); pP->iFlags |= (KThreadFlagProcessCritical | KProcessFlagSystemPermanent); pT->iFlags |= KThreadFlagSystemPermanent; - if (K::TheFileServerProcess && K::TheFileServerProcess!=pP) - K::PanicCurrentThread(EAccessDenied); K::TheFileServerProcess=pP; K::ThreadEnterCS(); pP->SetPriority(EPriorityFileServer);