--- a/bearermanagement/mpm/src/mpmlauncher.cpp Fri Mar 12 15:44:18 2010 +0200
+++ b/bearermanagement/mpm/src/mpmlauncher.cpp Mon Mar 15 12:42:11 2010 +0200
@@ -40,18 +40,26 @@
{
MPMLOGSTRING("MPMLauncher::LaunchServer")
const TUidType serverUid(KNullUid,aServerUid2,aServerUid3);
+ RSemaphore semaphore;
+ TInt err( KErrNone );
- // We just create a new server process. Simultaneous
- // launching of two such processes should be detected when the second one
- // attempts to create the server object, failing with KErrAlreadyExists.
- //
+ err = semaphore.CreateGlobal( KMPMLauncherSemaphore, 0 );
+ if ( err != KErrNone )
+ {
+ // Creating semaphore failed, which means some other thread is
+ // creating the server right. Propagate error KErrServerBusy
+ // to inform the client it should try connecting again.
+ return KErrServerBusy;
+ }
+
MPMLOGSTRING("Create a new server process")
RProcess server;
TInt r=server.Create(aServerFileName,KNullDesC,serverUid);
-
+
if ( r != KErrNone )
{
MPMLOGSTRING2("Server process creation returned error: %d", r)
+ semaphore.Close();
return r;
}
TRequestStatus stat;
@@ -70,6 +78,7 @@
// from KErrNone
r = ( server.ExitType() == EExitPanic ) ? KErrGeneral : stat.Int();
server.Close();
+ semaphore.Close();
return r;
}