rpms/opal/F-11 opal-handlers.cxx.patch, NONE, 1.1 opal.spec, 1.49, 1.50
Peter Robinson
pbrobinson at fedoraproject.org
Thu May 28 14:25:57 UTC 2009
Author: pbrobinson
Update of /cvs/pkgs/rpms/opal/F-11
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv4175
Modified Files:
opal.spec
Added Files:
opal-handlers.cxx.patch
Log Message:
- Add an upstream patch to fix a deadlock issue.
opal-handlers.cxx.patch:
--- NEW FILE opal-handlers.cxx.patch ---
--- opal-3.6.2/src/sip/handlers.cxx.orig 2009-05-28 12:27:34.000000000 +0100
+++ opal-3.6.2/src/sip/handlers.cxx 2009-05-28 14:02:21.000000000 +0100
@@ -1465,6 +1465,16 @@
//////////////////////////////////////////////////////////////////
+/* All of the bwlow search loops run through the list with only
+ PSafeReference rather than PSafeReadOnly, even though they are
+ reading fields from the handler instances. We can get away with
+ this becuase the information being tested, e.g. AOR, is constant
+ for the life of the handler instance, once constructed.
+
+ We need to use PSafeReference as there are some cases where
+ deadlocks can occur when locked handlers look for information
+ from other handlers.
+ */
unsigned SIPHandlersList::GetCount(SIP_PDU::Methods meth, const PString & eventPackage) const
{
unsigned count = 0;
@@ -1493,11 +1503,12 @@
/**
* Find the SIPHandler object with the specified callID
*/
-PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByCallID(const PString & callID, PSafetyMode m)
+PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByCallID(const PString & callID, PSafetyMode mode)
{
- for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler)
- if (callID == handler->GetCallID())
+ for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+ if (callID == handler->GetCallID() && handler.SetSafetyMode(mode))
return handler;
+ }
return NULL;
}
@@ -1505,18 +1516,44 @@
/**
* Find the SIPHandler object with the specified authRealm
*/
-PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByAuthRealm (const PString & authRealm, const PString & userName, PSafetyMode m)
+PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByAuthRealm (const PString & authRealm, const PString & userName, PSafetyMode mode)
{
- PIPSocket::Address realmAddress;
+ PIPSocket::Address handlerRealmAddress;
+ PIPSocket::Address authRealmAddress(authRealm);
+
+ // if username is specified, look for exact matches
+ if (!userName.IsEmpty()) {
+
+ // look for a match to exact user name and realm
+ for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+ if ( handler->GetUsername() == userName &&
+ (handler->GetRealm().IsEmpty() || handler->GetRealm() == authRealm) &&
+ handler.SetSafetyMode(mode))
+ return handler;
+ }
+
+ // look for a match to exact username and realm as hostname
+ for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+ if (PIPSocket::GetHostAddress(handler->GetRealm(), handlerRealmAddress) &&
+ handlerRealmAddress == authRealmAddress &&
+ handler->GetUsername() == userName &&
+ handler.SetSafetyMode(mode))
+ return handler;
+ }
+ }
- for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler) {
- if (authRealm == handler->GetRealm() && (userName.IsEmpty() || userName == handler->GetUsername()))
+ // look for a match to exact realm
+ for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+ if (handler->GetRealm() == authRealm && handler.SetSafetyMode(mode))
return handler;
}
- for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler) {
- if (PIPSocket::GetHostAddress(handler->GetRealm(), realmAddress))
- if (realmAddress == PIPSocket::Address(authRealm) && (userName.IsEmpty() || userName == handler->GetUsername()))
- return handler;
+
+ // look for a match to exact realm as hostname
+ for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+ if (PIPSocket::GetHostAddress(handler->GetRealm(), handlerRealmAddress) &&
+ handlerRealmAddress == authRealmAddress &&
+ handler.SetSafetyMode(mode))
+ return handler;
}
return NULL;
}
@@ -1529,24 +1566,27 @@
* or 6001 at seconix.com when registering 6001 at seconix.com to
* sip.seconix.com
*/
-PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByUrl(const PString & remoteAddress, SIP_PDU::Methods meth, PSafetyMode m)
+PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByUrl(const PString & remoteAddress, SIP_PDU::Methods meth, PSafetyMode mode)
{
SIPURL remoteURL = remoteAddress;
- for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler) {
- if (meth == handler->GetMethod() && remoteURL == handler->GetAddressOfRecord())
+ for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+ if (handler->GetMethod() == meth &&
+ handler->GetAddressOfRecord() == remoteURL &&
+ handler.SetSafetyMode(mode))
return handler;
}
return NULL;
}
-PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByUrl(const PString & aor, SIP_PDU::Methods meth, const PString & eventPackage, PSafetyMode m)
+PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByUrl(const PString & aor, SIP_PDU::Methods meth, const PString & eventPackage, PSafetyMode mode)
{
SIPURL aorURL = aor;
- for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler) {
- if (meth == handler->GetMethod() &&
+ for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+ if (handler->GetMethod() == meth &&
handler->GetAddressOfRecord() == aorURL &&
- handler->GetEventPackage() == eventPackage)
+ handler->GetEventPackage() == eventPackage &&
+ handler.SetSafetyMode(mode))
return handler;
}
return NULL;
@@ -1558,14 +1598,14 @@
* For example, in the above case, the name parameter
* could be "sip.seconix.com" or "seconix.com".
*/
-PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByDomain(const PString & name, SIP_PDU::Methods meth, PSafetyMode m)
+PSafePtr<SIPHandler> SIPHandlersList::FindSIPHandlerByDomain(const PString & name, SIP_PDU::Methods meth, PSafetyMode mode)
{
- for (PSafePtr<SIPHandler> handler(*this, m); handler != NULL; ++handler) {
-
- if ((handler->GetMethod() == meth) &&
- (handler->GetState() != SIPHandler::Unsubscribed) &&
+ for (PSafePtr<SIPHandler> handler(*this, PSafeReference); handler != NULL; ++handler) {
+ if ( handler->GetMethod() == meth &&
+ handler->GetState() != SIPHandler::Unsubscribed &&
(handler->GetAddressOfRecord().GetHostName() == name ||
- handler->GetAddressOfRecord().GetHostAddress().IsEquivalent(name)))
+ handler->GetAddressOfRecord().GetHostAddress().IsEquivalent(name)) &&
+ handler.SetSafetyMode(mode))
return handler;
}
return NULL;
Index: opal.spec
===================================================================
RCS file: /cvs/pkgs/rpms/opal/F-11/opal.spec,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -p -r1.49 -r1.50
--- opal.spec 19 May 2009 23:19:10 -0000 1.49
+++ opal.spec 28 May 2009 14:25:27 -0000 1.50
@@ -1,7 +1,7 @@
Name: opal
Summary: Open Phone Abstraction Library
Version: 3.6.2
-Release: 1%{?dist}
+Release: 2%{?dist}
URL: http://www.opalvoip.org/
# We cannot use unmodified upstream source code because it contains the
# non-free iLBC codec.
@@ -10,6 +10,7 @@ URL: http://www.opalvoip.org/
#Source0: ftp://ftp.gnome.org/pub/gnome/sources/%{name}/3.6/%{name}-%{version}.tar.bz2
Source0: %{name}-%{version}-noilbc.tar.bz2
Patch0: opal-3.6.1-noilbc.patch
+Patch1: opal-handlers.cxx.patch
License: MPLv1.0
Group: System Environment/Libraries
BuildRequires: ptlib-devel = 2.6.2
@@ -41,6 +42,7 @@ header files for opal.
%prep
%setup -q
%patch0 -p1 -b .noilbc
+%patch1 -p1 -b .handlers
%build
%configure --prefix=/usr
@@ -75,6 +77,9 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/pkgconfig/opal.pc
%changelog
+* Thu May 28 2009 Peter Robinson <pbrobinson at gmail.com> - 3.6.2-2
+- Add an upstream patch to fix a deadlock issue.
+
* Tue May 19 2009 Peter Robinson <pbrobinson at gmail.com> - 3.6.2-1
- New stable release for ekiga 3.2.1
More information about the scm-commits
mailing list