rpms/ice/F-8 Ice-3.3.0-compression.patch, NONE, 1.1 Ice-3.3.0-icegrid-assert.patch, NONE, 1.1 Ice-3.3.0-icepatch-non-ascii.patch, NONE, 1.1 Ice-3.3.0-preprocess.patch, NONE, 1.1 Ice-3.3.0-python-26.patch, NONE, 1.1 Ice-3.3.0-registry-crash.patch, NONE, 1.1 Ice-3.3.0-retry-intervals.patch, NONE, 1.1 Ice-3.3.0-use-db4.7.patch, NONE, 1.1 ice.spec, 1.12, 1.13

Mary Ellen Foster mef at fedoraproject.org
Thu Dec 4 10:22:52 UTC 2008


Author: mef

Update of /cvs/pkgs/rpms/ice/F-8
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv11743

Modified Files:
	ice.spec 
Added Files:
	Ice-3.3.0-compression.patch Ice-3.3.0-icegrid-assert.patch 
	Ice-3.3.0-icepatch-non-ascii.patch Ice-3.3.0-preprocess.patch 
	Ice-3.3.0-python-26.patch Ice-3.3.0-registry-crash.patch 
	Ice-3.3.0-retry-intervals.patch Ice-3.3.0-use-db4.7.patch 
Log Message:
Add all upstream patches; add comments for patches; add Python 2.6 support

Ice-3.3.0-compression.patch:

--- NEW FILE Ice-3.3.0-compression.patch ---
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.
     }

Ice-3.3.0-icegrid-assert.patch:

--- NEW FILE Ice-3.3.0-icegrid-assert.patch ---
diff --git a/cpp/src/IceGrid/Database.cpp b/cpp/src/IceGrid/Database.cpp
index 5e5ff94..b2d91a0 100644
--- a/cpp/src/IceGrid/Database.cpp
+++ b/cpp/src/IceGrid/Database.cpp
@@ -395,7 +395,7 @@ Database::syncApplicationDescriptor(const ApplicationDescriptor& newDesc, AdminS
         Lock sync(*this);
         checkSessionLock(session);
 
-        while(_updating.find(update.descriptor.name) != _updating.end())
+        while(_updating.find(newDesc.name) != _updating.end())
         {
             wait();
         }

Ice-3.3.0-icepatch-non-ascii.patch:

--- NEW FILE Ice-3.3.0-icepatch-non-ascii.patch ---
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

Ice-3.3.0-preprocess.patch:

--- NEW FILE Ice-3.3.0-preprocess.patch ---
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());
          }
      }
  
      //

Ice-3.3.0-python-26.patch:

--- NEW FILE Ice-3.3.0-python-26.patch ---
--- Ice-3.3.0/py/config/Make.rules.orig	2008-12-04 10:01:51.000000000 +0100
+++ Ice-3.3.0/py/config/Make.rules	2008-12-04 10:01:55.000000000 +0100
@@ -63,7 +63,7 @@
     # version used for building the Ice extension, then set PYTHON_VERSION
     # to "python2.3" or "python2.4".
     #
-    PYTHON_VERSION	?= $(word 1,$(notdir $(wildcard /usr/include/python2.[345]*)))
+    PYTHON_VERSION	?= $(word 1,$(notdir $(wildcard /usr/include/python2.[3456]*)))
     ifeq ($(PYTHON_VERSION),)
       python_darwin_home = /System/Library/Frameworks/Python.framework/Versions/Current
       PYTHON_VERSION 	= $(word 1,$(notdir $(wildcard $(python_darwin_home)/include/python2.[345]*)))

Ice-3.3.0-registry-crash.patch:

--- NEW FILE Ice-3.3.0-registry-crash.patch ---
diff --git a/cpp/src/IceGrid/LocatorI.cpp b/cpp/src/IceGrid/LocatorI.cpp
index bf910ba..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);
+            }
         }
     }
 
@@ -588,13 +591,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);
@@ -682,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);

Ice-3.3.0-retry-intervals.patch:

--- NEW FILE Ice-3.3.0-retry-intervals.patch ---
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/Makefile.mak b/cpp/src/Ice/Makefile.mak
index 86800d9..314c3d3 100644
--- a/cpp/src/Ice/Makefile.mak
+++ b/cpp/src/Ice/Makefile.mak
@@ -81,6 +81,7 @@ OBJS		= Acceptor.obj \
 		  Proxy.obj \
 		  ReferenceFactory.obj \
 		  Reference.obj \
+		  RetryQueue.obj \
 		  RequestHandler.obj \
 		  RouterInfo.obj \
 		  Router.obj \
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/cs/src/Ice/Instance.cs b/cs/src/Ice/Instance.cs
index 2c9012e..de098da 100644
--- a/cs/src/Ice/Instance.cs
+++ b/cs/src/Ice/Instance.cs
@@ -216,6 +216,20 @@ namespace IceInternal
             }
         }
 
+        public RetryQueue
+        retryQueue()
+        {
+            lock(this)
+            {
+                if(_state == StateDestroyed)
+                {
+                    throw new Ice.CommunicatorDestroyedException();
+                }
+                
+                return _retryQueue;
+            }
+        }
+
         public Timer
         timer()
         {
@@ -742,7 +756,9 @@ namespace IceInternal
                 _servantFactoryManager = new ObjectFactoryManager();
                 
                 _objectAdapterFactory = new ObjectAdapterFactory(this, communicator);
-
+                
+                _retryQueue = new RetryQueue(this);
+                
                 string[] facetFilter = _initData.properties.getPropertyAsList("Ice.Admin.Facets");
                 if(facetFilter.Length > 0)
                 {
@@ -886,6 +902,11 @@ namespace IceInternal
                 _outgoingConnectionFactory.waitUntilFinished();
             }
             
+            if(_retryQueue != null)
+            {
+                _retryQueue.destroy();
+            }
+
             ThreadPool serverThreadPool = null;
             ThreadPool clientThreadPool = null;
             EndpointHostResolver endpointHostResolver = null;
@@ -893,9 +914,9 @@ namespace IceInternal
             lock(this)
             {
                 _objectAdapterFactory = null;
-                
                 _outgoingConnectionFactory = null;
-                
+                _retryQueue = null;
+
                 if(_connectionMonitor != null)
                 {
                     _connectionMonitor.destroy();
@@ -1032,6 +1053,7 @@ namespace IceInternal
         private ThreadPool _serverThreadPool;
         private EndpointHostResolver _endpointHostResolver;
         private Timer _timer;
+        private RetryQueue _retryQueue;
         private bool _background;
         private EndpointFactoryManager _endpointFactoryManager;
         private Ice.PluginManager _pluginManager;
diff --git a/cs/src/Ice/Makefile b/cs/src/Ice/Makefile
index f8e1ff0..f8d27c5 100644
--- a/cs/src/Ice/Makefile
+++ b/cs/src/Ice/Makefile
@@ -76,6 +76,7 @@ SRCS		= Acceptor.cs \
 		  ReferenceFactory.cs \
                   ReplyStatus.cs \
                   RequestHandler.cs \
+		  RetryQueue.cs \
 		  RouterInfo.cs \
 		  ServantManager.cs \
 		  Set.cs \
diff --git a/cs/src/Ice/Makefile.mak b/cs/src/Ice/Makefile.mak
index a082e51..07ebcc0 100644
--- a/cs/src/Ice/Makefile.mak
+++ b/cs/src/Ice/Makefile.mak
@@ -76,6 +76,7 @@ SRCS		= Acceptor.cs \
 		  ReferenceFactory.cs \
                   ReplyStatus.cs \
                   RequestHandler.cs \
+		  RetryQueue.cs \
 		  RouterInfo.cs \
 		  ServantManager.cs \
 		  Set.cs \
diff --git a/cs/src/Ice/OutgoingAsync.cs b/cs/src/Ice/OutgoingAsync.cs
index 516fc70..ea261d6 100644
--- a/cs/src/Ice/OutgoingAsync.cs
+++ b/cs/src/Ice/OutgoingAsync.cs
@@ -74,7 +74,7 @@ namespace IceInternal
             }
         }
 
-        protected void releaseCallback__(Ice.LocalException ex)
+        public void releaseCallback__(Ice.LocalException ex)
         {
             Debug.Assert(os__ != null);
             
@@ -99,7 +99,7 @@ namespace IceInternal
             }
         }
 
-        protected  void releaseCallback__()
+        protected void releaseCallback__()
         {
             lock(monitor__)
             {
@@ -380,6 +380,23 @@ namespace IceInternal
             }
         }
 
