--- 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);