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 } |