summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe George <joe@zeroc.com>2015-03-11 11:45:37 -0400
committerJoe George <joe@zeroc.com>2015-05-12 11:42:05 -0400
commit78edbc33915c53a633d2505afbb64fbadf5afa69 (patch)
tree6b053348a33a0a207c8c7e41fd8eeb10f55fb985
parentIce 3.4.2 Patch 2 (diff)
downloadice-78edbc33915c53a633d2505afbb64fbadf5afa69.tar.bz2
ice-78edbc33915c53a633d2505afbb64fbadf5afa69.tar.xz
ice-78edbc33915c53a633d2505afbb64fbadf5afa69.zip
Ice 3.4.2 Patch 3
Fix Glacier2 leaking memory during each session.
-rw-r--r--cpp/src/Glacier2/Blobject.cpp9
-rw-r--r--cpp/src/Glacier2/Blobject.h2
-rw-r--r--cpp/src/Glacier2/RequestQueue.cpp44
-rw-r--r--cpp/src/Glacier2/RequestQueue.h5
-rw-r--r--cpp/src/Glacier2/RouterI.cpp6
5 files changed, 65 insertions, 1 deletions
diff --git a/cpp/src/Glacier2/Blobject.cpp b/cpp/src/Glacier2/Blobject.cpp
index 2776e6b9ec9..7366590304b 100644
--- a/cpp/src/Glacier2/Blobject.cpp
+++ b/cpp/src/Glacier2/Blobject.cpp
@@ -171,6 +171,15 @@ Glacier2::Blobject::~Blobject()
}
void
+Glacier2::Blobject::destroy()
+{
+ if(_requestQueue)
+ {
+ _requestQueue->destroy();
+ }
+}
+
+void
Glacier2::Blobject::invoke(ObjectPrx& proxy, const AMD_Object_ice_invokePtr& amdCB,
const std::pair<const Ice::Byte*, const Ice::Byte*>& inParams, const Current& current)
{
diff --git a/cpp/src/Glacier2/Blobject.h b/cpp/src/Glacier2/Blobject.h
index f3ea67ddece..1a97cd080c4 100644
--- a/cpp/src/Glacier2/Blobject.h
+++ b/cpp/src/Glacier2/Blobject.h
@@ -24,6 +24,8 @@ public:
Blobject(const InstancePtr&, const Ice::ConnectionPtr&, const Ice::Context&);
virtual ~Blobject();
+ void destroy();
+
protected:
void invoke(Ice::ObjectPrx&, const Ice::AMD_Object_ice_invokePtr&,
diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp
index 3cd660df007..55fd019d131 100644
--- a/cpp/src/Glacier2/RequestQueue.cpp
+++ b/cpp/src/Glacier2/RequestQueue.cpp
@@ -185,7 +185,8 @@ Glacier2::RequestQueue::RequestQueue(const RequestQueueThreadPtr& requestQueueTh
_callback(newCallback_Object_ice_invoke(this, &RequestQueue::response, &RequestQueue::exception,
&RequestQueue::sent)),
_flushCallback(newCallback_Connection_flushBatchRequests(this, &RequestQueue::exception, &RequestQueue::sent)),
- _pendingSend(false)
+ _pendingSend(false),
+ _destroyed(false)
{
}
@@ -241,6 +242,37 @@ Glacier2::RequestQueue::flushRequests(set<Ice::ObjectPrx>& batchProxies)
}
void
+Glacier2::RequestQueue::destroy()
+{
+ IceUtil::Mutex::Lock lock(*this);
+
+ _destroyed = true;
+
+ //
+ // Although the session has been destroyed, we cannot destroy this queue
+ // until all requests have completed.
+ //
+ if(_requests.empty())
+ {
+ destroyInternal();
+ }
+}
+
+void
+Glacier2::RequestQueue::destroyInternal()
+{
+ //
+ // Must be called with the mutex locked.
+ //
+
+ //
+ // Remove cyclic references.
+ //
+ const_cast<Ice::Callback_Object_ice_invokePtr&>(_callback) = 0;
+ const_cast<Ice::Callback_Connection_flushBatchRequestsPtr&>(_flushCallback) = 0;
+}
+
+void
Glacier2::RequestQueue::flush()
{
assert(_connection);
@@ -289,6 +321,11 @@ Glacier2::RequestQueue::flush()
_pendingSendRequest = 0;
}
}
+
+ if(_destroyed && _requests.empty())
+ {
+ destroyInternal();
+ }
}
void
@@ -312,6 +349,11 @@ Glacier2::RequestQueue::flush(set<Ice::ObjectPrx>& batchProxies)
}
}
_requests.clear();
+
+ if(_destroyed)
+ {
+ destroyInternal();
+ }
}
void
diff --git a/cpp/src/Glacier2/RequestQueue.h b/cpp/src/Glacier2/RequestQueue.h
index 8466d3f9b6d..1862177ac1f 100644
--- a/cpp/src/Glacier2/RequestQueue.h
+++ b/cpp/src/Glacier2/RequestQueue.h
@@ -65,8 +65,12 @@ public:
bool addRequest(const RequestPtr&);
void flushRequests(std::set<Ice::ObjectPrx>&);
+ void destroy();
+
private:
+ void destroyInternal();
+
void flush();
void flush(std::set<Ice::ObjectPrx>&);
@@ -83,6 +87,7 @@ private:
std::deque<RequestPtr> _requests;
bool _pendingSend;
RequestPtr _pendingSendRequest;
+ bool _destroyed;
};
typedef IceUtil::Handle<RequestQueue> RequestQueuePtr;
diff --git a/cpp/src/Glacier2/RouterI.cpp b/cpp/src/Glacier2/RouterI.cpp
index 7d40434eb8d..b2c1faabe41 100644
--- a/cpp/src/Glacier2/RouterI.cpp
+++ b/cpp/src/Glacier2/RouterI.cpp
@@ -98,6 +98,12 @@ Glacier2::RouterI::destroy(const AMI_Session_destroyPtr& amiCB)
_session->destroy_async(amiCB);
}
}
+
+ _clientBlobject->destroy();
+ if(_serverBlobject)
+ {
+ _serverBlobject->destroy();
+ }
}
ObjectPrx