commsfwsupport/commselements/serverden/src/sd_workerthread.cpp
changeset 65 41cc8e7ff496
parent 0 dfb7c4ff071f
equal deleted inserted replaced
40:34fc115b8742 65:41cc8e7ff496
   452 		aMsg.SubModule1()->Printable(fullModName1);
   452 		aMsg.SubModule1()->Printable(fullModName1);
   453 		aMsg.SubModule2()->Printable(fullModName2);
   453 		aMsg.SubModule2()->Printable(fullModName2);
   454 	#endif
   454 	#endif
   455 
   455 
   456 	// Mark the peer handler as unbinding
   456 	// Mark the peer handler as unbinding
   457     __CFLOG_VAR(( KECommonComponentTag, KECommonServerTag, _L8("W%d: CFUnbindMessageReceived %S <=> %S"),
   457     COMMONLOG((WorkerId(), KECommonBootingTag, _L8("W%d: CFUnbindMessageReceived %S <=> %S"),
   458 		WorkerId(),
   458 		WorkerId(),
   459 		&fullModName1,
   459 		&fullModName1,
   460 		&fullModName2 ));
   460 		&fullModName2 ));
   461 	TWorkerId unbindId;
   461 	TWorkerId unbindId;
   462 	TInt err = DecodePeerId(aMsg.SubModule1(), aMsg.SubModule2(), unbindId);
   462 	TInt err = DecodePeerId(aMsg.SubModule1(), aMsg.SubModule2(), unbindId);
   481 		}
   481 		}
   482 	if(err == KErrNone)
   482 	if(err == KErrNone)
   483 		{
   483 		{
   484 		iTransport->SetLastRequestIdConcerningPeer(unbindId, aMsg.Identifier());
   484 		iTransport->SetLastRequestIdConcerningPeer(unbindId, aMsg.Identifier());
   485 		iTransport->SetDropTransportPending(unbindId, ETrue);
   485 		iTransport->SetDropTransportPending(unbindId, ETrue);
   486 		MaybeCompleteUnbinding(unbindId);
   486 		MaybeCompleteUnbinding(unbindId, aMsg.PeerIsDead());
   487 		}
   487 		}
   488 	else
   488 	else
   489 		{
   489 		{
   490 		CommsFW::TCFUnbindCompleteMsg respMsg(aMsg.Identifier(), err);
   490 		CommsFW::TCFUnbindCompleteMsg respMsg(aMsg.Identifier(), err);
   491 		VERIFY_RESULT(iChannelHandler->Send(respMsg), KErrNone);
   491 		VERIFY_RESULT(iChannelHandler->Send(respMsg), KErrNone);
   505 		for(TWorkerId player = TWorkerThreadPublicInfo::EMainThread; player <= TWorkerThreadPublicInfo::EMaxWorkerThreadId; ++player)
   505 		for(TWorkerId player = TWorkerThreadPublicInfo::EMainThread; player <= TWorkerThreadPublicInfo::EMaxWorkerThreadId; ++player)
   506 			{
   506 			{
   507 			// We always have a transport to ourself & it needs no unbinding
   507 			// We always have a transport to ourself & it needs no unbinding
   508 			if(player != WorkerId())
   508 			if(player != WorkerId())
   509 				{
   509 				{
   510 				MaybeCompleteUnbinding(player);
   510 				MaybeCompleteUnbinding(player, EFalse);
   511 				if(iTransport->PeerReachable(player))
   511 				if(iTransport->PeerReachable(player))
   512 					{
   512 					{
   513 					return EFalse;
   513 					return EFalse;
   514 					}
   514 					}
   515 				}
   515 				}
   524 unbind from this particular worker. If so, deletes handler and send unbind response to Root Server.
   524 unbind from this particular worker. If so, deletes handler and send unbind response to Root Server.
   525 @see CCommonDealer::CanUnbindFromWorker
   525 @see CCommonDealer::CanUnbindFromWorker
   526 @see CCommonPlayer::CanUnbindFromWorker
   526 @see CCommonPlayer::CanUnbindFromWorker
   527 @see TCFUnbindCompleteMsg
   527 @see TCFUnbindCompleteMsg
   528 */
   528 */
   529 EXPORT_C void CCommonWorkerThread::MaybeCompleteUnbinding(TWorkerId aWorker)
   529 EXPORT_C void CCommonWorkerThread::MaybeCompleteUnbinding(TWorkerId aWorker, TBool aPeerIsDead)
   530 	{
   530 	{
   531 	if(iTransport->PeerReachable(aWorker) && iTransport->IsDropTransportPending(aWorker))
   531 	if(iTransport->PeerReachable(aWorker) && iTransport->IsDropTransportPending(aWorker))
   532 		{
   532 		{
   533 		if(!Dealer() || Dealer()->CanUnbindFromWorker(aWorker))
   533 		if(aPeerIsDead || !Dealer() || Dealer()->CanUnbindFromWorker(aWorker))
   534 			{
   534 			{
   535 			if(!Player() || Player()->CanUnbindFromWorker(aWorker))
   535 			if(aPeerIsDead || !Player() || Player()->CanUnbindFromWorker(aWorker))
   536 				{
   536 				{
   537 				COMMONLOG((WorkerId(), KECommonBootingTag, _L8("CCommonWorkerThread::MaybeCompleteUnbinding(%d) - dropping transport & unbinding"), aWorker));
   537 				COMMONLOG((WorkerId(), KECommonBootingTag, _L8("CCommonWorkerThread::MaybeCompleteUnbinding(%d) - dropping transport & unbinding"), aWorker));
   538 				// Let the peer know that we've unbound - if it has management responsibility towards us then
   538 				// Let the peer know that we've unbound - if it has management responsibility towards us then
   539 				// it will be waiting. All possible roles unbind simultaneously (although the message could be used
   539 				// it will be waiting. All possible roles unbind simultaneously (although the message could be used
   540 				// more selectively)
   540 				// more selectively)
   717 	//		// Users of the transport to the dead thread may need to clean-up
   717 	//		// Users of the transport to the dead thread may need to clean-up
   718 	//		iTransportUsers.NotifyPeerDeath(peerId);
   718 	//		iTransportUsers.NotifyPeerDeath(peerId);
   719 
   719 
   720 			if(iTransport->PeerReachable(peerId))
   720 			if(iTransport->PeerReachable(peerId))
   721 				{
   721 				{
   722 				MaybeCompleteUnbinding(peerId);
   722 				MaybeCompleteUnbinding(peerId, ETrue);
   723 				if(iTransport->PeerReachable(peerId))
   723 				if(iTransport->PeerReachable(peerId))
   724 					{
   724 					{
   725 					COMMONLOG((iWorkerId, KECommonServerTag, _L8("Destroying peer #%d handler"),peerId));
   725 					COMMONLOG((iWorkerId, KECommonServerTag, _L8("Destroying peer #%d handler"),peerId));
   726 					iTransport->DropTransportToPeer(peerId);
   726 					iTransport->DropTransportToPeer(peerId);
   727 					}
   727 					}