diff -r f36eb4948686 -r f561f9ae805b kernel/eka/euser/epoc/symc/uc_exec.cpp --- a/kernel/eka/euser/epoc/symc/uc_exec.cpp Tue Apr 27 17:12:11 2010 +0200 +++ b/kernel/eka/euser/epoc/symc/uc_exec.cpp Tue Apr 27 20:22:55 2010 +0200 @@ -354,8 +354,27 @@ // #ifndef __GEN_USER_EXEC_CODE__ +const TInt KTrapStackSize=256; + +/* + +*/ +class TThread + { +public: + +public: + RSemaphore iRequestSemaphore; + CActiveScheduler* iActiveScheduler; //Current active scheduler for this thread. Used. + TTrapHandler* iHandler; //This is our cleanup stack. Used. + //No idea why we need that trap stack + TTrap* iTrapStack[KTrapStackSize]; + TInt iTrapCount; + }; + /* Object used to store process globals for our pseudo kernel. +That's typically going to be a singleton. */ class TProcess { @@ -366,14 +385,20 @@ public: RHeap* iAllocator; TAny* iBase; + TThread iThread; //Single thread for now }; + void TProcess::CreateHeap() { + iThread.iTrapCount=0; + //Define the size of our heap + const TInt KHeapMaxSize=1024*1024*10; // 10 Mo for now __ASSERT_ALWAYS(iAllocator==NULL && iBase==NULL,Panic(ESymcExecPanicHeapAlreadyExists)); - iBase=malloc(1024*10); + iBase=malloc(KHeapMaxSize); __ASSERT_ALWAYS(iBase!=NULL,Panic(ESymcExecPanicCreateHeapFailed)); - iAllocator=UserHeap::FixedHeap(iBase,1024*10); + //TODO: is there anyway we could use variable size heap? + iAllocator=UserHeap::FixedHeap(iBase,KHeapMaxSize); __ASSERT_ALWAYS(iAllocator!=NULL,Panic(ESymcExecPanicCreateHeapFailed)); } @@ -406,14 +431,19 @@ FAST_EXEC1(EFastExecHeapSwitch); } -__EXECDECL__ TTrapHandler* Exec::PushTrapFrame(TTrap*) +__EXECDECL__ TTrapHandler* Exec::PushTrapFrame(TTrap* aTrap) { - FAST_EXEC1(EFastExecPushTrapFrame); + //FAST_EXEC1(EFastExecPushTrapFrame); + ASSERT(gProcess.iThread.iTrapCount<=KTrapStackSize); + gProcess.iThread.iTrapStack[gProcess.iThread.iTrapCount++]=aTrap; + return gProcess.iThread.iHandler; } __EXECDECL__ TTrap* Exec::PopTrapFrame() { - FAST_EXEC0(EFastExecPopTrapFrame); + //FAST_EXEC0(EFastExecPopTrapFrame); + ASSERT(gProcess.iThread.iTrapCount>0); + return gProcess.iThread.iTrapStack[gProcess.iThread.iTrapCount--]; } __EXECDECL__ CActiveScheduler* Exec::ActiveScheduler() @@ -433,12 +463,16 @@ __EXECDECL__ TTrapHandler* Exec::TrapHandler() { - FAST_EXEC0(EFastExecTrapHandler); + //FAST_EXEC0(EFastExecTrapHandler); + return gProcess.iThread.iHandler; } -__EXECDECL__ TTrapHandler* Exec::SetTrapHandler(TTrapHandler*) - { - FAST_EXEC1(EFastExecSetTrapHandler); +__EXECDECL__ TTrapHandler* Exec::SetTrapHandler(TTrapHandler* aHandler) + { + //FAST_EXEC1(EFastExecSetTrapHandler); + TTrapHandler* prev=gProcess.iThread.iHandler; + gProcess.iThread.iHandler=aHandler; + return prev; } __EXECDECL__ TUint32 Exec::DebugMask() @@ -1657,12 +1691,13 @@ __EXECDECL__ TTrapHandler* Exec::LeaveStart() { - SLOW_EXEC0(EExecLeaveStart); + //SLOW_EXEC0(EExecLeaveStart); + return gProcess.iThread.iHandler; } __EXECDECL__ void Exec::LeaveEnd() { - SLOW_EXEC0(EExecLeaveEnd); + //SLOW_EXEC0(EExecLeaveEnd); } __EXECDECL__ void Exec::SetDebugMaskIndex(TUint32, TUint)