diff -r 51722b10598b -r 9ddb1d67ebaf commsfwsupport/commselements/meshmachine/src/mm_node.cpp --- a/commsfwsupport/commselements/meshmachine/src/mm_node.cpp Tue Apr 27 17:53:34 2010 +0300 +++ b/commsfwsupport/commselements/meshmachine/src/mm_node.cpp Tue May 11 17:20:19 2010 +0300 @@ -458,25 +458,31 @@ TInt idx = aContext.iNodeActivity->FindOriginator(aCommsId); if (KErrNotFound!=idx) { + TBool canSend = ETrue; if(aContext.iNodeActivity->iOriginators.Count() == 1) // only if this is the final originator { aContext.iNodeActivity->SetError(KErrAbort); aContext.iNodeActivity->Cancel(aContext); + //This is a workaround for CCommsBinderRequest. The proper fix is to abolish the concept of aborting activities. + //Aborting activities is a bad idea as an aborted activity isn't given a chance to perform graceful cleanup. + //Today activities get aborted because their orinators urgently leave. I.e.: they are trully leaving now! Last orders! + //It is then incorrect to leave the activity d'tor to finish the wrap up - because the node will be gone by then. + //So whether and when to send an error must be decided here, by this generic code that has no clue on the subtleties + //of individual activities. If there is no abort - there is urgent leavers. They send TLeaveRequest and they politely + //wait for the completion and all this code is unnecessary. + canSend = (aContext.iNodeActivity->Error() != KErrNone); } - - + //In the "quiet mode", when the hosting node is being destroyed, we can not afford sending //an error to the node as it would hit void. TNodePeerId& originator = aContext.iNodeActivity->iOriginators[idx]; - TBool canSend = !((aIsNodeBeingDestroyed && originator == aContext.NodeId()) - || aContext.iMessage.IsMessage()); + canSend &= !((aIsNodeBeingDestroyed && originator == aContext.NodeId()) + || aContext.iMessage.IsMessage()); if (canSend) { aContext.iNodeActivity->PostToOriginator(originator, TEBase::TError(aContext.iMessage.MessageId(), KErrAbort).CRef()); } - - - aContext.iNodeActivity->RemoveOriginator(idx); + aContext.iNodeActivity->RemoveOriginator(idx); } } }