diff -r 000000000000 -r 4e1aa6a622a0 resourcemgmt/hwresourcesmgr/server/src/HWRMServerStartup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/resourcemgmt/hwresourcesmgr/server/src/HWRMServerStartup.cpp Tue Feb 02 00:53:00 2010 +0200 @@ -0,0 +1,202 @@ +// Copyright (c) 2006-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: +// + + + + +// INCLUDE FILES +#include "HWRMServer.h" +#include "HWRMServerActiveScheduler.h" +#include "HWRMConfiguration.h" +#include "HWRMtrace.h" + +// EXTERNAL DATA STRUCTURES +// None + +// EXTERNAL FUNCTION PROTOTYPES +// None + +// CONSTANTS +// None + +// MACROS +// None + +// LOCAL CONSTANTS AND MACROS +// None + +// MODULE DATA STRUCTURES +// None + +// LOCAL FUNCTION PROTOTYPES +TInt E32Main(void); // Process entry point + +// FORWARD DECLARATIONS +// None + +// ============================= LOCAL FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Function that starts the HWRMServer. +// ----------------------------------------------------------------------------- +// +static TInt RunServer() + { + COMPONENT_TRACE1(_L( "HWRM Server - RunServer()" )); + + RSemaphore startLock; + CHWRMServerActiveScheduler* scheduler = NULL; + CHWRMServer* server = NULL; + + // Create lock + TInt err = startLock.CreateGlobal( KServerSemaphoreName, 1, EOwnerProcess ); + + if ( err == KErrAlreadyExists ) + { + COMPONENT_TRACE1(_L( "HWRM Server - RunServer() - Semaphore already exists, opening existing one." )); + err = startLock.OpenGlobal( KServerSemaphoreName ); + } + else + { + COMPONENT_TRACE1(_L( "HWRM Server - RunServer() - Created a new semaphore." )); + } + + // If there is error, server doesn't need to be started as it is either + // very recently started (i.e. semaphore doesn't exist anymore even though creating it failed) + // or there is something very wrong in system. + if ( err == KErrNone ) + { + COMPONENT_TRACE1(_L( "HWRM Server - RunServer() - Waiting on a semaphore." )); + startLock.Wait(); + COMPONENT_TRACE1(_L( "HWRM Server - RunServer() - Semaphore wait over." )); + + // Check if HWRMServer process is already running. + TFindProcess processFinder(KServerFindPattern); + TFullName processName; + err = processFinder.Next( processName ); + + COMPONENT_TRACE2(_L( "HWRM Server - RunServer() - Process find result: %d." ), err); + + // If HWRMServer process is not yet running, properly start it + if ( err == KErrNotFound ) + { + // Naming the server process and thread after the startup helps to debug panics + TInt renameErr1 = User::RenameProcess(KServerProcessName); + if (renameErr1 != KErrNone) + { + COMPONENT_TRACE2(_L( "HWRM Server - RunServer() - Error %d renaming server process" ), renameErr1); + } + TInt renameErr2 = User::RenameThread(KServerProcessName); + if (renameErr2 != KErrNone) + { + COMPONENT_TRACE2(_L( "HWRM Server - RunServer() - Error %d renaming server thread" ), renameErr2); + } + + // Create and install the active scheduler we need + if ( ( renameErr1 == KErrNone ) && (renameErr2 == KErrNone) ) + { + TRAP( err, scheduler = CHWRMServerActiveScheduler::NewL() ); + + // Note: Cannot use leaves and cleanupStack to reduce ifs here, because semaphore needs to be signaled in any case. + if ( err == KErrNone ) + { + CActiveScheduler::Install( scheduler ); + + // Now we are ready to instantiate the actual CHWRMServer instance + TRAP( err, server = CHWRMServer::NewL( KServerCActivePriority ) ); + + if ( err == KErrNone ) + { + // Initialisation complete, now signal the client + RProcess::Rendezvous(KErrNone); + + // Server is now up and running, so signal semaphore + COMPONENT_TRACE1(_L( "HWRM Server - RunServer() - Signaling semaphore." )); + startLock.Signal(); + startLock.Close(); // close already here to delete unnecessary reference + + // Ready to run + COMPONENT_TRACE1(_L( "HWRM Server - RunServer() - Starting scheduler..." )); + CActiveScheduler::Start(); + + COMPONENT_TRACE1(_L( "HWRM Server - RunServer() - Scheduler stopped" )); + } + } + } + + // In case there was any error, signal the semaphore as it has not been yet signaled + if ( ( err != KErrNone ) || ( renameErr1 != KErrNone ) || ( renameErr2 != KErrNone ) ) + { + COMPONENT_TRACE1(_L( "HWRM Server - RunServer() - error occurred - signaling semaphore." ) ); + startLock.Signal(); + // make sure we return an error code if there was an error + if (err == KErrNone) + { + err = (renameErr1 == KErrNone) ? renameErr2 : renameErr1; + } + } + } + else // Probably KErrNone + { + // Already running, do not restart + COMPONENT_TRACE1(_L( "HWRM Server - RunServer() - HWRM Server already started, signaling semaphore" ) ); + startLock.Signal(); + } + } + else + { + COMPONENT_TRACE2(_L( "HWRM Server - RunServer() - Problems opening startup semaphore: %d." ), err); + } + + // Cleanup + startLock.Close(); + delete server; + delete scheduler; + + COMPONENT_TRACE2(_L( "HWRM Server - RunServer() - return %d" ), err); + return err; + } + +// ----------------------------------------------------------------------------- +// Main function +// ----------------------------------------------------------------------------- +// +TInt E32Main() + { + COMPONENT_TRACE1(_L( "HWRM Server - E32Main()" )); + + __UHEAP_MARK; + + TInt ret(KErrNone); + + // No process with same name found, start server. + CTrapCleanup* cleanup = CTrapCleanup::New(); + ret = KErrNoMemory; + + if ( cleanup ) + { + ret = RunServer(); + + delete cleanup; + } + + __UHEAP_MARKEND; + + COMPONENT_TRACE2(_L( "HWRM Server - E32Main - return %d" ), ret ); + + return ret; + } + +// End of File