462 __ASSERT_DEBUG((iSubSessions.ActiveCount() == 0 || PitBoss().TestImmediateShutdownPresent()), User::Panic(KSpecAssert_ElemSvrDenWrkrSC, 18)); |
462 __ASSERT_DEBUG((iSubSessions.ActiveCount() == 0 || PitBoss().TestImmediateShutdownPresent()), User::Panic(KSpecAssert_ElemSvrDenWrkrSC, 18)); |
463 |
463 |
464 iProcess.Close(); |
464 iProcess.Close(); |
465 |
465 |
466 const CCommonServer* s = static_cast<const CCommonServer*>(Server()); |
466 const CCommonServer* s = static_cast<const CCommonServer*>(Server()); |
467 __ASSERT_DEBUG(s->iNumSessions>0, User::Panic(KDenFaultPanic, ECommonNegativeSessionCount)); |
467 if (s) // guard against leave during construction (e.g. a leave from CWorkerSession::ConstructL()). |
468 s->iNumSessions--; |
468 { |
469 COMMONLOG((WorkerId(), KECommonSessDetailTag, _L8("CWorkerSession(%08x):\t~CWorkerSession() iNumSessions=%d (remaining)"), this, s->iNumSessions)); |
469 __ASSERT_DEBUG(s->iNumSessions>0, User::Panic(KDenFaultPanic, ECommonNegativeSessionCount)); |
470 |
470 s->iNumSessions--; |
471 CCommonWorkerThread& selfWorker = WorkerThread(); |
471 COMMONLOG((WorkerId(), KECommonSessDetailTag, _L8("CWorkerSession(%08x):\t~CWorkerSession() iNumSessions=%d (remaining)"), this, s->iNumSessions)); |
472 if (selfWorker.ShuttingDown()) |
472 |
473 { |
473 CCommonWorkerThread& selfWorker = WorkerThread(); |
474 COMMONLOG((WorkerId(), KECommonSessDetailTag, _L8("Shutdown requested: %d sessions"), s->iNumSessions)); |
474 if (selfWorker.ShuttingDown()) |
475 if (s->iNumSessions <= 0) |
475 { |
476 { |
476 COMMONLOG((WorkerId(), KECommonSessDetailTag, _L8("Shutdown requested: %d sessions"), s->iNumSessions)); |
477 if(selfWorker.IsMainThread()) |
477 if (s->iNumSessions <= 0) |
478 { |
478 { |
479 selfWorker.PitBoss().SessionShutdownComplete(); |
479 if(selfWorker.IsMainThread()) |
480 } |
480 { |
481 else |
481 selfWorker.PitBoss().SessionShutdownComplete(); |
482 { |
482 } |
483 selfWorker.MaybeTriggerThreadShutdownCallback(); |
483 else |
484 } |
484 { |
485 } |
485 selfWorker.MaybeTriggerThreadShutdownCallback(); |
486 } |
486 } |
|
487 } |
|
488 } |
|
489 } |
487 } |
490 } |
488 |
491 |
489 EXPORT_C void CWorkerSession::ProcessSubSessions(TWorkerId aPeerId, TSubSessionProcessor aSubSessionProcessor, TAny* aArg) |
492 EXPORT_C void CWorkerSession::ProcessSubSessions(TWorkerId aPeerId, TSubSessionProcessor aSubSessionProcessor, TAny* aArg) |
490 { |
493 { |
491 TInt count = iSubSessions.ActiveCount(); |
494 TInt count = iSubSessions.ActiveCount(); |