diff -r 4ccf8e394726 -r 51722b10598b commsfwsupport/commselements/serverden/src/sd_workersession.cpp --- 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(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)