+        public void retry__(int interval)
+        {
+            //
+            // This method is called by the proxy to retry an
+            // invocation. No other threads can access this object.
+            //
+            if(interval > 0)
+            {                
+                Debug.Assert(os__ != null);
+                os__.instance().retryQueue().add(this, interval);
+            }
+            else
+            {
+                send__();
+            }
+        }
+
         public bool send__()
         {
             try
@@ -409,7 +426,8 @@ namespace IceInternal
             _delegate = null;
             _cnt = 0;
             _mode = mode;
-            
+            _sentSynchronously = false;
+
             //
             // Can't call async via a batch proxy.
             //
diff --git a/cs/src/Ice/ProxyFactory.cs b/cs/src/Ice/ProxyFactory.cs
index 034a1ca..26603ea 100644
--- a/cs/src/Ice/ProxyFactory.cs
+++ b/cs/src/Ice/ProxyFactory.cs
@@ -13,21 +13,6 @@ namespace IceInternal
 {
     public sealed class ProxyFactory
     {
-        private sealed class RetryTask : TimerTask
-        {
-            internal RetryTask(OutgoingAsync outAsync)
-            {
-                _outAsync = outAsync;
-            }
-            
-            public void runTimerTask()
-            {
-                _outAsync.send__();
-            }
-
-            private OutgoingAsync _outAsync;
-        }
-
         public Ice.ObjectPrx stringToProxy(string str)
         {
             Reference r = instance_.referenceFactory().create(str, null);
@@ -209,26 +194,16 @@ namespace IceInternal
                 logger.trace(traceLevels.retryCat, s);
             }
 
-            if(interval > 0)
+            if(outAsync != null)
             {
-                if(outAsync != null)
-                {
-                    instance_.timer().schedule(new RetryTask(outAsync), interval);
-                }
-                else
-                {
-                    //
-                    // Sleep before retrying.
-                    //
-                    System.Threading.Thread.Sleep(interval);
-                }
+                outAsync.retry__(interval);
             }
-            else
+            else if(interval > 0)
             {
-                if(outAsync != null)
-                {
-                    outAsync.send__();
-                }
+                //
+                // Sleep before retrying.
+                //
+                System.Threading.Thread.Sleep(interval);
             }
         }
 
diff --git a/cs/src/Ice/RetryQueue.cs b/cs/src/Ice/RetryQueue.cs
new file mode 100644
index 0000000..b5e6564
--- /dev/null
+++ b/cs/src/Ice/RetryQueue.cs
@@ -0,0 +1,90 @@
+// **********************************************************************
+//
+// 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.
+//
+// **********************************************************************
+
+namespace IceInternal
+{
+    using System.Collections.Generic;
+
+    public class RetryTask : TimerTask
+    {
+        public RetryTask(RetryQueue retryQueue, OutgoingAsync outAsync)
+        {
+            _retryQueue = retryQueue;
+            _outAsync = outAsync;
+        }
+
+        public void runTimerTask()
+        {
+            if(_retryQueue.remove(this))
+            {
+                try
+                {
+                    _outAsync.send__();
+                }
+                catch(Ice.LocalException ex)
+                {
+                    _outAsync.releaseCallback__(ex);
+                }
+            }
+        }    
+
+        public void destroy()
+        {
+            _outAsync.releaseCallback__(new Ice.CommunicatorDestroyedException());
+        }
+
+        private RetryQueue _retryQueue;
+        private OutgoingAsync _outAsync;
+    };
+
+    public class RetryQueue
+    {
+        public RetryQueue(Instance instance)
+        {
+            _instance = instance;
+        }
+        
+        public void add(OutgoingAsync outAsync, int interval)
+        {
+            lock(this)
+            {
+                RetryTask task = new RetryTask(this, outAsync);
+                _instance.timer().schedule(task, interval);
+                _requests.Add(task, null);
+            }
+        }
+
+        public void
+        destroy()
+        {
+            lock(this)
+            {
+                foreach(RetryTask task in _requests.Keys)
+                {
+                    _instance.timer().cancel(task);
+                    task.destroy();
+                }
+                _requests.Clear();
+            }
+        }
+
+        public bool
+        remove(RetryTask task)
+        {
+            lock(this)
+            {
+                return _requests.Remove(task);
+            }
+        }
+
+        private Instance _instance;
+        private Dictionary<RetryTask, object> _requests = new Dictionary<RetryTask, object>();
+    }
+}
+
diff --git a/java/src/Ice/ObjectPrxHelperBase.java b/java/src/Ice/ObjectPrxHelperBase.java
index 574ded0..261adfd 100644
--- a/java/src/Ice/ObjectPrxHelperBase.java
+++ b/java/src/Ice/ObjectPrxHelperBase.java
@@ -908,7 +908,7 @@ public class ObjectPrxHelperBase implements ObjectPrx
 
             if(out != null)
             {
-                out.__send(cnt);
+                out.__send();
             }
 
             return cnt;
diff --git a/java/src/IceInternal/Instance.java b/java/src/IceInternal/Instance.java
index 1ee242b..2578f5b 100644
--- a/java/src/IceInternal/Instance.java
+++ b/java/src/IceInternal/Instance.java
@@ -201,6 +201,17 @@ public final class Instance
         return _endpointHostResolver;
     }
 
+    synchronized public RetryQueue
+    retryQueue()
+    {
+        if(_state == StateDestroyed)
+        {
+            throw new Ice.CommunicatorDestroyedException();
+        }        
+
+        return _retryQueue;
+    }
+
     synchronized public Timer
     timer()
     {
@@ -713,6 +724,8 @@ public final class Instance
 
             _objectAdapterFactory = new ObjectAdapterFactory(this, communicator);
 
+            _retryQueue = new RetryQueue(this);
+
             //
             // Add Process and Properties facets
             //
@@ -753,6 +766,7 @@ public final class Instance
         IceUtilInternal.Assert.FinalizerAssert(_locatorManager == null);
         IceUtilInternal.Assert.FinalizerAssert(_endpointFactoryManager == null);
         IceUtilInternal.Assert.FinalizerAssert(_pluginManager == null);
+        IceUtilInternal.Assert.FinalizerAssert(_retryQueue == null);
 
         super.finalize();
     }
@@ -868,6 +882,11 @@ public final class Instance
         {
             _outgoingConnectionFactory.waitUntilFinished();
         }
+
+        if(_retryQueue != null)
+        {
+            _retryQueue.destroy();
+        }
         
         ThreadPool serverThreadPool = null;
         ThreadPool clientThreadPool = null;
@@ -877,8 +896,8 @@ public final class Instance
         synchronized(this)
         {
             _objectAdapterFactory = null;
-
             _outgoingConnectionFactory = null;
+            _retryQueue = null;
 
             if(_connectionMonitor != null)
             {
@@ -1054,6 +1073,7 @@ public final class Instance
     private ThreadPool _serverThreadPool;
     private SelectorThread _selectorThread;
     private EndpointHostResolver _endpointHostResolver;
+    private RetryQueue _retryQueue;
     private Timer _timer;
     private EndpointFactoryManager _endpointFactoryManager;
     private Ice.PluginManager _pluginManager;
diff --git a/java/src/IceInternal/OutgoingAsync.java b/java/src/IceInternal/OutgoingAsync.java
index 9359fe4..12820c9 100644
--- a/java/src/IceInternal/OutgoingAsync.java
+++ b/java/src/IceInternal/OutgoingAsync.java
@@ -270,14 +270,22 @@ public abstract class OutgoingAsync extends OutgoingAsyncMessageCallback
     }
 
     public final void
-    __send(int cnt)
+    __retry(int cnt, int interval)
     {
         //
         // This method is called by the proxy to retry an invocation. It's safe to update
         // the count here without synchronization, no other threads can access this object.
         //
         _cnt = cnt;
-        __send();
+        if(interval > 0)
+        {                
+            assert(__os != null);
+            __os.instance().retryQueue().add(this, interval);
+        }
+        else
+        {
+            __send();
+        }
     }
 
     public final boolean
@@ -292,11 +300,11 @@ public abstract class OutgoingAsync extends OutgoingAsyncMessageCallback
         }
         catch(LocalExceptionWrapper ex)
         {
-            handleException(ex);
+            handleException(ex); // Might call __send() again upon retry and assign _sentSynchronously
         }
         catch(Ice.LocalException ex)
         {
-            handleException(ex);
+            handleException(ex); // Might call __send() again upon retry and assign _sentSynchronously
         }
         return _sentSynchronously;
     }
@@ -310,6 +318,7 @@ public abstract class OutgoingAsync extends OutgoingAsyncMessageCallback
         _delegate = null;
         _cnt = 0;
         _mode = mode;
+        _sentSynchronously = false;
 
         //
         // Can't call async via a batch proxy.
diff --git a/java/src/IceInternal/ProxyFactory.java b/java/src/IceInternal/ProxyFactory.java
index ac05fe1..1f24976 100644
--- a/java/src/IceInternal/ProxyFactory.java
+++ b/java/src/IceInternal/ProxyFactory.java
@@ -132,7 +132,7 @@ public final class ProxyFactory
 
                 if(out != null)
                 {
-                    out.__send(cnt);
+                    out.__retry(cnt, 0);
                 }
                 return cnt; // We must always retry, so we don't look at the retry count.
             }
@@ -205,42 +205,23 @@ public final class ProxyFactory
             logger.trace(traceLevels.retryCat, s);
         }
 
-        if(interval > 0)
+        if(out != null)
         {
-            if(out != null)
-            {
-                final int count = cnt;
-                _instance.timer().schedule(new TimerTask()
-                                           {
-                                               public void
-                                               runTimerTask()
-                                               {
-                                                   out.__send(count);
-                                               }
-                                           }, interval);
-            }
-            else
-            {
-                //
-                // Sleep before retrying.
-                //
-                try
-                {
-                    Thread.currentThread().sleep(interval);
-                }
-                catch(InterruptedException ex1)
-                {
-                }
-            }
+            out.__retry(cnt, interval);
         }
-        else
+        else if(interval > 0)
         {
-            if(out != null)
+            //
+            // Sleep before retrying.
+            //
+            try
+            {
+                Thread.currentThread().sleep(interval);
+            }
+            catch(InterruptedException ex1)
             {
-                out.__send(cnt);
             }
         }
-
         return cnt;
     }
 
diff --git a/java/src/IceInternal/RetryQueue.java b/java/src/IceInternal/RetryQueue.java
new file mode 100644
index 0000000..0e0065a
--- /dev/null
+++ b/java/src/IceInternal/RetryQueue.java
@@ -0,0 +1,49 @@
+// **********************************************************************
+//
+// 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.
+//
+// **********************************************************************
+
+package IceInternal;
+
+public class RetryQueue
+{
+    RetryQueue(Instance instance)
+    {
+        _instance = instance;
+    }
+
+    synchronized public void
+    add(OutgoingAsync outAsync, int interval)
+    {
+        RetryTask task = new RetryTask(this, outAsync);
+        _instance.timer().schedule(task, interval);
+        _requests.add(task);
+    }
+
+    synchronized public void
+    destroy()
+    {
+        java.util.Iterator<RetryTask> p = _requests.iterator();
+        while(p.hasNext())
+        {
+            RetryTask task = p.next();
+            _instance.timer().cancel(task);
+            task.destroy();
+        }
+        _requests.clear();
+    }
+
+    synchronized boolean
+    remove(RetryTask task)
+    {
+        return _requests.remove(task);
+    }
+
+    final private Instance _instance;
+    final private java.util.HashSet<RetryTask> _requests = new java.util.HashSet<RetryTask>();
+};
+
diff --git a/java/src/IceInternal/RetryTask.java b/java/src/IceInternal/RetryTask.java
new file mode 100644
index 0000000..5c17c8a
--- /dev/null
+++ b/java/src/IceInternal/RetryTask.java
@@ -0,0 +1,44 @@
+// **********************************************************************
+//
+// 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.
+//
+// **********************************************************************
+
+package IceInternal;
+
+class RetryTask implements TimerTask
+{
+    RetryTask(RetryQueue queue, OutgoingAsync outAsync)
+    {
+        _queue = queue;
+        _outAsync = outAsync;
+    }
+
+    public void
+    runTimerTask()
+    {
+        if(_queue.remove(this))
+        {
+            try
+            {
+                _outAsync.__send();
+            }
+            catch(Ice.LocalException ex)
+            {
+                _outAsync.__releaseCallback(ex);
+            }
+        }
+    }
+
+    public void
+    destroy()
+    {
+        _outAsync.__releaseCallback(new Ice.CommunicatorDestroyedException());
+    }
+
+    private final RetryQueue _queue;
+    private final OutgoingAsync _outAsync;
+}

Ice-3.3.0-use-db4.7.patch:

--- NEW FILE Ice-3.3.0-use-db4.7.patch ---
--- Ice-3.3.0/cpp/src/Freeze/SharedDbEnv.cpp.orig	2008-08-08 14:57:10.000000000 +0200
+++ Ice-3.3.0/cpp/src/Freeze/SharedDbEnv.cpp	2008-08-08 14:57:32.000000000 +0200
@@ -506,7 +506,7 @@
                 
             if(autoDelete)
             {
-                _env->set_flags(DB_LOG_AUTOREMOVE, 1);
+                _env->log_set_config(DB_LOG_AUTO_REMOVE, 1);
             }
             
             //


Index: ice.spec
===================================================================
RCS file: /cvs/pkgs/rpms/ice/F-8/ice.spec,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- ice.spec	30 Jul 2008 15:45:23 -0000	1.12
+++ ice.spec	4 Dec 2008 10:22:52 -0000	1.13
@@ -4,7 +4,7 @@
 
 Name: ice
 Version: 3.3.0
-Release: 4%{?dist}
+Release: 8%{?dist}
 Summary: The Ice base runtime and services
 
 Group: System Environment/Libraries
@@ -17,12 +17,32 @@
 Source8:        icegridgui
 Source9:        IceGridAdmin.desktop
 Source10:       Ice-%{version}-README.Fedora
+# Don't build the demo or test directories
 Patch0:         Ice-3.3-dont-build-demo-test.patch
+# Don't put manifest in jar; don't build demo or test; use system jgoodies
 Patch1:         Ice-3.3.0-java-build.patch
+# Don't include the Windows L&F
 Patch2:         Ice-3.3.0-jgoodies.patch
+# Move the TimerTask to its own source file
 Patch3:         Ice-3.3.0-java-Timer.patch
 # From http://www.zeroc.com/forums/patches/3798-patch-1-ice-3-3-0-fix-slice2cpp-slice2freeze.html
 Patch4:         Ice-3.3.0-fix-slice2cpp-slice2freeze.patch
+# Use the new DB4 methods
+Patch5:         Ice-3.3.0-use-db4.7.patch
+# Also allow Python 2.6
+Patch6:         Ice-3.3.0-python-26.patch
+# From http://www.zeroc.com/forums/patches/3895-patch-3-ice-3-3-0-c-compression-setting-not-always-honored.html
+Patch7:         Ice-3.3.0-compression.patch
+# From http://www.zeroc.com/forums/patches/3911-patch-4-ice-3-3-0-slice-translators-directory-write-access.html
+Patch8:         Ice-3.3.0-preprocess.patch
+# From http://www.zeroc.com/forums/patches/3982-patch-6-ice-3-3-0-icegrid-fixes-potential-registry-crash.html
+Patch9:         Ice-3.3.0-registry-crash.patch
+# From http://www.zeroc.com/forums/patches/4024-patch-7-ice-3-3-0-retry-bug-if-ice-retryintervals-set.html
+Patch10:        Ice-3.3.0-retry-intervals.patch
+# From http://www.zeroc.com/forums/patches/4029-patch-8-ice-3-3-0-icepatch2-non-ascii-file-names.html
+Patch11:        Ice-3.3.0-icepatch-non-ascii.patch
+# From http://www.zeroc.com/forums/patches/4076-patch-9-ice-3-3-0-icegrid-fixes-assert-when-application-synced-concurrently.html
+Patch12:        Ice-3.3.0-icegrid-assert.patch
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
 # Ice doesn't officially support this architecture at all
@@ -163,6 +183,16 @@
 %patch2 -p1
 %patch3 -p1
 %patch4 -p1
+%if 0%{?fedora} >= 10
+%patch5 -p1
+%endif
+%patch6 -p1
+%patch7 -p1
+%patch8 -p1
+%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
 %setup -q -n Ice-rpmbuild-%{version} -T -b 1
 %setup -q -n Ice-%{version}-man-pages -T -b 2
 
@@ -189,6 +219,7 @@
 
 %install
 rm -rf $RPM_BUILD_ROOT
+mkdir -p $RPM_BUILD_ROOT
 
 # Do the basic "make install"
 cd $RPM_BUILD_DIR/Ice-%{version}
@@ -523,6 +554,19 @@
 %config(noreplace) %{_sysconfdir}/php.d/ice.ini
 
 %changelog
+* Thu Dec  4 2008 <mefoster at gmail.com> - 3.3.0-8
+- Add all accumulated upstream patches
+
+* Thu Dec  4 2008 <mefoster at gmail.com> - 3.3.0-7
+- (Tiny) patch to support Python 2.6
+
+* Sat Nov 29 2008 Ignacio Vazquez-Abrams <ivazqueznet+rpm at gmail.com> - 3.3.0-6
+- Rebuild for Python 2.6
+
+* Tue Aug 12 2008 Mary Ellen Foster <mefoster at gmail.com> 3.3.0-5
+- Explicitly create build root so it builds on F10
+- Patch to build against DB4.7
+
 * Wed Jul 30 2008 Mary Ellen Foster <mefoster at gmail.com> 3.3.0-4
 - Re-add .pth file -- the alternative method involves editing auto-generated
   files that say "don't edit" and I don't want to break other parts of Ice




More information about the fedora-extras-commits mailing list