resourcemgmt/hwresourcesmgr/server/src/HWRMServerStartup.cpp
changeset 0 4e1aa6a622a0
--- /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