[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.
|