[Opalvoip-svn] SF.net SVN: opalvoip:[24980] opal/branches/Sirius_B/src/opal/rtpep.cxx
Brought to you by:
csoutheren,
rjongbloed
From: <rjo...@us...> - 2010-12-22 11:41:25
|
Revision: 24980 http://opalvoip.svn.sourceforge.net/opalvoip/?rev=24980&view=rev Author: rjongbloed Date: 2010-12-22 11:41:19 +0000 (Wed, 22 Dec 2010) Log Message: ----------- Use a snapshot copy of the active connections to avoid deadlock, restartable PSfePtr enumeration was abandoned. Modified Paths: -------------- opal/branches/Sirius_B/src/opal/rtpep.cxx Modified: opal/branches/Sirius_B/src/opal/rtpep.cxx =================================================================== --- opal/branches/Sirius_B/src/opal/rtpep.cxx 2010-12-22 11:34:45 UTC (rev 24979) +++ opal/branches/Sirius_B/src/opal/rtpep.cxx 2010-12-22 11:41:19 UTC (rev 24980) @@ -133,8 +133,12 @@ PTRACE(5, "RTPEp\tSession " << stream.GetSessionID() << ", " "remote RTP port " << remotePort << " not peviously remembered, searching."); - // Not already cached so search all RTP connections for if it is there - for (PSafePtr<OpalRTPConnection> connection(connectionsActive, PSafeReadOnly, true); connection != NULL; ++connection) { + /* Not already cached so search all RTP connections for if it is there + To avoid deadlocks take a snapshot of the active list at an instant + of time and iterate over that. The other connection MUST already be + there or it isn't a hairpinned call. */ + ConnectionDict snapshot(connectionsActive); + for (PSafePtr<OpalRTPConnection> connection(snapshot, PSafeReadOnly); connection != NULL; ++connection) { if (connection->FindSessionByLocalPort(remotePort) != NULL) { PTRACE(4, "RTPEp\tSession " << stream.GetSessionID() << ", " "remembering remote RTP port " << remotePort << " on connection " << *connection); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |