--- /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