Hi,
I have found a bug with twice H323Connection::Unlock() call if we have an connection issue.
Take a look:
1.We are running connection.SendSignalSetup function from H225CallThread::Main() and if it returns any reason!=H323Connection::EndedByCallerAbort we will Unlock the connection.
void H225CallThread::Main()
{
PTRACE(3, "H225\tStarted call thread");
if (connection.Lock()) {
H323Connection::CallEndReason reason = connection.SendSignalSetup(alias, address);
// Special case, if we aborted the call then already will be unlocked
if (reason != H323Connection::EndedByCallerAbort)
connection.Unlock();
// bla-bla-bla
}
2.But we have case when connection.SendSignalSetup returns non H323Connection::EndedByCallerAbort reason but has own unlocked state - for this case PTLIB will unlock the mutex twice with assert (as minimum) message.
H323Connection::SendSignalSetup(const PString & alias,
const H323TransportAddress & address)
{
//bla-bla-bla
// Release the mutex as can deadlock trying to clear call during connect.
Unlock();
PBoolean connectFailed = false;
if (!signallingChannel->IsOpen()) {
signallingChannel->SetWriteTimeout(100);
connectFailed = !signallingChannel->Connect();
}
// See if transport connect failed, abort if so.
if (connectFailed) {
connectionState = NoConnectionActive;
switch (signallingChannel->GetErrorNumber()) {
case ENETUNREACH :
return EndedByUnreachable;
case ECONNREFUSED :
return EndedByNoEndPoint;
case ETIMEDOUT :
return EndedByHostOffline;
}
return EndedByConnectFail;
}
}
Thanks
--
Iurii Gordiienko