commsfwsupport/commselements/serverden/src/sd_workersession.cpp
branchRCL_3
changeset 15 51722b10598b
parent 1 21d2ab05f085
child 24 00c6709d25aa
--- a/commsfwsupport/commselements/serverden/src/sd_workersession.cpp	Wed Apr 14 17:14:05 2010 +0300
+++ b/commsfwsupport/commselements/serverden/src/sd_workersession.cpp	Tue Apr 27 17:53:34 2010 +0300
@@ -464,26 +464,29 @@
 	iProcess.Close();
 
 	const CCommonServer* s = static_cast<const CCommonServer*>(Server());
-	__ASSERT_DEBUG(s->iNumSessions>0, User::Panic(KDenFaultPanic, ECommonNegativeSessionCount));
-	s->iNumSessions--;
-	COMMONLOG((WorkerId(), KECommonSessDetailTag, _L8("CWorkerSession(%08x):\t~CWorkerSession() iNumSessions=%d (remaining)"), this, s->iNumSessions));
-
-	CCommonWorkerThread& selfWorker = WorkerThread();
-	if (selfWorker.ShuttingDown())
-		{
-		COMMONLOG((WorkerId(), KECommonSessDetailTag, _L8("Shutdown requested: %d sessions"), s->iNumSessions));
-		if (s->iNumSessions <= 0)
-			{
-			if(selfWorker.IsMainThread())
-				{
-				selfWorker.PitBoss().SessionShutdownComplete();
-				}
-			else
-				{
-				selfWorker.MaybeTriggerThreadShutdownCallback();
-				}
-			}
-		}
+	if (s)     // guard against leave during construction (e.g. a leave from CWorkerSession::ConstructL()).
+	    {
+        __ASSERT_DEBUG(s->iNumSessions>0, User::Panic(KDenFaultPanic, ECommonNegativeSessionCount));
+        s->iNumSessions--;
+        COMMONLOG((WorkerId(), KECommonSessDetailTag, _L8("CWorkerSession(%08x):\t~CWorkerSession() iNumSessions=%d (remaining)"), this, s->iNumSessions));
+    
+        CCommonWorkerThread& selfWorker = WorkerThread();
+        if (selfWorker.ShuttingDown())
+            {
+            COMMONLOG((WorkerId(), KECommonSessDetailTag, _L8("Shutdown requested: %d sessions"), s->iNumSessions));
+            if (s->iNumSessions <= 0)
+                {
+                if(selfWorker.IsMainThread())
+                    {
+                    selfWorker.PitBoss().SessionShutdownComplete();
+                    }
+                else
+                    {
+                    selfWorker.MaybeTriggerThreadShutdownCallback();
+                    }
+                }
+            }
+	    }
 	}
 
 EXPORT_C void CWorkerSession::ProcessSubSessions(TWorkerId aPeerId, TSubSessionProcessor aSubSessionProcessor, TAny* aArg)