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