[Opalvoip-svn] SF.net SVN: opalvoip:[34784] opal/trunk
Brought to you by:
csoutheren,
rjongbloed
From: <rjo...@us...> - 2016-04-19 13:32:15
|
Revision: 34784 http://sourceforge.net/p/opalvoip/code/34784 Author: rjongbloed Date: 2016-04-19 13:32:13 +0000 (Tue, 19 Apr 2016) Log Message: ----------- Fixed termination pseudo deadlock issue, if one media session transport subchannel fails, close them all, or the remaining open ones take a long time for their threads to terminate, effectively deadlocking. Modified Paths: -------------- opal/trunk/include/opal/mediasession.h opal/trunk/src/opal/mediasession.cxx Modified: opal/trunk/include/opal/mediasession.h =================================================================== --- opal/trunk/include/opal/mediasession.h 2016-04-19 13:25:10 UTC (rev 34783) +++ opal/trunk/include/opal/mediasession.h 2016-04-19 13:32:13 UTC (rev 34784) @@ -455,6 +455,7 @@ void SetRemoteBehindNAT(); protected: + virtual void InternalClose(); virtual void InternalStop(); PString m_name; @@ -476,7 +477,6 @@ ); void ThreadMain(); bool HandleUnavailableError(); - void Close(); typedef PNotifierListTemplate<PBYTEArray> NotifierList; NotifierList m_notifiers; Modified: opal/trunk/src/opal/mediasession.cxx =================================================================== --- opal/trunk/src/opal/mediasession.cxx 2016-04-19 13:25:10 UTC (rev 34783) +++ opal/trunk/src/opal/mediasession.cxx 2016-04-19 13:32:13 UTC (rev 34784) @@ -697,7 +697,7 @@ PTRACE(2, m_owner, *m_owner << m_subchannel << " timed out (" << m_channel->GetReadTimeout() << "s), other subchannels running"); else { PTRACE(1, m_owner, *m_owner << m_subchannel << " timed out (" << m_owner->m_mediaTimeout << "s), closing"); - Close(); + m_owner->InternalClose(); } break; @@ -705,7 +705,7 @@ PTRACE(1, m_owner, *m_owner << m_subchannel << " read error (" << m_channel->GetErrorNumber(PChannel::LastReadError) << "): " << m_channel->GetErrorText(PChannel::LastReadError)); - Close(); + m_owner->InternalClose(); break; } } @@ -732,23 +732,25 @@ PTRACE(2, m_owner, *m_owner << m_subchannel << ' ' << m_owner->m_maxNoTransmitTime << " seconds of transmit fails to " << m_owner->GetRemoteAddress(m_subchannel)); - Close(); + m_owner->InternalClose(); return false; } -void OpalMediaTransport::Transport::Close() +void OpalMediaTransport::InternalClose() { - if (m_channel == NULL) + if (!LockReadOnly()) return; - PChannel * base = m_channel->GetBaseReadChannel(); - if (base == NULL) - return; + for (vector<Transport>::iterator it = m_subchannels.begin(); it != m_subchannels.end(); ++it) { + if (it->m_channel != NULL) { + PChannel * base = it->m_channel->GetBaseReadChannel(); + if (base != NULL) + base->Close(); + } + } - base->Close(); - m_owner->m_opened = false; - m_owner->InternalRxData(m_subchannel, PBYTEArray()); + UnlockReadOnly(); } @@ -801,10 +803,7 @@ void OpalMediaTransport::InternalStop() { PTRACE(4, *this << "stopping " << m_subchannels.size() << "subchannels."); - LockReadOnly(); - for (vector<Transport>::iterator it = m_subchannels.begin(); it != m_subchannels.end(); ++it) - it->Close(); - UnlockReadOnly(); + InternalClose(); for (vector<Transport>::iterator it = m_subchannels.begin(); it != m_subchannels.end(); ++it) { if (it->m_thread != NULL) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |