summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaleb Tennis <caleb@gentoo.org>2008-11-11 14:56:34 +0000
committerCaleb Tennis <caleb@gentoo.org>2008-11-11 14:56:34 +0000
commit33b2adb500755d1e5fb92603325b3a3651626cc2 (patch)
tree3999d4ba008ef58c14b2be1433858cdb365a3e30 /dev-cpp/Ice
parentAdded ~ppc keyword. Closes bug #245839 (diff)
downloadgentoo-2-33b2adb500755d1e5fb92603325b3a3651626cc2.tar.gz
gentoo-2-33b2adb500755d1e5fb92603325b3a3651626cc2.tar.bz2
gentoo-2-33b2adb500755d1e5fb92603325b3a3651626cc2.zip
rev bump with upstream patchsets since 3.3.0 release
(Portage version: 2.2_rc12/cvs/Linux 2.6.21-gentoo-r1 i686)
Diffstat (limited to 'dev-cpp/Ice')
-rw-r--r--dev-cpp/Ice/ChangeLog11
-rw-r--r--dev-cpp/Ice/Ice-3.3.0-r1.ebuild83
-rw-r--r--dev-cpp/Ice/files/Ice-3.3.0-p1.patch51
-rw-r--r--dev-cpp/Ice/files/Ice-3.3.0-p3.patch17
-rw-r--r--dev-cpp/Ice/files/Ice-3.3.0-p4.patch57
-rw-r--r--dev-cpp/Ice/files/Ice-3.3.0-p5.patch25
-rw-r--r--dev-cpp/Ice/files/Ice-3.3.0-p6.patch41
-rw-r--r--dev-cpp/Ice/files/Ice-3.3.0-p7.patch475
-rw-r--r--dev-cpp/Ice/files/Ice-3.3.0-p8.patch232
9 files changed, 991 insertions, 1 deletions
diff --git a/dev-cpp/Ice/ChangeLog b/dev-cpp/Ice/ChangeLog
index ad3440f9f24c..e3888c80d642 100644
--- a/dev-cpp/Ice/ChangeLog
+++ b/dev-cpp/Ice/ChangeLog
@@ -1,6 +1,15 @@
# ChangeLog for dev-cpp/Ice
# Copyright 1999-2008 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/dev-cpp/Ice/ChangeLog,v 1.16 2008/08/23 18:28:46 maekke Exp $
+# $Header: /var/cvsroot/gentoo-x86/dev-cpp/Ice/ChangeLog,v 1.17 2008/11/11 14:56:33 caleb Exp $
+
+*Ice-3.3.0-r1 (11 Nov 2008)
+
+ 11 Nov 2008; Caleb Tennis <caleb@gentoo.org> +files/Ice-3.3.0-p1.patch,
+ +files/Ice-3.3.0-p3.patch, +files/Ice-3.3.0-p4.patch,
+ +files/Ice-3.3.0-p5.patch, +files/Ice-3.3.0-p6.patch,
+ +files/Ice-3.3.0-p7.patch, +files/Ice-3.3.0-p8.patch,
+ +Ice-3.3.0-r1.ebuild:
+ rev bump with upstream patchsets since 3.3.0 release
23 Aug 2008; Markus Meier <maekke@gentoo.org> Ice-3.3.0.ebuild:
add ~amd64, bug #235186
diff --git a/dev-cpp/Ice/Ice-3.3.0-r1.ebuild b/dev-cpp/Ice/Ice-3.3.0-r1.ebuild
new file mode 100644
index 000000000000..ee6f3df3c5b8
--- /dev/null
+++ b/dev-cpp/Ice/Ice-3.3.0-r1.ebuild
@@ -0,0 +1,83 @@
+# Copyright 1999-2008 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/dev-cpp/Ice/Ice-3.3.0-r1.ebuild,v 1.1 2008/11/11 14:56:34 caleb Exp $
+
+inherit eutils
+
+DESCRIPTION="ICE middleware C++ bindings"
+HOMEPAGE="http://www.zeroc.com/index.html"
+SRC_URI="http://www.zeroc.com/download/Ice/3.3/${P}.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+KEYWORDS="~amd64 ~x86"
+IUSE="ncurses test debug"
+
+RDEPEND=">=dev-libs/expat-2.0.1
+ >=app-arch/bzip2-1.0.4
+ >=dev-libs/openssl-0.9.8g
+ =sys-libs/db-4.6.21*
+ =dev-cpp/libmcpp-2.6.4"
+
+DEPEND="${RDEPEND}
+ ncurses? ( sys-libs/ncurses sys-libs/readline )
+ test? ( >=dev-lang/python-2.4 )"
+
+S=${WORKDIR}/${P}/cpp
+
+pkg_setup() {
+ if built_with_use sys-libs/db nocxx; then
+ eerror "sys-libs/db must be compiled with C++ support!"
+ eerror "Remove the 'nocxx' use flag and try again."
+ die "Fix use flags and re-emerge"
+ fi
+}
+
+src_unpack() {
+ unpack ${A}
+ cd "${S}"
+
+ epatch "${FILESDIR}"/${P}-p1.patch
+ epatch "${FILESDIR}"/${P}-p3.patch
+ epatch "${FILESDIR}"/${P}-p4.patch
+ epatch "${FILESDIR}"/${P}-p5.patch
+ epatch "${FILESDIR}"/${P}-p6.patch
+ epatch "${FILESDIR}"/${P}-p7.patch
+ epatch "${FILESDIR}"/${P}-p8.patch
+
+ epatch "${FILESDIR}"/${P}-Makefile.patch
+
+ MAKE_RULES="${S}/config/Make.rules"
+
+ #if use amd64; then
+ # sed -i -e "s:^#LP64:LP64:g" "${MAKE_RULES}" \
+ # || die "Failed to set lib64 directory"
+ #fi
+
+ if ! use ncurses; then
+ sed -i -e "s#^USE_READLINE.*#USE_READLINE ?= yes#g" \
+ "${MAKE_RULES}" || die "Failed to set no readline"
+ fi
+
+ if ! use debug; then
+ sed -i -e "s:#OPTIMIZE:OPTIMIZE:" \
+ "${MAKE_RULES}" || die "Failed to remove debug"
+ fi
+
+ sed -i -e \
+ "s:.*CXXFLAGS[^\+]*\=\s:CXXFLAGS = ${CXXFLAGS} :g" \
+ "${MAKE_RULES}.Linux" || die "CXXFLAGS patching failed!"
+}
+
+src_compile() {
+ emake || die "make failed"
+}
+
+src_install() {
+ emake DESTDIR="${D}" install || die "Install failed"
+ cp -dpR "${S}"/../slice "${D}"/usr/share/Ice
+}
+
+src_test() {
+ emake test || die "Test failed"
+}
diff --git a/dev-cpp/Ice/files/Ice-3.3.0-p1.patch b/dev-cpp/Ice/files/Ice-3.3.0-p1.patch
new file mode 100644
index 000000000000..91198baba5f6
--- /dev/null
+++ b/dev-cpp/Ice/files/Ice-3.3.0-p1.patch
@@ -0,0 +1,51 @@
+diff -c -r -N Ice-3.3.0-orig/cpp/src/Slice/Util.cpp Ice-3.3.0/cpp/src/Slice/Util.cpp
+*** Ice-3.3.0-orig/cpp/src/Slice/Util.cpp Tue Jun 24 10:28:04 2008
+--- Ice-3.3.0/cpp/src/Slice/Util.cpp Tue Jun 24 10:44:19 2008
+***************
+*** 49,57 ****
+ ++pos;
+ }
+ }
+! if(result[result.size() - 1] == '/') // Remove trailing '/'
+ {
+! result.erase(result.size() - 1);
+ }
+ return result;
+ }
+--- 49,65 ----
+ ++pos;
+ }
+ }
+!
+! if(result.size() > 1) // Remove trailing "/" or "/."
+ {
+! if(result[result.size() - 1] == '/')
+! {
+! result.erase(result.size() - 1);
+! }
+! else if(result[result.size() - 2] == '/' && result[result.size() - 1] == '.')
+! {
+! result.erase(result.size() - (result.size() == 2 ? 1 : 2));
+! }
+ }
+ return result;
+ }
+***************
+*** 159,164 ****
+--- 167,181 ----
+ }
+ }
+
++ if(result == file)
++ {
++ //
++ // Don't return a full path if we couldn't reduce the given path, instead
++ // return the normalized given path.
++ //
++ result = normalizePath(orig);
++ }
++
+ string::size_type pos;
+ if((pos = result.rfind('.')) != string::npos)
+ {
+
diff --git a/dev-cpp/Ice/files/Ice-3.3.0-p3.patch b/dev-cpp/Ice/files/Ice-3.3.0-p3.patch
new file mode 100644
index 000000000000..bc8732c5300a
--- /dev/null
+++ b/dev-cpp/Ice/files/Ice-3.3.0-p3.patch
@@ -0,0 +1,17 @@
+diff --git a/cpp/src/Ice/ConnectRequestHandler.cpp b/cpp/src/Ice/ConnectRequestHandler.cpp
+index e037745..8c93f22 100644
+--- a/cpp/src/Ice/ConnectRequestHandler.cpp
++++ b/cpp/src/Ice/ConnectRequestHandler.cpp
+@@ -212,7 +212,10 @@ ConnectRequestHandler::abortBatchRequest()
+ Ice::ConnectionI*
+ ConnectRequestHandler::sendRequest(Outgoing* out)
+ {
+- if(!getConnection(true)->sendRequest(out, _compress, _response) || _response)
++ // Must be called first, _compress might not be initialized before this returns.
++ Ice::ConnectionIPtr connection = getConnection(true);
++ assert(connection);
++ if(!connection->sendRequest(out, _compress, _response) || _response)
+ {
+ return _connection.get(); // The request has been sent or we're expecting a response.
+ }
+
diff --git a/dev-cpp/Ice/files/Ice-3.3.0-p4.patch b/dev-cpp/Ice/files/Ice-3.3.0-p4.patch
new file mode 100644
index 000000000000..5e89b0b0961b
--- /dev/null
+++ b/dev-cpp/Ice/files/Ice-3.3.0-p4.patch
@@ -0,0 +1,57 @@
+diff -r -c -N ../Ice-3.3.0-old/cpp/src/Slice/Preprocessor.cpp ./cpp/src/Slice/Preprocessor.cpp
+*** ../Ice-3.3.0-old/cpp/src/Slice/Preprocessor.cpp 2008-05-16 14:54:01.000000000 -0230
+--- ./cpp/src/Slice/Preprocessor.cpp 2008-08-14 11:31:58.000000000 -0230
+***************
+*** 175,192 ****
+ //
+ char* buf = mcpp_get_mem_buffer(Out);
+
+- _cppFile = ".preprocess." + IceUtil::generateUUID();
+- SignalHandler::addFile(_cppFile);
+ #ifdef _WIN32
+ _cppHandle = ::_wfopen(IceUtil::stringToWstring(_cppFile).c_str(), IceUtil::stringToWstring("w+").c_str());
+ #else
+ _cppHandle = ::fopen(_cppFile.c_str(), "w+");
+ #endif
+! if(buf)
+ {
+! ::fwrite(buf, strlen(buf), 1, _cppHandle);
+ }
+- ::rewind(_cppHandle);
+ }
+
+ //
+--- 175,206 ----
+ //
+ char* buf = mcpp_get_mem_buffer(Out);
+
+ #ifdef _WIN32
++ TCHAR buffer[512];
++ DWORD ret = GetTempPath(512, buffer);
++ if(ret > 512 || ret == 0)
++ {
++ fprintf(stderr, "GetTempPath failed (%d)\n", GetLastError());
++ }
++ _cppFile = string(buffer) + "\\.preprocess." + IceUtil::generateUUID();
+ _cppHandle = ::_wfopen(IceUtil::stringToWstring(_cppFile).c_str(), IceUtil::stringToWstring("w+").c_str());
+ #else
++ _cppFile = "/tmp/.preprocess." + IceUtil::generateUUID();
+ _cppHandle = ::fopen(_cppFile.c_str(), "w+");
+ #endif
+! if(_cppHandle != NULL)
+! {
+! SignalHandler::addFile(_cppFile);
+! if(buf)
+! {
+! ::fwrite(buf, strlen(buf), 1, _cppHandle);
+! }
+! ::rewind(_cppHandle);
+! }
+! else
+ {
+! fprintf(stderr, "Could not open temporary file: %s\n", _cppFile.c_str());
+ }
+ }
+
+ //
+
diff --git a/dev-cpp/Ice/files/Ice-3.3.0-p5.patch b/dev-cpp/Ice/files/Ice-3.3.0-p5.patch
new file mode 100644
index 000000000000..393aa889cab1
--- /dev/null
+++ b/dev-cpp/Ice/files/Ice-3.3.0-p5.patch
@@ -0,0 +1,25 @@
+diff --git a/cpp/src/IceGrid/LocatorI.cpp b/cpp/src/IceGrid/LocatorI.cpp
+index bf910ba..554a170 100644
+--- a/cpp/src/IceGrid/LocatorI.cpp
++++ b/cpp/src/IceGrid/LocatorI.cpp
+@@ -588,13 +588,15 @@ LocatorI::activate(const LocatorAdapterInfo& adapter, const RequestPtr& request)
+ // we just add this one to the queue. If not, we add it to the queue and initiate
+ // a call on the adapter to get its direct proxy.
+ //
+- PendingRequestsMap::iterator p;
+- p = _pendingRequests.insert(make_pair(adapter.id, PendingRequests())).first;
+- p->second.insert(request);
+- if(p->second.size() != 1)
++ PendingRequestsMap::iterator p = _pendingRequests.find(adapter.id);
++ if(p != _pendingRequests.end())
+ {
++ p->second.insert(request);
+ return;
+ }
++
++ p = _pendingRequests.insert(make_pair(adapter.id, PendingRequests())).first;
++ p->second.insert(request);
+ }
+
+ AMI_Adapter_activatePtr amiCB = new AMI_Adapter_activateI(this, adapter.id);
+
diff --git a/dev-cpp/Ice/files/Ice-3.3.0-p6.patch b/dev-cpp/Ice/files/Ice-3.3.0-p6.patch
new file mode 100644
index 000000000000..25abc3f41801
--- /dev/null
+++ b/dev-cpp/Ice/files/Ice-3.3.0-p6.patch
@@ -0,0 +1,41 @@
+diff --git a/cpp/src/IceGrid/LocatorI.cpp b/cpp/src/IceGrid/LocatorI.cpp
+index 554a170..3fbe3a1 100644
+--- a/cpp/src/IceGrid/LocatorI.cpp
++++ b/cpp/src/IceGrid/LocatorI.cpp
+@@ -236,12 +236,15 @@ LocatorI::Request::activate(const string& id)
+ // NOTE: we use a timeout large enough to ensure that the activate() call won't
+ // timeout if the server hangs in deactivation and/or activation.
+ //
+- for(LocatorAdapterInfoSeq::const_iterator p = _adapters.begin(); p != _adapters.end(); ++p)
+ {
+- if(p->id == id)
++ Lock sync(*this);
++ for(LocatorAdapterInfoSeq::const_iterator p = _adapters.begin(); p != _adapters.end(); ++p)
+ {
+- _locator->activate(*p, this);
+- _activating.insert(id);
++ if(p->id == id)
++ {
++ _locator->activate(*p, this);
++ _activating.insert(id);
++ }
+ }
+ }
+
+@@ -684,7 +687,14 @@ LocatorI::removePendingResolve(const string& adapterId, int roundRobinCount)
+ //
+ if(roundRobinCount > 0)
+ {
+- _database->getAdapter(adapterId)->increaseRoundRobinCount(roundRobinCount);
++ try
++ {
++ _database->getAdapter(adapterId)->increaseRoundRobinCount(roundRobinCount);
++ }
++ catch(const Ice::Exception&)
++ {
++ // Ignore.
++ }
+ }
+
+ map<string, deque<Ice::AMD_Locator_findAdapterByIdPtr> >::iterator p = _resolves.find(adapterId);
+
diff --git a/dev-cpp/Ice/files/Ice-3.3.0-p7.patch b/dev-cpp/Ice/files/Ice-3.3.0-p7.patch
new file mode 100644
index 000000000000..fcdf85ec5961
--- /dev/null
+++ b/dev-cpp/Ice/files/Ice-3.3.0-p7.patch
@@ -0,0 +1,475 @@
+diff --git a/cpp/include/Ice/OutgoingAsync.h b/cpp/include/Ice/OutgoingAsync.h
+index ae16ece..70f3cf2 100644
+--- a/cpp/include/Ice/OutgoingAsync.h
++++ b/cpp/include/Ice/OutgoingAsync.h
+@@ -25,6 +25,7 @@ namespace IceInternal
+ class BasicStream;
+ class LocalExceptionWrapper;
+ class Outgoing;
++class RetryTask;
+
+ class ICE_API OutgoingAsyncMessageCallback : virtual public IceUtil::Shared
+ {
+@@ -49,6 +50,8 @@ public:
+
+ protected:
+
++ friend class ::IceInternal::RetryTask;
++
+ void __acquireCallback(const Ice::ObjectPrx&);
+ void __releaseCallback(const Ice::LocalException&);
+ void __releaseCallback()
+@@ -83,6 +86,7 @@ public:
+ void __finished(const Ice::LocalException&);
+ void __finished(const LocalExceptionWrapper&);
+
++ void __retry(int);
+ bool __send();
+
+ protected:
+diff --git a/cpp/src/Ice/Instance.cpp b/cpp/src/Ice/Instance.cpp
+index 8a1e5f4..b26a194 100644
+--- a/cpp/src/Ice/Instance.cpp
++++ b/cpp/src/Ice/Instance.cpp
+@@ -29,6 +29,7 @@
+ #include <Ice/LoggerI.h>
+ #include <Ice/Network.h>
+ #include <Ice/EndpointFactoryManager.h>
++#include <Ice/RetryQueue.h>
+ #include <Ice/TcpEndpointI.h>
+ #include <Ice/UdpEndpointI.h>
+ #include <Ice/DynamicLibrary.h>
+@@ -285,6 +286,19 @@ IceInternal::Instance::endpointHostResolver()
+ return _endpointHostResolver;
+ }
+
++RetryQueuePtr
++IceInternal::Instance::retryQueue()
++{
++ IceUtil::RecMutex::Lock sync(*this);
++
++ if(_state == StateDestroyed)
++ {
++ throw CommunicatorDestroyedException(__FILE__, __LINE__);
++ }
++
++ return _retryQueue;
++}
++
+ IceUtil::TimerPtr
+ IceInternal::Instance::timer()
+ {
+@@ -991,6 +1005,8 @@ IceInternal::Instance::Instance(const CommunicatorPtr& communicator, const Initi
+ _servantFactoryManager = new ObjectFactoryManager();
+
+ _objectAdapterFactory = new ObjectAdapterFactory(this, communicator);
++
++ _retryQueue = new RetryQueue(this);
+
+ if(_initData.wstringConverter == 0)
+ {
+@@ -1039,6 +1055,7 @@ IceInternal::Instance::~Instance()
+ assert(!_serverThreadPool);
+ assert(!_selectorThread);
+ assert(!_endpointHostResolver);
++ assert(!_retryQueue);
+ assert(!_timer);
+ assert(!_routerManager);
+ assert(!_locatorManager);
+@@ -1200,6 +1217,11 @@ IceInternal::Instance::destroy()
+ _outgoingConnectionFactory->waitUntilFinished();
+ }
+
++ if(_retryQueue)
++ {
++ _retryQueue->destroy();
++ }
++
+ ThreadPoolPtr serverThreadPool;
+ ThreadPoolPtr clientThreadPool;
+ SelectorThreadPtr selectorThread;
+@@ -1210,6 +1232,7 @@ IceInternal::Instance::destroy()
+
+ _objectAdapterFactory = 0;
+ _outgoingConnectionFactory = 0;
++ _retryQueue = 0;
+
+ if(_connectionMonitor)
+ {
+diff --git a/cpp/src/Ice/Instance.h b/cpp/src/Ice/Instance.h
+index f0aa50a..721b347 100644
+--- a/cpp/src/Ice/Instance.h
++++ b/cpp/src/Ice/Instance.h
+@@ -30,6 +30,7 @@
+ #include <Ice/ObjectFactoryManagerF.h>
+ #include <Ice/ObjectAdapterFactoryF.h>
+ #include <Ice/EndpointFactoryManagerF.h>
++#include <Ice/RetryQueueF.h>
+ #include <Ice/DynamicLibraryF.h>
+ #include <Ice/PluginF.h>
+ #include <Ice/Initialize.h>
+@@ -71,6 +72,7 @@ public:
+ ThreadPoolPtr serverThreadPool();
+ SelectorThreadPtr selectorThread();
+ EndpointHostResolverPtr endpointHostResolver();
++ RetryQueuePtr retryQueue();
+ IceUtil::TimerPtr timer();
+ EndpointFactoryManagerPtr endpointFactoryManager() const;
+ DynamicLibraryListPtr dynamicLibraryList() const;
+@@ -134,6 +136,7 @@ private:
+ ThreadPoolPtr _serverThreadPool;
+ SelectorThreadPtr _selectorThread;
+ EndpointHostResolverPtr _endpointHostResolver;
++ RetryQueuePtr _retryQueue;
+ IceUtil::TimerPtr _timer;
+ EndpointFactoryManagerPtr _endpointFactoryManager;
+ DynamicLibraryListPtr _dynamicLibraryList;
+diff --git a/cpp/src/Ice/Makefile b/cpp/src/Ice/Makefile
+index f236dd4..dbf931e 100644
+--- a/cpp/src/Ice/Makefile
++++ b/cpp/src/Ice/Makefile
+@@ -80,6 +80,7 @@ OBJS = Acceptor.o \
+ Proxy.o \
+ ReferenceFactory.o \
+ Reference.o \
++ RetryQueue.o \
+ RequestHandler.o \
+ RouterInfo.o \
+ Router.o \
+diff --git a/cpp/src/Ice/OutgoingAsync.cpp b/cpp/src/Ice/OutgoingAsync.cpp
+index 14da199..c866fe1 100644
+--- a/cpp/src/Ice/OutgoingAsync.cpp
++++ b/cpp/src/Ice/OutgoingAsync.cpp
+@@ -24,6 +24,7 @@
+ #include <Ice/ReplyStatus.h>
+ #include <Ice/ImplicitContextI.h>
+ #include <Ice/ThreadPool.h>
++#include <Ice/RetryQueue.h>
+
+ using namespace std;
+ using namespace Ice;
+@@ -454,6 +455,24 @@ IceInternal::OutgoingAsync::__finished(const LocalExceptionWrapper& ex)
+ }
+ }
+
++void
++IceInternal::OutgoingAsync::__retry(int interval)
++{
++ //
++ // This method is called by the proxy to retry an invocation, no
++ // other threads can access this object.
++ //
++ if(interval > 0)
++ {
++ assert(__os);
++ __os->instance()->retryQueue()->add(this, interval);
++ }
++ else
++ {
++ __send();
++ }
++}
++
+ bool
+ IceInternal::OutgoingAsync::__send()
+ {
+@@ -466,11 +485,11 @@ IceInternal::OutgoingAsync::__send()
+ }
+ catch(const LocalExceptionWrapper& ex)
+ {
+- handleException(ex);
++ handleException(ex); // Might call __send() again upon retry and assign _sentSynchronously
+ }
+ catch(const Ice::LocalException& ex)
+ {
+- handleException(ex);
++ handleException(ex); // Might call __send() again upon retry and assign _sentSynchronously
+ }
+ return _sentSynchronously;
+ }
+@@ -483,6 +502,7 @@ IceInternal::OutgoingAsync::__prepare(const ObjectPrx& prx, const string& operat
+ _delegate = 0;
+ _cnt = 0;
+ _mode = mode;
++ _sentSynchronously = false;
+
+ //
+ // Can't call async via a batch proxy.
+diff --git a/cpp/src/Ice/ProxyFactory.cpp b/cpp/src/Ice/ProxyFactory.cpp
+index 2fc5316..eeb554d 100644
+--- a/cpp/src/Ice/ProxyFactory.cpp
++++ b/cpp/src/Ice/ProxyFactory.cpp
+@@ -25,32 +25,8 @@ using namespace std;
+ using namespace Ice;
+ using namespace IceInternal;
+
+-namespace
+-{
+-
+-class RetryTask : public IceUtil::TimerTask
+-{
+-public:
+-
+- RetryTask(const OutgoingAsyncPtr& out) : _out(out)
+- {
+- }
+-
+- virtual void
+- runTimerTask()
+- {
+- _out->__send();
+- }
+-
+-private:
+-
+- const OutgoingAsyncPtr _out;
+-};
+-
+-}
+-
+ IceUtil::Shared* IceInternal::upCast(ProxyFactory* p) { return p; }
+-
++
+ ObjectPrx
+ IceInternal::ProxyFactory::stringToProxy(const string& str) const
+ {
+@@ -243,34 +219,17 @@ IceInternal::ProxyFactory::checkRetryAfterException(const LocalException& ex,
+ }
+ out << " because of exception\n" << ex;
+ }
+-
+- if(interval > 0)
++
++ if(out)
+ {
+- if(out)
+- {
+- try
+- {
+- _instance->timer()->schedule(new RetryTask(out), IceUtil::Time::milliSeconds(interval));
+- }
+- catch(const IceUtil::IllegalArgumentException&) // Expected if the communicator destroyed the timer.
+- {
+- throw CommunicatorDestroyedException(__FILE__, __LINE__);
+- }
+- }
+- else
+- {
+- //
+- // Sleep before retrying.
+- //
+- IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(interval));
+- }
++ out->__retry(interval);
+ }
+- else
++ else if(interval > 0)
+ {
+- if(out)
+- {
+- out->__send();
+- }
++ //
++ // Sleep before retrying.
++ //
++ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(interval));
+ }
+ }
+
+diff --git a/cpp/src/Ice/RetryQueue.cpp b/cpp/src/Ice/RetryQueue.cpp
+new file mode 100644
+index 0000000..d6aba62
+--- /dev/null
++++ b/cpp/src/Ice/RetryQueue.cpp
+@@ -0,0 +1,92 @@
++// **********************************************************************
++//
++// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
++//
++// This copy of Ice is licensed to you under the terms described in the
++// ICE_LICENSE file included in this distribution.
++//
++// **********************************************************************
++
++#include <Ice/RetryQueue.h>
++#include <Ice/OutgoingAsync.h>
++#include <Ice/LocalException.h>
++#include <Ice/Instance.h>
++
++using namespace std;
++using namespace Ice;
++using namespace IceInternal;
++
++IceUtil::Shared* IceInternal::upCast(RetryQueue* p) { return p; }
++
++IceInternal::RetryTask::RetryTask(const RetryQueuePtr& queue, const OutgoingAsyncPtr& outAsync) :
++ _queue(queue), _outAsync(outAsync)
++{
++}
++
++void
++IceInternal::RetryTask::runTimerTask()
++{
++ if(_queue->remove(this))
++ {
++ try
++ {
++ _outAsync->__send();
++ }
++ catch(const Ice::LocalException& ex)
++ {
++ _outAsync->__releaseCallback(ex);
++ }
++ }
++}
++
++void
++IceInternal::RetryTask::destroy()
++{
++ _outAsync->__releaseCallback(CommunicatorDestroyedException(__FILE__, __LINE__));
++}
++
++bool
++IceInternal::RetryTask::operator<(const RetryTask& rhs) const
++{
++ return this < &rhs;
++}
++
++IceInternal::RetryQueue::RetryQueue(const InstancePtr& instance) : _instance(instance)
++{
++}
++
++void
++IceInternal::RetryQueue::add(const OutgoingAsyncPtr& out, int interval)
++{
++ Lock sync(*this);
++ RetryTaskPtr task = new RetryTask(this, out);
++ try
++ {
++ _instance->timer()->schedule(task, IceUtil::Time::milliSeconds(interval));
++ }
++ catch(const IceUtil::IllegalArgumentException&) // Expected if the communicator destroyed the timer.
++ {
++ throw CommunicatorDestroyedException(__FILE__, __LINE__);
++ }
++ _requests.insert(task);
++}
++
++void
++IceInternal::RetryQueue::destroy()
++{
++ Lock sync(*this);
++ for(set<RetryTaskPtr>::const_iterator p = _requests.begin(); p != _requests.end(); ++p)
++ {
++ _instance->timer()->cancel(*p);
++ (*p)->destroy();
++ }
++ _requests.clear();
++}
++
++bool
++IceInternal::RetryQueue::remove(const RetryTaskPtr& task)
++{
++ Lock sync(*this);
++ return _requests.erase(task) > 0;
++}
++
+diff --git a/cpp/src/Ice/RetryQueue.h b/cpp/src/Ice/RetryQueue.h
+new file mode 100644
+index 0000000..960b4a8
+--- /dev/null
++++ b/cpp/src/Ice/RetryQueue.h
+@@ -0,0 +1,62 @@
++// **********************************************************************
++//
++// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
++//
++// This copy of Ice is licensed to you under the terms described in the
++// ICE_LICENSE file included in this distribution.
++//
++// **********************************************************************
++
++#ifndef ICE_RETRY_QUEUE_H
++#define ICE_RETRY_QUEUE_H
++
++#include <IceUtil/Shared.h>
++#include <IceUtil/Mutex.h>
++#include <IceUtil/Timer.h>
++#include <Ice/RetryQueueF.h>
++#include <Ice/OutgoingAsyncF.h>
++#include <Ice/InstanceF.h>
++
++namespace IceInternal
++{
++
++class RetryTask : public IceUtil::TimerTask
++{
++public:
++
++ RetryTask(const RetryQueuePtr&, const OutgoingAsyncPtr&);
++
++ virtual void runTimerTask();
++ void destroy();
++
++ bool operator<(const RetryTask&) const;
++
++private:
++
++ const RetryQueuePtr _queue;
++ const OutgoingAsyncPtr _outAsync;
++};
++typedef IceUtil::Handle<RetryTask> RetryTaskPtr;
++
++class RetryQueue : public IceUtil::Shared, public IceUtil::Mutex
++{
++public:
++
++ RetryQueue(const InstancePtr&);
++
++ void add(const OutgoingAsyncPtr&, int);
++ void destroy();
++
++private:
++
++ bool remove(const RetryTaskPtr&);
++ friend class RetryTask;
++
++ const InstancePtr _instance;
++ std::set<RetryTaskPtr> _requests;
++};
++
++}
++
++#endif
++
+diff --git a/cpp/src/Ice/RetryQueueF.h b/cpp/src/Ice/RetryQueueF.h
+new file mode 100644
+index 0000000..0e99fd7
+--- /dev/null
++++ b/cpp/src/Ice/RetryQueueF.h
+@@ -0,0 +1,24 @@
++// **********************************************************************
++//
++// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
++//
++// This copy of Ice is licensed to you under the terms described in the
++// ICE_LICENSE file included in this distribution.
++//
++// **********************************************************************
++
++#ifndef ICE_RETRY_QUEUE_F_H
++#define ICE_RETRY_QUEUE_F_H
++
++#include <Ice/Handle.h>
++
++namespace IceInternal
++{
++
++class RetryQueue;
++IceUtil::Shared* upCast(RetryQueue*);
++typedef Handle<RetryQueue> RetryQueuePtr;
++
++}
++
++#endif
+
diff --git a/dev-cpp/Ice/files/Ice-3.3.0-p8.patch b/dev-cpp/Ice/files/Ice-3.3.0-p8.patch
new file mode 100644
index 000000000000..d87b1f6db868
--- /dev/null
+++ b/dev-cpp/Ice/files/Ice-3.3.0-p8.patch
@@ -0,0 +1,232 @@
+diff -c -r -N ../Ice-3.3.0/cpp/include/IceUtil/StringUtil.h ./cpp/include/IceUtil/StringUtil.h
+*** ../Ice-3.3.0/cpp/include/IceUtil/StringUtil.h 2008-05-16 14:54:00.000000000 -0230
+--- ./cpp/include/IceUtil/StringUtil.h 2008-10-30 12:51:39.000000000 -0230
+***************
+*** 65,70 ****
+--- 65,82 ----
+ #else
+ ICE_UTIL_API std::string errorToString(int);
+ #endif
++
++ //
++ // Functions to convert to to all lower/upper case
++ //
++ ICE_UTIL_API std::string toLower(const std::string&);
++ ICE_UTIL_API std::string toUpper(const std::string&);
++
++ //
++ // Remove all whitespace from a string
++ //
++ ICE_UTIL_API std::string removeWhitespace(const std::string&);
++
+ }
+
+ #endif
+diff -c -r -N ../Ice-3.3.0/cpp/src/IcePatch2/Calc.cpp ./cpp/src/IcePatch2/Calc.cpp
+*** ../Ice-3.3.0/cpp/src/IcePatch2/Calc.cpp 2008-05-16 14:54:00.000000000 -0230
+--- ./cpp/src/IcePatch2/Calc.cpp 2008-10-30 13:04:19.000000000 -0230
+***************
+*** 42,48 ****
+
+ for(string::size_type i = 0; i < lhs.path.size(); ++i)
+ {
+! if(::tolower(lhs.path[i]) != ::tolower(rhs.path[i]))
+ {
+ return false;
+ }
+--- 42,48 ----
+
+ for(string::size_type i = 0; i < lhs.path.size(); ++i)
+ {
+! if(::tolower(static_cast<unsigned char>(lhs.path[i])) != ::tolower(static_cast<unsigned char>(rhs.path[i])))
+ {
+ return false;
+ }
+***************
+*** 59,69 ****
+ {
+ for(string::size_type i = 0; i < lhs.path.size() && i < rhs.path.size(); ++i)
+ {
+! if(::tolower(lhs.path[i]) < ::tolower(rhs.path[i]))
+ {
+ return true;
+ }
+! else if(::tolower(lhs.path[i]) > ::tolower(rhs.path[i]))
+ {
+ return false;
+ }
+--- 59,70 ----
+ {
+ for(string::size_type i = 0; i < lhs.path.size() && i < rhs.path.size(); ++i)
+ {
+! if(::tolower(static_cast<unsigned char>(lhs.path[i])) < ::tolower(static_cast<unsigned char>(rhs.path[i])))
+ {
+ return true;
+ }
+! else if(::tolower(static_cast<unsigned char>(lhs.path[i])) >
+! ::tolower(static_cast<unsigned char>(rhs.path[i])))
+ {
+ return false;
+ }
+diff -c -r -N ../Ice-3.3.0/cpp/src/IcePatch2/Client.cpp ./cpp/src/IcePatch2/Client.cpp
+*** ../Ice-3.3.0/cpp/src/IcePatch2/Client.cpp 2008-05-16 14:54:00.000000000 -0230
+--- ./cpp/src/IcePatch2/Client.cpp 2008-10-30 12:58:41.000000000 -0230
+***************
+*** 8,13 ****
+--- 8,14 ----
+ // **********************************************************************
+
+ #include <IceUtil/Options.h>
++ #include <IceUtil/StringUtil.h>
+ #include <Ice/Application.h>
+ #include <IcePatch2/Util.h>
+ #include <IcePatch2/ClientUtil.h>
+***************
+*** 54,60 ****
+ {
+ cout << "Do a thorough patch? (yes/no)" << endl;
+ cin >> answer;
+! transform(answer.begin(), answer.end(), answer.begin(), ::tolower);
+ if(answer == "no")
+ {
+ return false;
+--- 55,61 ----
+ {
+ cout << "Do a thorough patch? (yes/no)" << endl;
+ cin >> answer;
+! answer = IceUtilInternal::toLower(answer);
+ if(answer == "no")
+ {
+ return false;
+diff -c -r -N ../Ice-3.3.0/cpp/src/IcePatch2/Util.cpp ./cpp/src/IcePatch2/Util.cpp
+*** ../Ice-3.3.0/cpp/src/IcePatch2/Util.cpp 2008-05-16 14:54:00.000000000 -0230
+--- ./cpp/src/IcePatch2/Util.cpp 2008-10-30 13:01:05.000000000 -0230
+***************
+*** 280,286 ****
+ }
+
+ if(result == "/." ||
+! (result.size() == 4 && isalpha(result[0]) && result[1] == ':' && result[2] == '/' && result[3] == '.'))
+ {
+ return result.substr(0, result.size() - 1);
+ }
+--- 280,287 ----
+ }
+
+ if(result == "/." ||
+! (result.size() == 4 && isalpha(static_cast<unsigned char>(result[0])) && result[1] == ':' &&
+! result[2] == '/' && result[3] == '.'))
+ {
+ return result.substr(0, result.size() - 1);
+ }
+***************
+*** 290,296 ****
+ result.erase(result.size() - 2, 2);
+ }
+
+! if(result == "/" || (result.size() == 3 && isalpha(result[0]) && result[1] == ':' && result[2] == '/'))
+ {
+ return result;
+ }
+--- 291,298 ----
+ result.erase(result.size() - 2, 2);
+ }
+
+! if(result == "/" || (result.size() == 3 && isalpha(static_cast<unsigned char>(result[0])) &&
+! result[1] == ':' && result[2] == '/'))
+ {
+ return result;
+ }
+***************
+*** 317,328 ****
+ }
+
+ unsigned i = 0;
+! while(isspace(pa[i]))
+ {
+ ++i;
+ }
+ #ifdef _WIN32
+! return pa[i] == '\\' || pa[i] == '/' || pa.size() > i + 1 && isalpha(pa[i]) && pa[i + 1] == ':';
+ #else
+ return pa[i] == '/';
+ #endif
+--- 319,331 ----
+ }
+
+ unsigned i = 0;
+! while(isspace(static_cast<unsigned char>(pa[i])))
+ {
+ ++i;
+ }
+ #ifdef _WIN32
+! return pa[i] == '\\' || pa[i] == '/' || pa.size() > i + 1 &&
+! isalpha(static_cast<unsigned char>(pa[i])) && pa[i + 1] == ':';
+ #else
+ return pa[i] == '/';
+ #endif
+***************
+*** 333,339 ****
+ {
+ string path = simplify(pa);
+ #ifdef _WIN32
+! return path == "/" || path.size() == 3 && isalpha(path[0]) && path[1] == ':' && path[2] == '/';
+ #else
+ return path == "/";
+ #endif
+--- 336,343 ----
+ {
+ string path = simplify(pa);
+ #ifdef _WIN32
+! return path == "/" || path.size() == 3 && isalpha(static_cast<unsigned char>(path[0])) &&
+! path[1] == ':' && path[2] == '/';
+ #else
+ return path == "/";
+ #endif
+diff -c -r -N ../Ice-3.3.0/cpp/src/IceUtil/StringUtil.cpp ./cpp/src/IceUtil/StringUtil.cpp
+*** ../Ice-3.3.0/cpp/src/IceUtil/StringUtil.cpp 2008-05-16 14:54:01.000000000 -0230
+--- ./cpp/src/IceUtil/StringUtil.cpp 2008-10-30 12:55:40.000000000 -0230
+***************
+*** 687,690 ****
+--- 687,726 ----
+ return errorToString(errno);
+ }
+
++ string
++ IceUtilInternal::toLower(const std::string& s)
++ {
++ string result;
++ for(unsigned int i = 0; i < s.length(); ++ i)
++ {
++ result += tolower(static_cast<unsigned char>(s[i]));
++ }
++ return result;
++ }
++
++ string
++ IceUtilInternal::toUpper(const std::string& s)
++ {
++ string result;
++ for(unsigned int i = 0; i < s.length(); ++ i)
++ {
++ result += toupper(static_cast<unsigned char>(s[i]));
++ }
++ return result;
++ }
++
++ string
++ IceUtilInternal::removeWhitespace(const std::string& s)
++ {
++ string result;
++ for(unsigned int i = 0; i < s.length(); ++ i)
++ {
++ if(!isspace(static_cast<unsigned char>(s[i])))
++ {
++ result += s[i];
++ }
++ }
++ return result;
++ }
++
+ #endif
+