Fixed bug: reset circuit pending synchronous transaction when received a DLCX from media gateway.

git-svn-id: http://voip.null.ro/svn/yate@4802 acf43c95-373e-0410-b603-e72c3f656dc1
This commit is contained in:
marian 2012-01-12 11:13:15 +00:00
parent fdcc08b5c1
commit 703e3314ab
1 changed files with 10 additions and 3 deletions

View File

@ -239,7 +239,7 @@ protected:
}
void mediaChanged(const SDPMedia& media);
private:
void waitNotChanging();
void waitNotChanging(bool clearTrans = false);
MGCPMessage* message(const char* cmd);
bool sendAsync(MGCPMessage* mm, bool notify = false);
RefPointer<MGCPMessage> sendSync(MGCPMessage* mm);
@ -1527,7 +1527,8 @@ void MGCPCircuit::clearConn(bool force)
}
// Wait for changing flag to be false
void MGCPCircuit::waitNotChanging()
// Clear pending transaction if requested and the circuit is changing
void MGCPCircuit::waitNotChanging(bool clearTrans)
{
while (true) {
Lock lock(s_mutex);
@ -1535,6 +1536,10 @@ void MGCPCircuit::waitNotChanging()
m_changing = true;
break;
}
if (clearTrans && m_tr) {
m_tr->userData(0);
m_tr = 0;
}
lock.drop();
Thread::yield(true);
}
@ -1583,8 +1588,10 @@ RefPointer<MGCPMessage> MGCPCircuit::sendSync(MGCPMessage* mm)
}
u_int64_t t2 = Time::msecNow();
MGCPTransaction* tr = s_engine->sendCommand(mm,ep->address);
s_mutex.lock();
tr->userData(static_cast<GenObject*>(this));
m_tr = tr;
s_mutex.unlock();
while (m_tr == tr)
Thread::idle();
RefPointer<MGCPMessage> tmp = m_msg;
@ -2061,7 +2068,7 @@ bool MGCPCircuit::processNotify(const String& package, const String& event, cons
// We were forcibly disconnected by the gateway
void MGCPCircuit::processDelete(MGCPMessage* mm, const String& error)
{
waitNotChanging();
waitNotChanging(true);
if (m_connId)
Debug(&splugin,DebugWarn,"Gateway deleted connection '%s' on circuit %u [%p]",
m_connId.c_str(),code(),this);