diff -r 000000000000 -r 2f259fa3e83a commonuisupport/uikon/srvsrc/EIKSRVS.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commonuisupport/uikon/srvsrc/EIKSRVS.CPP Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,138 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// EIKSRV.CPP +// +// + +#include +#include +#include +#include +#include +#include +#include +#include "EIKNFYSV.H" +#include "EIKBAKSV.H" +#include "EIKALSRV.H" +#include "EIKUNDER.H" +#include +#include +#include +#include +#include +#include + +#if defined(_DEBUG) // for the HAL::Get call in EikDll::RunAppInsideThread to pre-allocate its heap-cell before any OOM testing is started +#include +#include +#endif + + +/** +Local static function run directly from entry point. Starts up server. +@internalComponent +*/ +static TInt RunServer() + { + TBool oomTestingOnEiksrvStartUp=EFalse; +#if defined(UIKON_OOM_TESTING) + User::__DbgMarkStart(RHeap::EUser); + CEikDebugPreferences* debugPreferences=CEikDebugPreferences::New(); + if (debugPreferences!=NULL) + { + RFs fileServerSession; + if (fileServerSession.Connect()==KErrNone) + { + if (debugPreferences->Restore(fileServerSession)==KErrNone) + { + oomTestingOnEiksrvStartUp=(debugPreferences->Flags()&CEikDebugPreferences::EFlagOOMTestingOnEiksrvStartUp); + } + } + fileServerSession.Close(); + delete debugPreferences; + } + User::__DbgMarkEnd(RHeap::EUser, 0); +#endif + +#if defined(_DEBUG) + { + TInt notUsed; + HAL::Get(HALData::EDisplayColors, notUsed); // this is to pre-allocate the heap-cell that certain HAL functions leave lying around (without actually orphaning it) - if we don't do this then the User::__DbgMarkEnd near the end of the loop below will panic because of this heap-cell + } +#endif + + + TInt error=User::RenameThread(EIKAPPUI_SERVER_THREAD_NAME); + if (error!=KErrNone) + { + return error; + } + for (TInt failRate=1; ; ++failRate) + { + TBool tryAgain=EFalse; + User::__DbgMarkStart(RHeap::EUser); + if (oomTestingOnEiksrvStartUp) + { + __SHOW_FAIL_RATE(_L("OOM testing on Eiksrv start up (fail rate %d)"), failRate); + User::__DbgSetAllocFail(RHeap::EUser, RHeap::EFailNext, failRate); + } + TInt error=KErrNoMemory; + CEikonEnv* coe=new CEikServEnv; + if ((coe!=NULL) && (User::TrapHandler()!=NULL)) + { + TRAP(error, + coe->ConstructL(); + CEikServAppUiServer::NewL()); // the object created by CEikServAppUiServer::NewL is owned by CEikServEnv's iServer + } + if (oomTestingOnEiksrvStartUp) + { + TAny* const pointer=User::Alloc(1); + User::Free(pointer); + if (pointer!=NULL) + { + tryAgain=ETrue; + } + } + if ((error==KErrNone) && !tryAgain) + { + RProcess::Rendezvous(KErrNone); + coe->ExecuteD(); + } + else + { + if (coe!=NULL) + { + coe->DestroyEnvironment(); + } + if (!tryAgain) + { + User::__DbgMarkEnd(RHeap::EUser, 0); + return error; + } + } + User::__DbgMarkEnd(RHeap::EUser, 0); + if (!tryAgain) + { + break; + } + } + return KErrNone; + } + + +TInt E32Main() + { + return RunServer(); + } +