--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dbgsrv/coredumpserver/server/src/coredumpmain.cpp Tue Mar 02 10:33:16 2010 +0530
@@ -0,0 +1,124 @@
+// Copyright (c) 2007-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 <e32base.h>
+#include "coredumpserver.h"
+#include <debuglogging.h>
+
+_LIT(KWildCard, "*");
+
+/**
+Checks whether another instance of the CDS exists in the system. It is checked
+that:
+ * the secure id of another process is KSecurityServerSecureID??
+ * the PID is different to this process
+ * the FileName of the other process contains KCoreDumpServerName
+
+The final check is only made for the benefit of hardware boards, in a
+production device, the first two checks would be sufficient.
+
+@return ETrue if the CDS is judged to be already running, EFalse otherwise
+*/
+TBool CDSAlreadyExists()
+ {
+ //find PID of this process
+ RProcess process;
+ TProcessId thisProcessId = process.Id();
+
+ TFindProcess find(KWildCard);
+ TFullName name;
+
+ //try and find another CDS based on SecureID value??, which has a different PID
+ while(find.Next(name)==KErrNone)
+ {
+ if (process.Open(find) == KErrNone)
+ {
+ //if(process.SecureId() == KSecurityServerSecureID) //does CDS have something like that
+ {
+ if(process.Id() != thisProcessId)
+ {
+ if(process.FileName().Find(KCoreDumpServerName) != KErrNotFound)
+ {
+ LOG_MSG( "core_dump_main.cpp::CDSAlreadyExists() returning: true" );
+ process.Close();
+ return ETrue;
+ }
+ }
+ }
+ }
+ process.Close();
+ }
+
+ LOG_MSG( "core_dump_main.cpp::CDSAlreadyExists() returning: false\n" );
+ return EFalse;
+ }
+
+
+/**
+Perform all server initialisation, in particular creation of the
+scheduler and server and then run the scheduler
+*/
+
+void CCoreDumpServer::RunServerL()
+ {
+
+ LOG_MSG( "CCoreDumpServer::RunServerL() -> new (ELeave) CActiveScheduler\n" );
+ CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
+
+ LOG_MSG( "CCoreDumpServer::RunServerL() -> PushL(scheduler)\n" );
+ CleanupStack::PushL(scheduler);
+
+ LOG_MSG( "CCoreDumpServer::RunServerL() -> Install(scheduler)\n" );
+ CActiveScheduler::Install(scheduler);
+
+ LOG_MSG( "CCoreDumpServer::RunServerL() -> CCoreDumpServer::NewLC()\n" );
+ CCoreDumpServer::NewLC();
+
+ LOG_MSG( "CCoreDumpServer::RunServerL() -> Rendezvous(KErrNone)\n" );
+ RProcess::Rendezvous(KErrNone);
+
+ LOG_MSG( "CCoreDumpServer::RunServerL() -> CActiveScheduler::Start()\n" );
+ CActiveScheduler::Start();
+
+ // Free the server and active scheduler.
+ CleanupStack::PopAndDestroy(2, scheduler);
+ }
+
+/**
+ Entry point for Core Dump Server
+*/
+TInt E32Main()
+ {
+ __UHEAP_MARK;
+
+ CTrapCleanup* cleanup = CTrapCleanup::New();
+
+ TInt err = KErrNoMemory;
+ if (cleanup)
+ {
+ if(!CDSAlreadyExists())
+ {
+ TRAP(err, CCoreDumpServer::RunServerL());
+ }
+ else
+ err = KErrAlreadyExists;
+ delete cleanup;
+ }
+
+ LOG_MSG2( "<- core_dump_main.cpp::E32Main() returning: %d\n", err );
+ __UHEAP_MARKEND;
+ return KErrNone;
+ }
+