Fwd: [reSIProcate] AppDialogSet Memory Leak
Kevin Pickard
kpickard at upstreamworks.com
Tue Mar 14 07:52:01 CST 2006
Hello everyone. I posted this a week ago but no one has responded.
Before I go and write what I think is missing code, can someone let me know
if I am even on the right track?
Thanks.
>Date: Wed, 08 Mar 2006 12:06:11 -0500
>To: <resiprocate-devel at list.sipfoundry.org>
>
> Hello everyone.
>
> We have encountered a problem that is resulting in a memory leak
> due to AppDialogSets that are no longer being used but never getting
> released/destroyed. I have taken a look at the DUM source and have
> identified the reason it is happening. It looks like the code for
> handling our particular scenario has not been completed. So I am
> wondering if what we are doing is correct and the code has just not been
> written yet or if there is a better way of handling this situation.
>
> Basically the scenario is that we create a SUBSCRIBE request via
> Dum.makeSubscription() passing in our own AppDialogSet. We then send the
> request. Now the device we are subscribing to never responds (for
> whatever reason) and the request eventually times out with an internally
> generated 408 SipResp. In this simple situation DUM eventually calls
> destroy() on the AppDialogSet and things get cleaned up nicely.
>
> The problem occurs if we try to kill the request *before* the
> timeout occurs. We are currently calling end() on the AppDialogSet to do
> this. This results in the state of the underlying DialogSet being set to
> WaitingToEnd. Now when the 408 timeout response is then generated, it
> eventually gets passed through to DialogSet::dispatch() for processing.
> As can be seen from the code shown below, using a Release build, the
> resulting action is to do nothing. With a debug build it will assert().
> In our scenario mState is WaitingToEnd and the last method was SUBSCRIBE.
>
> So are we doing the right thing? Is it just a matter that no one
> has written the handling code for SUBSCRIBE yet? The code for handling
> the same situation for INVITE is present and I would expect that the
> equivalent code for handling the SUBSCRIBE situation would be similar.
> Otherwise, is there a better way of killing the pending SUBSCRIBE?
>
> Thanks.
>
>
>void
>DialogSet::dispatch(const SipMessage& msg)
>{
> assert(msg.isRequest() || msg.isResponse());
>
> if (mState == WaitingToEnd)
> {
> assert(mDialogs.empty());
> if (msg.isResponse())
> {
> int code = msg.header(h_StatusLine).statusCode();
> switch(mCreator->getLastRequest()->header(h_CSeq).method())
> {
> case INVITE:
> if (code / 100 == 1)
> {
> mState = ReceivedProvisional;
> end();
> }
> else if (code / 100 == 2)
> {
> Dialog dialog(mDum, msg, *this);
>
> SharedPtr<SipMessage> ack(new SipMessage);
> dialog.makeRequest(*ack, ACK);
> ack->header(h_CSeq).sequence() =
> msg.header(h_CSeq).sequence();
> dialog.send(ack);
>
> SharedPtr<SipMessage> bye(new SipMessage);
> dialog.makeRequest(*bye, BYE);
> dialog.send(bye);
>
> // Note: Destruction of this dialog object will cause
> DialogSet::possiblyDie to be called thus invoking mDum.destroy
> }
> else
> {
> mState = Destroying;
> mDum.destroy(this);
> }
> break;
> case SUBSCRIBE:
> assert(0);
> break;
> default:
> break;
> }
> }
More information about the resiprocate-devel
mailing list