[reSIProcate] ClientSubscription - onUpdateActive gets called twice and annoying assert
This assert in ClientSubscription::acceptUpdate is getting annoying to me:
ClientSubscription::acceptUpdate(int statusCode)
{
assert(!mQueuedNotifies.empty()); <<<<<<<<<<< HERE
if (mQueuedNotifies.empty())
{
InfoLog(<< "No queued notify to accept");
return;
}
...
However, getting 2 'onUpdateActive' callback for the 1 NOTIFY is not quite
right either.
The call flow to get this is as follows: (resip log and Ethereal trace
readily available)
Alice Bob
| |
| |
F1 |<----- NOTIFY ----- |
F2 |--- SUB(refresh) -->|
F3 |--- 200 (NOTIFY) -->|
F2 is triggered by 'requestRefresh' which calls 'ClientSubscription::send'
and in 'send', we would set the immediate timer to dispatch the next NOTIFY
to DUM's user:
void
ClientSubscription::send(SharedPtr<SipMessage> msg)
{
...
if (!mEnded)
{
if (!mQueuedNotifies.empty())
{
mDum.addTimer(DumTimeout::SendNextNotify,
0,
getBaseHandle(),
0);
}
...
The next NOTIFY is still the same NOTIFY on top of the queue, hence
onUpdateActive is called twice requiring 2 'acceptUpdate' which leads to my
assert.
Suggested Resolution:
For the 2nd conditional, check that the message being sent is a response (to
the NOTIFY):
if (!mQueuedNotifies.empty() && msg->isResponse())
Could someone verify the fix please. Two weeks silence affirm the fix.
Thanx,
V.
--
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.5.446 / Virus Database: 268.18.11/723 - Release Date: 3/15/2007
11:27 AM