summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rwxr-xr-xcpp/allTests.py1
-rw-r--r--cpp/include/Ice/Proxy.h3
-rwxr-xr-xcpp/src/Glacier2/RequestQueue.cpp355
-rw-r--r--cpp/src/Glacier2/RequestQueue.h25
-rw-r--r--cpp/src/Ice/ConnectionI.cpp13
-rw-r--r--cpp/src/Ice/ProxyFactory.cpp4
-rw-r--r--cpp/src/Ice/RouterInfo.cpp7
-rw-r--r--cpp/src/Ice/RouterInfo.h2
-rw-r--r--cpp/test/Glacier2/Makefile1
-rw-r--r--cpp/test/Glacier2/Makefile.mak1
-rw-r--r--cpp/test/Glacier2/override/.depend5
-rw-r--r--cpp/test/Glacier2/override/.depend.mak5
-rw-r--r--cpp/test/Glacier2/override/Callback.ice36
-rw-r--r--cpp/test/Glacier2/override/CallbackI.cpp222
-rw-r--r--cpp/test/Glacier2/override/CallbackI.h59
-rw-r--r--cpp/test/Glacier2/override/Client.cpp210
-rw-r--r--cpp/test/Glacier2/override/Makefile42
-rw-r--r--cpp/test/Glacier2/override/Makefile.mak50
-rw-r--r--cpp/test/Glacier2/override/Server.cpp47
-rwxr-xr-xcpp/test/Glacier2/override/run.py62
20 files changed, 978 insertions, 172 deletions
diff --git a/cpp/allTests.py b/cpp/allTests.py
index bebf8f83eb1..0a41d827b33 100755
--- a/cpp/allTests.py
+++ b/cpp/allTests.py
@@ -94,6 +94,7 @@ tests = [
("IceGrid/admin", ["service", "novc6"]),
("Glacier2/router", ["service", "novc6"]),
("Glacier2/attack", ["service", "novc6"]),
+ ("Glacier2/override", ["service", "novc6"]),
("Glacier2/sessionControl", ["service", "novc6"]),
("Glacier2/ssl", ["service", "novalgrind", "novc6"]), # valgrind doesn't work well with openssl
("Glacier2/dynamicFiltering", ["service", "novc6"]),
diff --git a/cpp/include/Ice/Proxy.h b/cpp/include/Ice/Proxy.h
index 13c2e9bdbbb..7904ec95176 100644
--- a/cpp/include/Ice/Proxy.h
+++ b/cpp/include/Ice/Proxy.h
@@ -2142,8 +2142,7 @@ newCallback_Object_ice_invoke(T* instance,
template<class T, typename CT> Callback_Object_ice_invokePtr
newCallback_Object_ice_invoke(T* instance,
- void (T::*cb)(bool, const std::pair<const Byte*, const Byte*>&,
- const CT&),
+ void (T::*cb)(bool, const std::pair<const Byte*, const Byte*>&, const CT&),
void (T::*excb)(const ::Ice::Exception&, const CT&),
void (T::*sentcb)(bool, const CT&) = 0)
{
diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp
index a901b6208a1..85cb55c5c63 100755
--- a/cpp/src/Glacier2/RequestQueue.cpp
+++ b/cpp/src/Glacier2/RequestQueue.cpp
@@ -16,102 +16,6 @@ using namespace std;
using namespace Ice;
using namespace Glacier2;
-namespace
-{
-
-//
-// AMI base callback class for twoway/oneway requests
-//
-class IceInvokeI : public AMI_Array_Object_ice_invoke
-{
-public:
-
- IceInvokeI(const AMD_Object_ice_invokePtr& amdCB, const InstancePtr& instance, const ConnectionPtr& connection) :
- _amdCB(amdCB),
- _instance(instance),
- _connection(connection)
- {
- }
-
- virtual void
- ice_exception(const Exception& ex)
- {
- //
- // If the connection has been lost, destroy the session.
- //
- if(_connection)
- {
- if(dynamic_cast<const Ice::SocketException*>(&ex) ||
- dynamic_cast<const Ice::TimeoutException*>(&ex) ||
- dynamic_cast<const Ice::ProtocolException*>(&ex))
- {
- try
- {
- _instance->sessionRouter()->destroySession(_connection);
- }
- catch(const Exception&)
- {
- }
- }
- }
-
- if(_amdCB)
- {
- _amdCB->ice_exception(ex);
- }
- }
-
-protected:
-
- const AMD_Object_ice_invokePtr _amdCB;
- const InstancePtr _instance;
- const ConnectionPtr _connection;
-};
-
-class TwowayIceInvokeI : public IceInvokeI
-{
-public:
-
- TwowayIceInvokeI(const AMD_Object_ice_invokePtr& amdCB, const InstancePtr& instance, const ConnectionPtr& con) :
- IceInvokeI(amdCB, instance, con)
- {
- }
-
- virtual void
- ice_response(bool ok, const pair<const Byte*, const Byte*>& outParams)
- {
- _amdCB->ice_response(ok, outParams);
- }
-};
-
-class OnewayIceInvokeI : public IceInvokeI, public Ice::AMISentCallback
-{
-public:
-
- OnewayIceInvokeI(const AMD_Object_ice_invokePtr& amdCB, const InstancePtr& instance, const ConnectionPtr& con) :
- IceInvokeI(amdCB, instance, con)
- {
- }
-
- virtual void
- ice_response(bool ok, const pair<const Byte*, const Byte*>& outParams)
- {
- assert(false);
- }
-
- virtual void
- ice_sent()
- {
-#if (defined(_MSC_VER) && (_MSC_VER >= 1600))
- _amdCB->ice_response(true, pair<const Byte*, const Byte*>(nullptr, nullptr));
-#else
- _amdCB->ice_response(true, pair<const Byte*, const Byte*>(0, 0));
-#endif
- }
-};
-
-}
-
Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*, const Byte*>& inParams,
const Current& current, bool forwardContext, const Ice::Context& sslContext,
const AMD_Object_ice_invokePtr& amdCB) :
@@ -122,18 +26,6 @@ Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*,
_sslContext(sslContext),
_amdCB(amdCB)
{
- //
- // If this is a batch call, we can finish the AMD call right away.
- //
- if(_proxy->ice_isBatchOneway() || _proxy->ice_isBatchDatagram())
- {
-#if (defined(_MSC_VER) && (_MSC_VER >= 1600))
- _amdCB->ice_response(true, pair<const Byte*, const Byte*>(nullptr, nullptr));
-#else
- _amdCB->ice_response(true, pair<const Byte*, const Byte*>(0, 0));
-#endif
- }
-
Context::const_iterator p = current.ctx.find("_ovrd");
if(p != current.ctx.end())
{
@@ -142,8 +34,8 @@ Glacier2::Request::Request(const ObjectPrx& proxy, const std::pair<const Byte*,
}
-bool
-Glacier2::Request::invoke(const InstancePtr& instance, const Ice::ConnectionPtr& connection)
+Ice::AsyncResultPtr
+Glacier2::Request::invoke(const Callback_Object_ice_invokePtr& cb)
{
pair<const Byte*, const Byte*> inPair;
if(_inParams.size() == 0)
@@ -176,61 +68,44 @@ Glacier2::Request::invoke(const InstancePtr& instance, const Ice::ConnectionPtr&
{
if(_sslContext.size() > 0)
{
- _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams, _sslContext);
+ _proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams, _sslContext);
}
else
{
_proxy->ice_invoke(_current.operation, _current.mode, inPair, outParams);
}
}
- return true; // Batch invocation.
+ return 0;
}
else
{
- AMI_Array_Object_ice_invokePtr amiCB;
- if(_proxy->ice_isTwoway())
- {
- amiCB = new TwowayIceInvokeI(_amdCB, instance, connection);
- }
- else
- {
- amiCB = new OnewayIceInvokeI(_amdCB, instance, connection);
- }
-
- bool sent;
+ Ice::AsyncResultPtr result;
if(_forwardContext)
{
if(_sslContext.size() > 0)
{
Ice::Context ctx = _current.ctx;
ctx.insert(_sslContext.begin(), _sslContext.end());
- sent = _proxy->ice_invoke_async(amiCB, _current.operation, _current.mode, inPair, ctx);
+ result = _proxy->begin_ice_invoke(_current.operation, _current.mode, inPair, ctx, cb, this);
}
else
{
- sent = _proxy->ice_invoke_async(amiCB, _current.operation, _current.mode, inPair, _current.ctx);
+ result = _proxy->begin_ice_invoke(_current.operation, _current.mode, inPair, _current.ctx, cb, this);
}
}
else
{
if(_sslContext.size() > 0)
{
- sent = _proxy->ice_invoke_async(amiCB, _current.operation, _current.mode, inPair, _sslContext);
+ result = _proxy->begin_ice_invoke(_current.operation, _current.mode, inPair, _sslContext, cb, this);
}
else
{
- sent = _proxy->ice_invoke_async(amiCB, _current.operation, _current.mode, inPair);
+ result = _proxy->begin_ice_invoke(_current.operation, _current.mode, inPair, cb, this);
}
}
- if(sent && !_proxy->ice_isTwoway())
- {
-#if (defined(_MSC_VER) && (_MSC_VER >= 1600))
- _amdCB->ice_response(true, pair<const Byte*, const Byte*>(nullptr, nullptr));
-#else
- _amdCB->ice_response(true, pair<const Byte*, const Byte*>(0, 0));
-#endif
- }
- return false; // Not a batch invocation.
+
+ return result;
}
}
@@ -255,14 +130,50 @@ Glacier2::Request::override(const RequestPtr& other) const
}
//
+ // Don't override if the override isn't the same.
+ //
+ if(_override != other->_override)
+ {
+ return false;
+ }
+
+ //
// We cannot override if the proxies differ.
//
- if(_proxy != other->_proxy)
+ return _proxy == other->_proxy;
+}
+
+void
+Glacier2::Request::response(bool ok, const pair<const Ice::Byte*, const Ice::Byte*>& outParams)
+{
+ assert(_proxy->ice_isTwoway());
+ _amdCB->ice_response(ok, outParams);
+}
+
+void
+Glacier2::Request::exception(const Ice::Exception& ex)
+{
+ //
+ // Only for twoways, oneway or batch oneway dispatches are finished
+ // when queued, see queued().
+ //
+ if(_proxy->ice_isTwoway())
{
- return false;
+ _amdCB->ice_exception(ex);
}
+}
- return _override == other->_override;
+void
+Glacier2::Request::queued()
+{
+ if(!_proxy->ice_isTwoway())
+ {
+#if (defined(_MSC_VER) && (_MSC_VER >= 1600))
+ _amdCB->ice_response(true, pair<const Byte*, const Byte*>(nullptr, nullptr));
+#else
+ _amdCB->ice_response(true, pair<const Byte*, const Byte*>(0, 0));
+#endif
+ }
}
Glacier2::RequestQueue::RequestQueue(const RequestQueueThreadPtr& requestQueueThread,
@@ -270,7 +181,11 @@ Glacier2::RequestQueue::RequestQueue(const RequestQueueThreadPtr& requestQueueTh
const Ice::ConnectionPtr& connection) :
_requestQueueThread(requestQueueThread),
_instance(instance),
- _connection(connection)
+ _connection(connection),
+ _callback(newCallback_Object_ice_invoke(this, &RequestQueue::response, &RequestQueue::exception,
+ &RequestQueue::sent)),
+ _flushCallback(newCallback_Connection_flushBatchRequests(this, &RequestQueue::exception, &RequestQueue::sent)),
+ _pendingSend(false)
{
}
@@ -280,7 +195,7 @@ Glacier2::RequestQueue::addRequest(const RequestPtr& request)
IceUtil::Mutex::Lock lock(*this);
if(request->hasOverride())
{
- for(vector<RequestPtr>::iterator p = _requests.begin(); p != _requests.end(); ++p)
+ for(deque<RequestPtr>::iterator p = _requests.begin(); p != _requests.end(); ++p)
{
//
// If the new request overrides an old one, then abort the old
@@ -288,6 +203,7 @@ Glacier2::RequestQueue::addRequest(const RequestPtr& request)
//
if(request->override(*p))
{
+ request->queued();
*p = request;
return true;
}
@@ -297,11 +213,12 @@ Glacier2::RequestQueue::addRequest(const RequestPtr& request)
//
// No override, we add the new request.
//
- if(_requests.empty())
+ if(_requests.empty() && (!_connection || !_pendingSend))
{
_requestQueueThread->flushRequestQueue(this); // This might throw if the thread is destroyed.
}
_requests.push_back(request);
+ request->queued();
return false;
}
@@ -309,13 +226,43 @@ void
Glacier2::RequestQueue::flushRequests(set<Ice::ObjectPrx>& batchProxies)
{
IceUtil::Mutex::Lock lock(*this);
- for(vector<RequestPtr>::const_iterator p = _requests.begin(); p != _requests.end(); ++p)
+ if(_connection)
+ {
+ if(_pendingSend)
+ {
+ return;
+ }
+ flush();
+ }
+ else
+ {
+ flush(batchProxies);
+ }
+}
+
+void
+Glacier2::RequestQueue::flush()
+{
+ assert(_connection);
+ _pendingSend = false;
+ _pendingSendRequest = 0;
+
+ bool flushBatchRequests = false;
+ deque<RequestPtr>::iterator p;
+ for(p = _requests.begin(); p != _requests.end(); ++p)
{
try
{
- if((*p)->invoke(_instance, _connection)) // If batch invocation, add the proxy to the batch proxy set.
+ Ice::AsyncResultPtr result = (*p)->invoke(_callback);
+ if(!result)
{
- batchProxies.insert((*p)->getProxy());
+ flushBatchRequests = true;
+ }
+ else if(!result->sentSynchronously() && !result->isCompleted())
+ {
+ _pendingSend = true;
+ _pendingSendRequest = *p++;
+ break;
}
}
catch(const Ice::LocalException&)
@@ -323,9 +270,104 @@ Glacier2::RequestQueue::flushRequests(set<Ice::ObjectPrx>& batchProxies)
// Ignore, this can occur for batch requests.
}
}
+
+ if(p == _requests.end())
+ {
+ _requests.clear();
+ }
+ else
+ {
+ _requests.erase(_requests.begin(), p);
+ }
+
+ if(flushBatchRequests)
+ {
+ Ice::AsyncResultPtr result = _connection->begin_flushBatchRequests(_flushCallback);
+ if(!result->sentSynchronously() && !result->isCompleted())
+ {
+ _pendingSend = true;
+ _pendingSendRequest = 0;
+ }
+ }
+}
+
+void
+Glacier2::RequestQueue::flush(set<Ice::ObjectPrx>& batchProxies)
+{
+ assert(!_connection);
+
+ for(deque<RequestPtr>::const_iterator p = _requests.begin(); p != _requests.end(); ++p)
+ {
+ try
+ {
+ Ice::AsyncResultPtr result = (*p)->invoke(_callback);
+ if(!result)
+ {
+ batchProxies.insert((*p)->getProxy());
+ }
+ }
+ catch(const Ice::LocalException&)
+ {
+ // Ignore, this can occur for batch requests.
+ }
+ }
_requests.clear();
}
+void
+Glacier2::RequestQueue::response(bool ok, const pair<const Byte*, const Byte*>& outParams, const RequestPtr& request)
+{
+ assert(request);
+ request->response(ok, outParams);
+}
+
+void
+Glacier2::RequestQueue::exception(const Ice::Exception& ex, const RequestPtr& request)
+{
+ //
+ // If the connection has been lost, destroy the session.
+ //
+ if(_connection)
+ {
+ if(dynamic_cast<const Ice::SocketException*>(&ex) ||
+ dynamic_cast<const Ice::TimeoutException*>(&ex) ||
+ dynamic_cast<const Ice::ProtocolException*>(&ex))
+ {
+ try
+ {
+ _instance->sessionRouter()->destroySession(_connection);
+ }
+ catch(const Exception&)
+ {
+ }
+ }
+
+ IceUtil::Mutex::Lock lock(*this);
+ if(request == _pendingSendRequest)
+ {
+ flush();
+ }
+ }
+
+ if(request)
+ {
+ request->exception(ex);
+ }
+}
+
+void
+Glacier2::RequestQueue::sent(bool sentSynchronously, const RequestPtr& request)
+{
+ if(_connection && !sentSynchronously)
+ {
+ IceUtil::Mutex::Lock lock(*this);
+ if(request == _pendingSendRequest)
+ {
+ flush();
+ }
+ }
+}
+
Glacier2::RequestQueueThread::RequestQueueThread(const IceUtil::Time& sleepTime) :
IceUtil::Thread("Glacier2 request queue thread"),
_sleepTime(sleepTime),
@@ -445,29 +487,10 @@ Glacier2::RequestQueueThread::run()
(*p)->flushRequests(flushProxySet);
}
- set<Ice::ConnectionPtr> flushConnectionSet;
for(set<Ice::ObjectPrx>::const_iterator q = flushProxySet.begin(); q != flushProxySet.end(); ++q)
{
- //
- // As an optimization, we only flush the proxy batch requests if we didn't
- // already flush the requests of a proxy which is using the same connection.
- //
- Ice::ConnectionPtr connection = (*q)->ice_getCachedConnection();
- if(!connection || flushConnectionSet.find(connection) == flushConnectionSet.end())
- {
- class FlushCB : public AMI_Object_ice_flushBatchRequests
- {
- public:
-
- virtual void ice_exception(const Ice::Exception&) { } // Ignore.
- };
- (*q)->ice_flushBatchRequests_async(new FlushCB());
-
- if(connection)
- {
- flushConnectionSet.insert(connection);
- }
- }
+ (*q)->begin_ice_flushBatchRequests();
}
}
}
+
diff --git a/cpp/src/Glacier2/RequestQueue.h b/cpp/src/Glacier2/RequestQueue.h
index d117c0c0b96..ad13383320d 100644
--- a/cpp/src/Glacier2/RequestQueue.h
+++ b/cpp/src/Glacier2/RequestQueue.h
@@ -14,6 +14,8 @@
#include <IceUtil/Monitor.h>
#include <Ice/Ice.h>
+#include <deque>
+
namespace Glacier2
{
@@ -26,20 +28,25 @@ typedef IceUtil::Handle<Request> RequestPtr;
class RequestQueueThread;
typedef IceUtil::Handle<RequestQueueThread> RequestQueueThreadPtr;
-class Request : public IceUtil::Shared
+class Request : public Ice::LocalObject
{
public:
Request(const Ice::ObjectPrx&, const std::pair<const Ice::Byte*, const Ice::Byte*>&, const Ice::Current&, bool,
const Ice::Context&, const Ice::AMD_Object_ice_invokePtr&);
- bool invoke(const InstancePtr&, const Ice::ConnectionPtr&);
+ Ice::AsyncResultPtr invoke(const Ice::Callback_Object_ice_invokePtr& callback);
bool override(const RequestPtr&) const;
const Ice::ObjectPrx& getProxy() const { return _proxy; }
bool hasOverride() const { return !_override.empty(); }
private:
+ friend class RequestQueue;
+ void response(bool, const std::pair<const Ice::Byte*, const Ice::Byte*>&);
+ void exception(const Ice::Exception&);
+ void queued();
+
const Ice::ObjectPrx _proxy;
const Ice::ByteSeq _inParams;
const Ice::Current _current;
@@ -59,11 +66,23 @@ public:
void flushRequests(std::set<Ice::ObjectPrx>&);
private:
+
+ void flush();
+ void flush(std::set<Ice::ObjectPrx>&);
+
+ void response(bool, const std::pair<const Ice::Byte*, const Ice::Byte*>&, const RequestPtr&);
+ void exception(const Ice::Exception&, const RequestPtr&);
+ void sent(bool, const RequestPtr&);
const RequestQueueThreadPtr _requestQueueThread;
const InstancePtr _instance;
const Ice::ConnectionPtr _connection;
- std::vector<RequestPtr> _requests;
+ const Ice::Callback_Object_ice_invokePtr _callback;
+ const Ice::Callback_Connection_flushBatchRequestsPtr _flushCallback;
+
+ std::deque<RequestPtr> _requests;
+ bool _pendingSend;
+ RequestPtr _pendingSendRequest;
};
typedef IceUtil::Handle<RequestQueue> RequestQueuePtr;
diff --git a/cpp/src/Ice/ConnectionI.cpp b/cpp/src/Ice/ConnectionI.cpp
index e90848d7b1e..722c6a6c81b 100644
--- a/cpp/src/Ice/ConnectionI.cpp
+++ b/cpp/src/Ice/ConnectionI.cpp
@@ -1487,7 +1487,18 @@ ConnectionI::dispatch(const StartCallbackPtr& startCB, const vector<OutgoingAsyn
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
if(--_dispatchCount == 0)
{
- if(_state == StateFinished)
+ if(_state == StateClosing)
+ {
+ try
+ {
+ initiateShutdown();
+ }
+ catch(const LocalException& ex)
+ {
+ setState(StateClosed, ex);
+ }
+ }
+ else if(_state == StateFinished)
{
_reaper->add(this);
}
diff --git a/cpp/src/Ice/ProxyFactory.cpp b/cpp/src/Ice/ProxyFactory.cpp
index 0e5cbbef8f7..431994dc34a 100644
--- a/cpp/src/Ice/ProxyFactory.cpp
+++ b/cpp/src/Ice/ProxyFactory.cpp
@@ -14,6 +14,7 @@
#include <Ice/Proxy.h>
#include <Ice/ReferenceFactory.h>
#include <Ice/LocatorInfo.h>
+#include <Ice/RouterInfo.h>
#include <Ice/BasicStream.h>
#include <Ice/Properties.h>
#include <Ice/LoggerUtil.h>
@@ -141,6 +142,9 @@ IceInternal::ProxyFactory::checkRetryAfterException(const LocalException& ex,
// must *always* retry, so that the missing proxy is added
// to the router.
//
+
+ ref->getRouterInfo()->clearCache(ref);
+
if(traceLevels->retry >= 1)
{
Trace out(logger, traceLevels->retryCat);
diff --git a/cpp/src/Ice/RouterInfo.cpp b/cpp/src/Ice/RouterInfo.cpp
index 911e553363c..f648cf7c8c3 100644
--- a/cpp/src/Ice/RouterInfo.cpp
+++ b/cpp/src/Ice/RouterInfo.cpp
@@ -338,6 +338,13 @@ IceInternal::RouterInfo::getAdapter() const
return _adapter;
}
+void
+IceInternal::RouterInfo::clearCache(const ReferencePtr& ref)
+{
+ IceUtil::Mutex::Lock sync(*this);
+ _identities.erase(ref->getIdentity());
+}
+
vector<EndpointIPtr>
IceInternal::RouterInfo::setClientEndpoints(const Ice::ObjectPrx& proxy)
{
diff --git a/cpp/src/Ice/RouterInfo.h b/cpp/src/Ice/RouterInfo.h
index e91f4d4bf98..679ee536691 100644
--- a/cpp/src/Ice/RouterInfo.h
+++ b/cpp/src/Ice/RouterInfo.h
@@ -84,6 +84,8 @@ public:
void setAdapter(const Ice::ObjectAdapterPtr&);
Ice::ObjectAdapterPtr getAdapter() const;
+ void clearCache(const ReferencePtr&);
+
//
// The following methods need to be public for access by AMI callbacks.
//
diff --git a/cpp/test/Glacier2/Makefile b/cpp/test/Glacier2/Makefile
index f1d077751c0..e41a3726978 100644
--- a/cpp/test/Glacier2/Makefile
+++ b/cpp/test/Glacier2/Makefile
@@ -13,6 +13,7 @@ include $(top_srcdir)/config/Make.rules
SUBDIRS = router \
attack \
+ override \
staticFiltering \
dynamicFiltering \
sessionControl \
diff --git a/cpp/test/Glacier2/Makefile.mak b/cpp/test/Glacier2/Makefile.mak
index 242a4a9c14e..9af3be4ec06 100644
--- a/cpp/test/Glacier2/Makefile.mak
+++ b/cpp/test/Glacier2/Makefile.mak
@@ -13,6 +13,7 @@ top_srcdir = ..\..
SUBDIRS = router \
attack \
+ override \
staticFiltering \
dynamicFiltering \
sessionControl \
diff --git a/cpp/test/Glacier2/override/.depend b/cpp/test/Glacier2/override/.depend
new file mode 100644
index 00000000000..5a0961312c5
--- /dev/null
+++ b/cpp/test/Glacier2/override/.depend
@@ -0,0 +1,5 @@
+Callback$(OBJEXT): Callback.cpp Callback.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/MutexProtocol.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/EndpointF.h $(includedir)/IceUtil/ScopedArray.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/EndpointTypes.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Direct.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/Stream.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/ObjectFactory.h $(includedir)/IceUtil/Iterator.h
+CallbackI$(OBJEXT): CallbackI.cpp $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/IceUtil/ScopedArray.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/MutexProtocol.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/EndpointF.h $(includedir)/Ice/EndpointTypes.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/Dispatcher.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/Plugin.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/Stream.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/CommunicatorAsync.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Application.h $(includedir)/Ice/Connection.h $(includedir)/Ice/ConnectionAsync.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/FactoryTableInit.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h CallbackI.h Callback.h ../../include/TestCommon.h
+Client$(OBJEXT): Client.cpp $(includedir)/IceUtil/Random.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/IceUtil.h $(includedir)/IceUtil/AbstractMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Cache.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/MutexProtocol.h $(includedir)/IceUtil/CountDownLatch.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/MutexPtrLock.h $(includedir)/IceUtil/RWRecMutex.h $(includedir)/IceUtil/Thread.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/Application.h $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/Ice/Handle.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/IceUtil/ScopedArray.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/EndpointF.h $(includedir)/Ice/EndpointTypes.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/Dispatcher.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/Plugin.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/Stream.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/CommunicatorAsync.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Connection.h $(includedir)/Ice/ConnectionAsync.h $(includedir)/Ice/Functional.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/FactoryTableInit.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h $(includedir)/Glacier2/Router.h $(includedir)/Glacier2/Session.h $(includedir)/Glacier2/SSLInfo.h ../../include/TestCommon.h CallbackI.h Callback.h
+Server$(OBJEXT): Server.cpp $(includedir)/Ice/Application.h $(includedir)/Ice/Ice.h $(includedir)/Ice/Initialize.h $(includedir)/Ice/CommunicatorF.h $(includedir)/Ice/LocalObjectF.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/Ice/Handle.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Ice/Config.h $(includedir)/Ice/ProxyHandle.h $(includedir)/Ice/ProxyF.h $(includedir)/Ice/ObjectF.h $(includedir)/Ice/Exception.h $(includedir)/Ice/LocalObject.h $(includedir)/IceUtil/ScopedArray.h $(includedir)/Ice/UndefSysMacros.h $(includedir)/Ice/PropertiesF.h $(includedir)/Ice/Proxy.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/MutexProtocol.h $(includedir)/Ice/ProxyFactoryF.h $(includedir)/Ice/ConnectionIF.h $(includedir)/Ice/RequestHandlerF.h $(includedir)/Ice/EndpointIF.h $(includedir)/Ice/EndpointF.h $(includedir)/Ice/EndpointTypes.h $(includedir)/Ice/ObjectAdapterF.h $(includedir)/Ice/ReferenceF.h $(includedir)/Ice/OutgoingAsync.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/Thread.h $(includedir)/Ice/OutgoingAsyncF.h $(includedir)/Ice/InstanceF.h $(includedir)/Ice/Current.h $(includedir)/Ice/ConnectionF.h $(includedir)/Ice/Identity.h $(includedir)/Ice/BasicStream.h $(includedir)/Ice/ObjectFactoryF.h $(includedir)/Ice/Buffer.h $(includedir)/Ice/Protocol.h $(includedir)/Ice/StreamF.h $(includedir)/Ice/Object.h $(includedir)/Ice/GCShared.h $(includedir)/Ice/GCCountMap.h $(includedir)/Ice/IncomingAsyncF.h $(includedir)/Ice/LoggerF.h $(includedir)/Ice/StatsF.h $(includedir)/Ice/Dispatcher.h $(includedir)/Ice/StringConverter.h $(includedir)/Ice/Plugin.h $(includedir)/Ice/BuiltinSequences.h $(includedir)/Ice/Stream.h $(includedir)/IceUtil/Unicode.h $(includedir)/Ice/LocalException.h $(includedir)/Ice/Properties.h $(includedir)/Ice/Outgoing.h $(includedir)/Ice/Incoming.h $(includedir)/Ice/ServantLocatorF.h $(includedir)/Ice/ServantManagerF.h $(includedir)/Ice/Direct.h $(includedir)/Ice/Logger.h $(includedir)/Ice/LoggerUtil.h $(includedir)/Ice/Stats.h $(includedir)/Ice/Communicator.h $(includedir)/Ice/RouterF.h $(includedir)/Ice/LocatorF.h $(includedir)/Ice/PluginF.h $(includedir)/Ice/ImplicitContextF.h $(includedir)/Ice/CommunicatorAsync.h $(includedir)/Ice/ObjectFactory.h $(includedir)/Ice/ObjectAdapter.h $(includedir)/Ice/FacetMap.h $(includedir)/Ice/Endpoint.h $(includedir)/Ice/ServantLocator.h $(includedir)/Ice/IncomingAsync.h $(includedir)/Ice/Process.h $(includedir)/Ice/Connection.h $(includedir)/Ice/ConnectionAsync.h $(includedir)/Ice/Functional.h $(includedir)/IceUtil/Functional.h $(includedir)/Ice/ImplicitContext.h $(includedir)/Ice/Locator.h $(includedir)/Ice/FactoryTableInit.h $(includedir)/Ice/FactoryTable.h $(includedir)/Ice/UserExceptionFactory.h $(includedir)/Ice/ProcessF.h $(includedir)/Ice/Router.h $(includedir)/Ice/DispatchInterceptor.h $(includedir)/Ice/IconvStringConverter.h CallbackI.h Callback.h
+Callback.cpp: Callback.ice $(slicedir)/Ice/BuiltinSequences.ice $(SLICE2CPP) $(SLICEPARSERLIB)
diff --git a/cpp/test/Glacier2/override/.depend.mak b/cpp/test/Glacier2/override/.depend.mak
new file mode 100644
index 00000000000..f5c29ac5c0d
--- /dev/null
+++ b/cpp/test/Glacier2/override/.depend.mak
@@ -0,0 +1,5 @@
+Callback$(OBJEXT): Callback.cpp Callback.h "$(includedir)/Ice/LocalObjectF.h" "$(includedir)/IceUtil/Shared.h" "$(includedir)/IceUtil/Config.h" "$(includedir)/Ice/Handle.h" "$(includedir)/IceUtil/Handle.h" "$(includedir)/IceUtil/Exception.h" "$(includedir)/Ice/Config.h" "$(includedir)/Ice/ProxyHandle.h" "$(includedir)/Ice/ProxyF.h" "$(includedir)/Ice/ObjectF.h" "$(includedir)/Ice/Exception.h" "$(includedir)/Ice/LocalObject.h" "$(includedir)/Ice/Proxy.h" "$(includedir)/IceUtil/Mutex.h" "$(includedir)/IceUtil/Lock.h" "$(includedir)/IceUtil/ThreadException.h" "$(includedir)/IceUtil/Time.h" "$(includedir)/IceUtil/MutexProtocol.h" "$(includedir)/Ice/ProxyFactoryF.h" "$(includedir)/Ice/ConnectionIF.h" "$(includedir)/Ice/RequestHandlerF.h" "$(includedir)/Ice/EndpointIF.h" "$(includedir)/Ice/EndpointF.h" "$(includedir)/IceUtil/ScopedArray.h" "$(includedir)/Ice/UndefSysMacros.h" "$(includedir)/Ice/EndpointTypes.h" "$(includedir)/Ice/ObjectAdapterF.h" "$(includedir)/Ice/ReferenceF.h" "$(includedir)/Ice/OutgoingAsync.h" "$(includedir)/IceUtil/Monitor.h" "$(includedir)/IceUtil/Cond.h" "$(includedir)/IceUtil/Timer.h" "$(includedir)/IceUtil/Thread.h" "$(includedir)/Ice/OutgoingAsyncF.h" "$(includedir)/Ice/InstanceF.h" "$(includedir)/Ice/CommunicatorF.h" "$(includedir)/Ice/Current.h" "$(includedir)/Ice/ConnectionF.h" "$(includedir)/Ice/Identity.h" "$(includedir)/Ice/BasicStream.h" "$(includedir)/Ice/ObjectFactoryF.h" "$(includedir)/Ice/Buffer.h" "$(includedir)/Ice/Protocol.h" "$(includedir)/Ice/StreamF.h" "$(includedir)/Ice/Object.h" "$(includedir)/Ice/GCShared.h" "$(includedir)/Ice/GCCountMap.h" "$(includedir)/Ice/IncomingAsyncF.h" "$(includedir)/Ice/Outgoing.h" "$(includedir)/Ice/Incoming.h" "$(includedir)/Ice/ServantLocatorF.h" "$(includedir)/Ice/ServantManagerF.h" "$(includedir)/Ice/IncomingAsync.h" "$(includedir)/Ice/Direct.h" "$(includedir)/Ice/BuiltinSequences.h" "$(includedir)/Ice/Stream.h" "$(includedir)/Ice/LocalException.h" "$(includedir)/Ice/ObjectFactory.h" "$(includedir)/IceUtil/Iterator.h"
+CallbackI$(OBJEXT): CallbackI.cpp "$(includedir)/Ice/Ice.h" "$(includedir)/Ice/Initialize.h" "$(includedir)/Ice/CommunicatorF.h" "$(includedir)/Ice/LocalObjectF.h" "$(includedir)/IceUtil/Shared.h" "$(includedir)/IceUtil/Config.h" "$(includedir)/Ice/Handle.h" "$(includedir)/IceUtil/Handle.h" "$(includedir)/IceUtil/Exception.h" "$(includedir)/Ice/Config.h" "$(includedir)/Ice/ProxyHandle.h" "$(includedir)/Ice/ProxyF.h" "$(includedir)/Ice/ObjectF.h" "$(includedir)/Ice/Exception.h" "$(includedir)/Ice/LocalObject.h" "$(includedir)/IceUtil/ScopedArray.h" "$(includedir)/Ice/UndefSysMacros.h" "$(includedir)/Ice/PropertiesF.h" "$(includedir)/Ice/Proxy.h" "$(includedir)/IceUtil/Mutex.h" "$(includedir)/IceUtil/Lock.h" "$(includedir)/IceUtil/ThreadException.h" "$(includedir)/IceUtil/Time.h" "$(includedir)/IceUtil/MutexProtocol.h" "$(includedir)/Ice/ProxyFactoryF.h" "$(includedir)/Ice/ConnectionIF.h" "$(includedir)/Ice/RequestHandlerF.h" "$(includedir)/Ice/EndpointIF.h" "$(includedir)/Ice/EndpointF.h" "$(includedir)/Ice/EndpointTypes.h" "$(includedir)/Ice/ObjectAdapterF.h" "$(includedir)/Ice/ReferenceF.h" "$(includedir)/Ice/OutgoingAsync.h" "$(includedir)/IceUtil/Monitor.h" "$(includedir)/IceUtil/Cond.h" "$(includedir)/IceUtil/Timer.h" "$(includedir)/IceUtil/Thread.h" "$(includedir)/Ice/OutgoingAsyncF.h" "$(includedir)/Ice/InstanceF.h" "$(includedir)/Ice/Current.h" "$(includedir)/Ice/ConnectionF.h" "$(includedir)/Ice/Identity.h" "$(includedir)/Ice/BasicStream.h" "$(includedir)/Ice/ObjectFactoryF.h" "$(includedir)/Ice/Buffer.h" "$(includedir)/Ice/Protocol.h" "$(includedir)/Ice/StreamF.h" "$(includedir)/Ice/Object.h" "$(includedir)/Ice/GCShared.h" "$(includedir)/Ice/GCCountMap.h" "$(includedir)/Ice/IncomingAsyncF.h" "$(includedir)/Ice/LoggerF.h" "$(includedir)/Ice/StatsF.h" "$(includedir)/Ice/Dispatcher.h" "$(includedir)/Ice/StringConverter.h" "$(includedir)/Ice/Plugin.h" "$(includedir)/Ice/BuiltinSequences.h" "$(includedir)/Ice/Stream.h" "$(includedir)/IceUtil/Unicode.h" "$(includedir)/Ice/LocalException.h" "$(includedir)/Ice/Properties.h" "$(includedir)/Ice/Outgoing.h" "$(includedir)/Ice/Incoming.h" "$(includedir)/Ice/ServantLocatorF.h" "$(includedir)/Ice/ServantManagerF.h" "$(includedir)/Ice/Direct.h" "$(includedir)/Ice/Logger.h" "$(includedir)/Ice/LoggerUtil.h" "$(includedir)/Ice/Stats.h" "$(includedir)/Ice/Communicator.h" "$(includedir)/Ice/RouterF.h" "$(includedir)/Ice/LocatorF.h" "$(includedir)/Ice/PluginF.h" "$(includedir)/Ice/ImplicitContextF.h" "$(includedir)/Ice/CommunicatorAsync.h" "$(includedir)/Ice/ObjectFactory.h" "$(includedir)/Ice/ObjectAdapter.h" "$(includedir)/Ice/FacetMap.h" "$(includedir)/Ice/Endpoint.h" "$(includedir)/Ice/ServantLocator.h" "$(includedir)/Ice/IncomingAsync.h" "$(includedir)/Ice/Process.h" "$(includedir)/Ice/Application.h" "$(includedir)/Ice/Connection.h" "$(includedir)/Ice/ConnectionAsync.h" "$(includedir)/Ice/Functional.h" "$(includedir)/IceUtil/Functional.h" "$(includedir)/Ice/ImplicitContext.h" "$(includedir)/Ice/Locator.h" "$(includedir)/Ice/FactoryTableInit.h" "$(includedir)/Ice/FactoryTable.h" "$(includedir)/Ice/UserExceptionFactory.h" "$(includedir)/Ice/ProcessF.h" "$(includedir)/Ice/Router.h" "$(includedir)/Ice/DispatchInterceptor.h" "$(includedir)/Ice/IconvStringConverter.h" CallbackI.h Callback.h ../../include/TestCommon.h
+Client$(OBJEXT): Client.cpp "$(includedir)/IceUtil/Random.h" "$(includedir)/IceUtil/Config.h" "$(includedir)/IceUtil/Exception.h" "$(includedir)/IceUtil/IceUtil.h" "$(includedir)/IceUtil/AbstractMutex.h" "$(includedir)/IceUtil/Lock.h" "$(includedir)/IceUtil/ThreadException.h" "$(includedir)/IceUtil/Time.h" "$(includedir)/IceUtil/Cache.h" "$(includedir)/IceUtil/Handle.h" "$(includedir)/IceUtil/Mutex.h" "$(includedir)/IceUtil/MutexProtocol.h" "$(includedir)/IceUtil/CountDownLatch.h" "$(includedir)/IceUtil/Cond.h" "$(includedir)/IceUtil/CtrlCHandler.h" "$(includedir)/IceUtil/Functional.h" "$(includedir)/IceUtil/Monitor.h" "$(includedir)/IceUtil/MutexPtrLock.h" "$(includedir)/IceUtil/RWRecMutex.h" "$(includedir)/IceUtil/Thread.h" "$(includedir)/IceUtil/Shared.h" "$(includedir)/IceUtil/RecMutex.h" "$(includedir)/IceUtil/StaticMutex.h" "$(includedir)/IceUtil/Timer.h" "$(includedir)/IceUtil/UUID.h" "$(includedir)/IceUtil/Unicode.h" "$(includedir)/Ice/Application.h" "$(includedir)/Ice/Ice.h" "$(includedir)/Ice/Initialize.h" "$(includedir)/Ice/CommunicatorF.h" "$(includedir)/Ice/LocalObjectF.h" "$(includedir)/Ice/Handle.h" "$(includedir)/Ice/Config.h" "$(includedir)/Ice/ProxyHandle.h" "$(includedir)/Ice/ProxyF.h" "$(includedir)/Ice/ObjectF.h" "$(includedir)/Ice/Exception.h" "$(includedir)/Ice/LocalObject.h" "$(includedir)/IceUtil/ScopedArray.h" "$(includedir)/Ice/UndefSysMacros.h" "$(includedir)/Ice/PropertiesF.h" "$(includedir)/Ice/Proxy.h" "$(includedir)/Ice/ProxyFactoryF.h" "$(includedir)/Ice/ConnectionIF.h" "$(includedir)/Ice/RequestHandlerF.h" "$(includedir)/Ice/EndpointIF.h" "$(includedir)/Ice/EndpointF.h" "$(includedir)/Ice/EndpointTypes.h" "$(includedir)/Ice/ObjectAdapterF.h" "$(includedir)/Ice/ReferenceF.h" "$(includedir)/Ice/OutgoingAsync.h" "$(includedir)/Ice/OutgoingAsyncF.h" "$(includedir)/Ice/InstanceF.h" "$(includedir)/Ice/Current.h" "$(includedir)/Ice/ConnectionF.h" "$(includedir)/Ice/Identity.h" "$(includedir)/Ice/BasicStream.h" "$(includedir)/Ice/ObjectFactoryF.h" "$(includedir)/Ice/Buffer.h" "$(includedir)/Ice/Protocol.h" "$(includedir)/Ice/StreamF.h" "$(includedir)/Ice/Object.h" "$(includedir)/Ice/GCShared.h" "$(includedir)/Ice/GCCountMap.h" "$(includedir)/Ice/IncomingAsyncF.h" "$(includedir)/Ice/LoggerF.h" "$(includedir)/Ice/StatsF.h" "$(includedir)/Ice/Dispatcher.h" "$(includedir)/Ice/StringConverter.h" "$(includedir)/Ice/Plugin.h" "$(includedir)/Ice/BuiltinSequences.h" "$(includedir)/Ice/Stream.h" "$(includedir)/Ice/LocalException.h" "$(includedir)/Ice/Properties.h" "$(includedir)/Ice/Outgoing.h" "$(includedir)/Ice/Incoming.h" "$(includedir)/Ice/ServantLocatorF.h" "$(includedir)/Ice/ServantManagerF.h" "$(includedir)/Ice/Direct.h" "$(includedir)/Ice/Logger.h" "$(includedir)/Ice/LoggerUtil.h" "$(includedir)/Ice/Stats.h" "$(includedir)/Ice/Communicator.h" "$(includedir)/Ice/RouterF.h" "$(includedir)/Ice/LocatorF.h" "$(includedir)/Ice/PluginF.h" "$(includedir)/Ice/ImplicitContextF.h" "$(includedir)/Ice/CommunicatorAsync.h" "$(includedir)/Ice/ObjectFactory.h" "$(includedir)/Ice/ObjectAdapter.h" "$(includedir)/Ice/FacetMap.h" "$(includedir)/Ice/Endpoint.h" "$(includedir)/Ice/ServantLocator.h" "$(includedir)/Ice/IncomingAsync.h" "$(includedir)/Ice/Process.h" "$(includedir)/Ice/Connection.h" "$(includedir)/Ice/ConnectionAsync.h" "$(includedir)/Ice/Functional.h" "$(includedir)/Ice/ImplicitContext.h" "$(includedir)/Ice/Locator.h" "$(includedir)/Ice/FactoryTableInit.h" "$(includedir)/Ice/FactoryTable.h" "$(includedir)/Ice/UserExceptionFactory.h" "$(includedir)/Ice/ProcessF.h" "$(includedir)/Ice/Router.h" "$(includedir)/Ice/DispatchInterceptor.h" "$(includedir)/Ice/IconvStringConverter.h" "$(includedir)/Glacier2/Router.h" "$(includedir)/Glacier2/Session.h" "$(includedir)/Glacier2/SSLInfo.h" ../../include/TestCommon.h CallbackI.h Callback.h
+Server$(OBJEXT): Server.cpp "$(includedir)/Ice/Application.h" "$(includedir)/Ice/Ice.h" "$(includedir)/Ice/Initialize.h" "$(includedir)/Ice/CommunicatorF.h" "$(includedir)/Ice/LocalObjectF.h" "$(includedir)/IceUtil/Shared.h" "$(includedir)/IceUtil/Config.h" "$(includedir)/Ice/Handle.h" "$(includedir)/IceUtil/Handle.h" "$(includedir)/IceUtil/Exception.h" "$(includedir)/Ice/Config.h" "$(includedir)/Ice/ProxyHandle.h" "$(includedir)/Ice/ProxyF.h" "$(includedir)/Ice/ObjectF.h" "$(includedir)/Ice/Exception.h" "$(includedir)/Ice/LocalObject.h" "$(includedir)/IceUtil/ScopedArray.h" "$(includedir)/Ice/UndefSysMacros.h" "$(includedir)/Ice/PropertiesF.h" "$(includedir)/Ice/Proxy.h" "$(includedir)/IceUtil/Mutex.h" "$(includedir)/IceUtil/Lock.h" "$(includedir)/IceUtil/ThreadException.h" "$(includedir)/IceUtil/Time.h" "$(includedir)/IceUtil/MutexProtocol.h" "$(includedir)/Ice/ProxyFactoryF.h" "$(includedir)/Ice/ConnectionIF.h" "$(includedir)/Ice/RequestHandlerF.h" "$(includedir)/Ice/EndpointIF.h" "$(includedir)/Ice/EndpointF.h" "$(includedir)/Ice/EndpointTypes.h" "$(includedir)/Ice/ObjectAdapterF.h" "$(includedir)/Ice/ReferenceF.h" "$(includedir)/Ice/OutgoingAsync.h" "$(includedir)/IceUtil/Monitor.h" "$(includedir)/IceUtil/Cond.h" "$(includedir)/IceUtil/Timer.h" "$(includedir)/IceUtil/Thread.h" "$(includedir)/Ice/OutgoingAsyncF.h" "$(includedir)/Ice/InstanceF.h" "$(includedir)/Ice/Current.h" "$(includedir)/Ice/ConnectionF.h" "$(includedir)/Ice/Identity.h" "$(includedir)/Ice/BasicStream.h" "$(includedir)/Ice/ObjectFactoryF.h" "$(includedir)/Ice/Buffer.h" "$(includedir)/Ice/Protocol.h" "$(includedir)/Ice/StreamF.h" "$(includedir)/Ice/Object.h" "$(includedir)/Ice/GCShared.h" "$(includedir)/Ice/GCCountMap.h" "$(includedir)/Ice/IncomingAsyncF.h" "$(includedir)/Ice/LoggerF.h" "$(includedir)/Ice/StatsF.h" "$(includedir)/Ice/Dispatcher.h" "$(includedir)/Ice/StringConverter.h" "$(includedir)/Ice/Plugin.h" "$(includedir)/Ice/BuiltinSequences.h" "$(includedir)/Ice/Stream.h" "$(includedir)/IceUtil/Unicode.h" "$(includedir)/Ice/LocalException.h" "$(includedir)/Ice/Properties.h" "$(includedir)/Ice/Outgoing.h" "$(includedir)/Ice/Incoming.h" "$(includedir)/Ice/ServantLocatorF.h" "$(includedir)/Ice/ServantManagerF.h" "$(includedir)/Ice/Direct.h" "$(includedir)/Ice/Logger.h" "$(includedir)/Ice/LoggerUtil.h" "$(includedir)/Ice/Stats.h" "$(includedir)/Ice/Communicator.h" "$(includedir)/Ice/RouterF.h" "$(includedir)/Ice/LocatorF.h" "$(includedir)/Ice/PluginF.h" "$(includedir)/Ice/ImplicitContextF.h" "$(includedir)/Ice/CommunicatorAsync.h" "$(includedir)/Ice/ObjectFactory.h" "$(includedir)/Ice/ObjectAdapter.h" "$(includedir)/Ice/FacetMap.h" "$(includedir)/Ice/Endpoint.h" "$(includedir)/Ice/ServantLocator.h" "$(includedir)/Ice/IncomingAsync.h" "$(includedir)/Ice/Process.h" "$(includedir)/Ice/Connection.h" "$(includedir)/Ice/ConnectionAsync.h" "$(includedir)/Ice/Functional.h" "$(includedir)/IceUtil/Functional.h" "$(includedir)/Ice/ImplicitContext.h" "$(includedir)/Ice/Locator.h" "$(includedir)/Ice/FactoryTableInit.h" "$(includedir)/Ice/FactoryTable.h" "$(includedir)/Ice/UserExceptionFactory.h" "$(includedir)/Ice/ProcessF.h" "$(includedir)/Ice/Router.h" "$(includedir)/Ice/DispatchInterceptor.h" "$(includedir)/Ice/IconvStringConverter.h" CallbackI.h Callback.h
+Callback.cpp: Callback.ice "$(slicedir)/Ice/BuiltinSequences.ice" "$(SLICE2CPP)" "$(SLICEPARSERLIB)"
diff --git a/cpp/test/Glacier2/override/Callback.ice b/cpp/test/Glacier2/override/Callback.ice
new file mode 100644
index 00000000000..c7f9fd2c109
--- /dev/null
+++ b/cpp/test/Glacier2/override/Callback.ice
@@ -0,0 +1,36 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2010 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 CALLBACK_ICE
+#define CALLBACK_ICE
+
+#include <Ice/BuiltinSequences.ice>
+
+module Test
+{
+
+interface CallbackReceiver
+{
+ ["ami"] void callback(int token);
+
+ ["ami"] void callbackWithPayload(Ice::ByteSeq payload);
+};
+
+interface Callback
+{
+ ["amd"] void initiateCallback(CallbackReceiver* proxy, int token);
+
+ ["amd"] void initiateCallbackWithPayload(CallbackReceiver* proxy);
+
+ void shutdown();
+};
+
+};
+
+#endif
diff --git a/cpp/test/Glacier2/override/CallbackI.cpp b/cpp/test/Glacier2/override/CallbackI.cpp
new file mode 100644
index 00000000000..b561b120fed
--- /dev/null
+++ b/cpp/test/Glacier2/override/CallbackI.cpp
@@ -0,0 +1,222 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2010 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/Ice.h>
+#include <CallbackI.h>
+#include <TestCommon.h>
+
+using namespace std;
+using namespace Ice;
+using namespace Test;
+
+class Cookie : public Ice::LocalObject
+{
+};
+typedef IceUtil::Handle<Cookie> CookiePtr;
+
+template<class T>
+class CookieT : public Cookie
+{
+public:
+
+ CookieT(const T& v) : cb(v)
+ {
+ }
+
+ T cb;
+};
+
+template<typename T> CookiePtr newCookie(const T& cb)
+{
+ return new CookieT<T>(cb);
+}
+
+template<typename T> const T& getCookie(const CookiePtr& cookie)
+{
+ return dynamic_cast<CookieT<T>* >(cookie.get())->cb;
+}
+
+class AsyncCB : public IceUtil::Shared
+{
+public:
+
+ void
+ responseCallback(const CookiePtr& cookie)
+ {
+ getCookie<AMD_Callback_initiateCallbackPtr>(cookie)->ice_response();
+ }
+
+ void
+ exceptionCallback(const Ice::Exception& ex, const CookiePtr& cookie)
+ {
+ getCookie<AMD_Callback_initiateCallbackPtr>(cookie)->ice_exception(ex);
+ }
+
+ void
+ responseCallbackWithPayload(const CookiePtr& cookie)
+ {
+ getCookie<AMD_Callback_initiateCallbackWithPayloadPtr>(cookie)->ice_response();
+ }
+
+ void
+ exceptionCallbackWithPayload(const Ice::Exception& ex, const CookiePtr& cookie)
+ {
+ getCookie<AMD_Callback_initiateCallbackWithPayloadPtr>(cookie)->ice_exception(ex);
+ }
+};
+typedef IceUtil::Handle<AsyncCB> AsyncCBPtr;
+
+CallbackReceiverI::CallbackReceiverI() :
+ _holding(false),
+ _lastToken(-1),
+ _callback(0),
+ _callbackWithPayload(0)
+{
+}
+
+void
+CallbackReceiverI::callback(int token, const Current&)
+{
+ Lock sync(*this);
+ checkForHold();
+
+ if(token != _lastToken)
+ {
+ _callback = 0;
+ _lastToken = token;
+ }
+ ++_callback;
+ notifyAll();
+}
+
+void
+CallbackReceiverI::callbackWithPayload(const Ice::ByteSeq&, const Current&)
+{
+ Lock sync(*this);
+ checkForHold();
+ ++_callbackWithPayload;
+ notifyAll();
+}
+
+int
+CallbackReceiverI::callbackOK(int count, int token)
+{
+ Lock sync(*this);
+
+ while(_lastToken != token || _callback < count)
+ {
+ wait();
+ }
+
+ _callback -= count;
+ return _callback;
+}
+
+int
+CallbackReceiverI::callbackWithPayloadOK(int count)
+{
+ Lock sync(*this);
+
+ while(_callbackWithPayload < count)
+ {
+ wait();
+ }
+
+ _callbackWithPayload -= count;
+ return _callbackWithPayload;
+}
+
+void
+CallbackReceiverI::hold()
+{
+ Lock sync(*this);
+ _holding = true;
+}
+
+void
+CallbackReceiverI::activate()
+{
+ Lock sync(*this);
+ _holding = false;
+ notifyAll();
+}
+
+void
+CallbackReceiverI::checkForHold()
+{
+ while(_holding)
+ {
+ wait();
+ }
+}
+
+CallbackI::CallbackI()
+{
+}
+
+void
+CallbackI::initiateCallback_async(const AMD_Callback_initiateCallbackPtr& cb,
+ const CallbackReceiverPrx& proxy, int token, const Current& current)
+{
+ Ice::Context::const_iterator p = current.ctx.find("serverOvrd");
+ Ice::Context ctx = current.ctx;
+ if(p != current.ctx.end())
+ {
+ ctx["_ovrd"] = p->second;
+ }
+
+ if(proxy->ice_isTwoway())
+ {
+ AsyncCBPtr acb = new AsyncCB();
+ proxy->begin_callback(token, ctx,
+ newCallback_CallbackReceiver_callback(acb, &AsyncCB::responseCallback, &AsyncCB::exceptionCallback),
+ newCookie(cb));
+ }
+ else
+ {
+ proxy->callback(token, ctx);
+ cb->ice_response();
+ }
+}
+
+void
+CallbackI::initiateCallbackWithPayload_async(const AMD_Callback_initiateCallbackWithPayloadPtr& cb,
+ const CallbackReceiverPrx& proxy,
+ const Current& current)
+{
+ Ice::Context::const_iterator p = current.ctx.find("serverOvrd");
+ Ice::Context ctx = current.ctx;
+ if(p != current.ctx.end())
+ {
+ ctx["_ovrd"] = p->second;
+ }
+
+ Ice::ByteSeq seq(1000 * 1024, 0);
+ if(proxy->ice_isTwoway())
+ {
+ AsyncCBPtr acb = new AsyncCB();
+ proxy->begin_callbackWithPayload(seq, ctx,
+ newCallback_CallbackReceiver_callbackWithPayload(
+ acb,
+ &AsyncCB::responseCallbackWithPayload,
+ &AsyncCB::exceptionCallbackWithPayload),
+ newCookie(cb));
+ }
+ else
+ {
+ proxy->callbackWithPayload(seq, ctx);
+ cb->ice_response();
+ }
+}
+
+void
+CallbackI::shutdown(const Ice::Current& current)
+{
+ current.adapter->getCommunicator()->shutdown();
+}
diff --git a/cpp/test/Glacier2/override/CallbackI.h b/cpp/test/Glacier2/override/CallbackI.h
new file mode 100644
index 00000000000..29ca7ec5d81
--- /dev/null
+++ b/cpp/test/Glacier2/override/CallbackI.h
@@ -0,0 +1,59 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2010 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 CALLBACK_I_H
+#define CALLBACK_I_H
+
+#include <IceUtil/Mutex.h>
+#include <IceUtil/Monitor.h>
+#include <Callback.h>
+#include <vector>
+
+class CallbackReceiverI : public ::Test::CallbackReceiver, public IceUtil::Monitor<IceUtil::Mutex>
+{
+public:
+
+ CallbackReceiverI();
+
+ virtual void callback(int token, const Ice::Current&);
+ virtual void callbackWithPayload(const Ice::ByteSeq&, const ::Ice::Current&);
+
+ int callbackOK(int, int);
+ int callbackWithPayloadOK(int);
+
+ void hold();
+ void activate();
+
+private:
+
+ void checkForHold();
+
+ bool _holding;
+
+ int _lastToken;
+ int _callback;
+ int _callbackWithPayload;
+};
+typedef IceUtil::Handle<CallbackReceiverI> CallbackReceiverIPtr;
+
+class CallbackI : public ::Test::Callback
+{
+public:
+
+ CallbackI();
+
+ virtual void initiateCallback_async(const ::Test::AMD_Callback_initiateCallbackPtr&,
+ const ::Test::CallbackReceiverPrx&, int, const Ice::Current&);
+ virtual void initiateCallbackWithPayload_async(const ::Test::AMD_Callback_initiateCallbackWithPayloadPtr&,
+ const ::Test::CallbackReceiverPrx&,
+ const ::Ice::Current&);
+ virtual void shutdown(const Ice::Current&);
+};
+
+#endif
diff --git a/cpp/test/Glacier2/override/Client.cpp b/cpp/test/Glacier2/override/Client.cpp
new file mode 100644
index 00000000000..ef2896783f6
--- /dev/null
+++ b/cpp/test/Glacier2/override/Client.cpp
@@ -0,0 +1,210 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2010 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 <IceUtil/Random.h>
+#include <IceUtil/IceUtil.h>
+#include <Ice/Application.h>
+#include <Glacier2/Router.h>
+#include <TestCommon.h>
+#include <CallbackI.h>
+
+using namespace std;
+using namespace Ice;
+using namespace Test;
+
+static Ice::InitializationData initData;
+
+
+class CallbackClient : public Application
+{
+public:
+
+ virtual int run(int, char*[]);
+};
+
+int
+main(int argc, char* argv[])
+{
+ //
+ // We must disable connection warnings, because we attempt to ping
+ // the router before session establishment, as well as after
+ // session destruction. Both will cause a ConnectionLostException.
+ //
+ initData.properties = Ice::createProperties(argc, argv);
+ initData.properties->setProperty("Ice.Warn.Connections", "0");
+ initData.properties->setProperty("Ice.ThreadPool.Client.Serialize", "1");
+
+ CallbackClient app;
+ return app.main(argc, argv, initData);
+}
+
+int
+CallbackClient::run(int argc, char* argv[])
+{
+ ObjectPrx routerBase = communicator()->stringToProxy("Glacier2/router:default -p 12347");
+ Glacier2::RouterPrx router = Glacier2::RouterPrx::checkedCast(routerBase);
+ communicator()->setDefaultRouter(router);
+
+ ObjectPrx base = communicator()->stringToProxy("c/callback:tcp -p 12010");
+ Glacier2::SessionPrx session = router->createSession("userid", "abc123");
+ base->ice_ping();
+
+ CallbackPrx twoway = CallbackPrx::checkedCast(base);
+ CallbackPrx oneway = twoway->ice_oneway();
+ CallbackPrx batchOneway = twoway->ice_batchOneway();
+
+ communicator()->getProperties()->setProperty("Ice.PrintAdapterReady", "0");
+ ObjectAdapterPtr adapter = communicator()->createObjectAdapterWithRouter("CallbackReceiverAdapter", router);
+ adapter->activate();
+
+ string category = router->getCategoryForClient();
+
+ CallbackReceiverI* callbackReceiverImpl = new CallbackReceiverI;
+ ObjectPtr callbackReceiver = callbackReceiverImpl;
+
+ Identity callbackReceiverIdent;
+ callbackReceiverIdent.name = "callbackReceiver";
+ callbackReceiverIdent.category = category;
+ CallbackReceiverPrx twowayR =
+ CallbackReceiverPrx::uncheckedCast(adapter->add(callbackReceiver, callbackReceiverIdent));
+ CallbackReceiverPrx onewayR = twowayR->ice_oneway();
+
+ {
+ cout << "testing client request override... " << flush;
+ {
+ for(int i = 0; i < 5; i++)
+ {
+ oneway->initiateCallback(twowayR, 0);
+ oneway->initiateCallback(twowayR, 0);
+ callbackReceiverImpl->callbackOK(2, 0);
+ }
+ }
+
+ {
+ Ice::Context ctx;
+ ctx["_ovrd"] = "test";
+ for(int i = 0; i < 5; i++)
+ {
+ oneway->initiateCallback(twowayR, i, ctx);
+ oneway->initiateCallback(twowayR, i, ctx);
+ oneway->initiateCallback(twowayR, i, ctx);
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(100));
+ test(callbackReceiverImpl->callbackOK(1, i) < 3);
+ }
+ }
+ cout << "ok" << endl;
+ }
+
+ {
+ cout << "testing server request override... " << flush;
+ Ice::Context ctx;
+ ctx["serverOvrd"] = "test";
+ for(int i = 0; i < 5; i++)
+ {
+ oneway->initiateCallback(onewayR, i, ctx);
+ oneway->initiateCallback(onewayR, i, ctx);
+ oneway->initiateCallback(onewayR, i, ctx);
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(100));
+ test(callbackReceiverImpl->callbackOK(1, i) < 3);
+ }
+ oneway->initiateCallback(twowayR, 0);
+ test(callbackReceiverImpl->callbackOK(1, 0) == 0);
+
+ int count = 0;
+ int nRetry = 0;
+ do
+ {
+ callbackReceiverImpl->hold();
+ oneway->initiateCallbackWithPayload(onewayR, ctx);
+ oneway->initiateCallbackWithPayload(onewayR, ctx);
+ oneway->initiateCallbackWithPayload(onewayR, ctx);
+ oneway->initiateCallbackWithPayload(onewayR, ctx);
+ oneway->initiateCallbackWithPayload(onewayR, ctx);
+ oneway->initiateCallbackWithPayload(onewayR, ctx);
+ oneway->initiateCallbackWithPayload(onewayR, ctx);
+ oneway->initiateCallbackWithPayload(onewayR, ctx);
+ oneway->initiateCallbackWithPayload(onewayR, ctx);
+ oneway->initiateCallbackWithPayload(onewayR, ctx);
+ oneway->initiateCallback(twowayR, 0);
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(200));
+ callbackReceiverImpl->activate();
+ test(callbackReceiverImpl->callbackOK(1, 0) == 0);
+ count = callbackReceiverImpl->callbackWithPayloadOK(0);
+ callbackReceiverImpl->callbackWithPayloadOK(count);
+ }
+ while(count == 10 && nRetry++ < 10);
+ test(count < 10);
+
+ oneway->initiateCallbackWithPayload(twowayR);
+ oneway->initiateCallbackWithPayload(twowayR);
+ callbackReceiverImpl->hold();
+ oneway->initiateCallbackWithPayload(twowayR);
+ oneway->initiateCallback(onewayR, 0, ctx);
+ oneway->initiateCallback(onewayR, 0, ctx);
+ oneway->initiateCallback(onewayR, 0, ctx);
+ oneway->initiateCallback(onewayR, 0, ctx);
+ oneway->initiateCallback(onewayR, 0, ctx);
+ oneway->initiateCallbackWithPayload(twowayR);
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(1000));
+ callbackReceiverImpl->activate();
+ test(callbackReceiverImpl->callbackWithPayloadOK(4) == 0);
+ if(callbackReceiverImpl->callbackOK(1, 0) != 0)
+ {
+ cerr << callbackReceiverImpl->callbackOK(0, 0) << endl;
+ test(false);
+ }
+
+ ctx["_fwd"] = "O";
+
+ oneway->initiateCallbackWithPayload(twowayR);
+ callbackReceiverImpl->hold();
+ oneway->initiateCallbackWithPayload(twowayR);
+ oneway->initiateCallback(onewayR, 0, ctx);
+ oneway->initiateCallback(onewayR, 0, ctx);
+ oneway->initiateCallback(onewayR, 0, ctx);
+ oneway->initiateCallback(onewayR, 0, ctx);
+ oneway->initiateCallback(onewayR, 0, ctx);
+ oneway->initiateCallbackWithPayload(twowayR);
+ IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(200));
+ callbackReceiverImpl->activate();
+ test(callbackReceiverImpl->callbackWithPayloadOK(3) == 0);
+ test(callbackReceiverImpl->callbackOK(1, 0) == 0);
+
+ cout << "ok" << endl;
+ }
+
+ {
+ cout << "shutdown... " << flush;
+ twoway->shutdown();
+
+ try
+ {
+ router->destroySession();
+ }
+ catch(const Ice::LocalException&)
+ {
+ test(false);
+ }
+
+ communicator()->setDefaultRouter(0);
+ ObjectPrx processBase = communicator()->stringToProxy("Glacier2/admin -f Process:tcp -h 127.0.0.1 -p 12348");
+ Ice::ProcessPrx process = Ice::ProcessPrx::checkedCast(processBase);
+ process->shutdown();
+ try
+ {
+ process->ice_ping();
+ test(false);
+ }
+ catch(const Ice::LocalException&)
+ {
+ cout << "ok" << endl;
+ }
+ }
+ return EXIT_SUCCESS;
+}
diff --git a/cpp/test/Glacier2/override/Makefile b/cpp/test/Glacier2/override/Makefile
new file mode 100644
index 00000000000..5693c0a6530
--- /dev/null
+++ b/cpp/test/Glacier2/override/Makefile
@@ -0,0 +1,42 @@
+# **********************************************************************
+#
+# Copyright (c) 2003-2010 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.
+#
+# **********************************************************************
+
+top_srcdir = ../../..
+
+CLIENT = client
+SERVER = server
+
+TARGETS = $(CLIENT) $(SERVER)
+
+OBJS = Callback.o \
+ CallbackI.o
+
+COBJS = Client.o
+
+SOBJS = Server.o
+
+SRCS = $(OBJS:.o=.cpp) \
+ $(COBJS:.o=.cpp) \
+ $(SOBJS:.o=.cpp)
+
+SLICE_SRCS = Callback.ice
+
+include $(top_srcdir)/config/Make.rules
+
+CPPFLAGS := -I. -I../../include $(CPPFLAGS)
+
+$(CLIENT): $(OBJS) $(COBJS)
+ rm -f $@
+ $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(COBJS) -lGlacier2 $(LIBS)
+
+$(SERVER): $(OBJS) $(SOBJS)
+ rm -f $@
+ $(CXX) $(LDFLAGS) -o $@ $(OBJS) $(SOBJS) $(LIBS)
+
+include .depend
diff --git a/cpp/test/Glacier2/override/Makefile.mak b/cpp/test/Glacier2/override/Makefile.mak
new file mode 100644
index 00000000000..5630bf075e2
--- /dev/null
+++ b/cpp/test/Glacier2/override/Makefile.mak
@@ -0,0 +1,50 @@
+# **********************************************************************
+#
+# Copyright (c) 2003-2010 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.
+#
+# **********************************************************************
+
+top_srcdir = ..\..\..
+
+CLIENT = client.exe
+SERVER = server.exe
+
+TARGETS = $(CLIENT) $(SERVER)
+
+OBJS = Callback.obj \
+ CallbackI.obj
+
+COBJS = Client.obj
+
+SOBJS = Server.obj
+
+SRCS = $(OBJS:.obj=.cpp) \
+ $(COBJS:.obj=.cpp) \
+ $(SOBJS:.obj=.cpp)
+
+!include $(top_srcdir)/config/Make.rules.mak
+
+CPPFLAGS = -I. -I../../include $(CPPFLAGS) -DWIN32_LEAN_AND_MEAN
+
+!if "$(GENERATE_PDB)" == "yes"
+CPDBFLAGS = /pdb:$(CLIENT:.exe=.pdb)
+SPDBFLAGS = /pdb:$(SERVER:.exe=.pdb)
+!endif
+
+$(CLIENT): $(OBJS) $(COBJS)
+ $(LINK) $(LD_EXEFLAGS) $(CPDBFLAGS) $(SETARGV) $(OBJS) $(COBJS) $(PREOUT)$@ $(PRELIBS)$(LIBS) glacier2$(LIBSUFFIX).lib
+ @if exist $@.manifest echo ^ ^ ^ Embedding manifest using $(MT) && \
+ $(MT) -nologo -manifest $@.manifest -outputresource:$@;#1 && del /q $@.manifest
+
+$(SERVER): $(OBJS) $(SOBJS)
+ $(LINK) $(LD_EXEFLAGS) $(SPDBFLAGS) $(SETARGV) $(OBJS) $(SOBJS) $(PREOUT)$@ $(PRELIBS)$(LIBS)
+ @if exist $@.manifest echo ^ ^ ^ Embedding manifest using $(MT) && \
+ $(MT) -nologo -manifest $@.manifest -outputresource:$@;#1 && del /q $@.manifest
+
+clean::
+ del /q Callback.cpp Callback.h
+
+!include .depend.mak
diff --git a/cpp/test/Glacier2/override/Server.cpp b/cpp/test/Glacier2/override/Server.cpp
new file mode 100644
index 00000000000..217fd7bea91
--- /dev/null
+++ b/cpp/test/Glacier2/override/Server.cpp
@@ -0,0 +1,47 @@
+// **********************************************************************
+//
+// Copyright (c) 2003-2010 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/Application.h>
+#include <CallbackI.h>
+
+using namespace std;
+using namespace Ice;
+using namespace Test;
+
+class CallbackServer : public Application
+{
+public:
+
+ virtual int run(int, char*[]);
+};
+
+int
+main(int argc, char* argv[])
+{
+ Ice::InitializationData initData;
+ initData.properties = Ice::createProperties(argc, argv);
+
+ initData.properties->setProperty("Ice.Warn.Connections", "0");
+ initData.properties->setProperty("Ice.Warn.Dispatch", "0");
+ initData.properties->setProperty("Ice.ThreadPool.Server.Serialize", "1");
+
+ CallbackServer app;
+ return app.main(argc, argv, initData);
+}
+
+int
+CallbackServer::run(int argc, char* argv[])
+{
+ communicator()->getProperties()->setProperty("CallbackAdapter.Endpoints", "tcp -p 12010");
+ ObjectAdapterPtr adapter = communicator()->createObjectAdapter("CallbackAdapter");
+ adapter->add(new CallbackI(), communicator()->stringToIdentity("c/callback"));
+ adapter->activate();
+ communicator()->waitForShutdown();
+ return EXIT_SUCCESS;
+}
diff --git a/cpp/test/Glacier2/override/run.py b/cpp/test/Glacier2/override/run.py
new file mode 100755
index 00000000000..bc8c0b7a8cc
--- /dev/null
+++ b/cpp/test/Glacier2/override/run.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+# **********************************************************************
+#
+# Copyright (c) 2003-2010 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.
+#
+# **********************************************************************
+
+import os, sys
+
+path = [ ".", "..", "../..", "../../..", "../../../.." ]
+head = os.path.dirname(sys.argv[0])
+if len(head) > 0:
+ path = [os.path.join(head, p) for p in path]
+path = [os.path.abspath(p) for p in path if os.path.exists(os.path.join(p, "scripts", "TestUtil.py")) ]
+if len(path) == 0:
+ raise "can't find toplevel directory!"
+sys.path.append(os.path.join(path[0]))
+from scripts import *
+
+router = TestUtil.getGlacier2Router()
+
+if TestUtil.appverifier:
+ TestUtil.setAppVerifierSettings([router])
+
+def startRouter():
+
+ args = ' --Ice.Warn.Dispatch=0' + \
+ ' --Ice.Warn.Connections=0' + \
+ ' --Ice.ThreadPool.Server.Serialize=1' + \
+ ' --Ice.ThreadPool.Client.Serialize=1' + \
+ ' --Glacier2.Filter.Category.Accept="c"' + \
+ ' --Glacier2.SessionTimeout="30"' + \
+ ' --Glacier2.Client.Endpoints="default -p 12347"' + \
+ ' --Glacier2.Server.Endpoints="tcp -h 127.0.0.1"' \
+ ' --Ice.Admin.Endpoints="tcp -h 127.0.0.1 -p 12348"' + \
+ ' --Glacier2.PermissionsVerifier=Glacier2/NullPermissionsVerifier' + \
+ ' --Glacier2.Client.ForwardContext=1' + \
+ ' --Glacier2.Client.Trace.Override=0' + \
+ ' --Glacier2.Client.Trace.Request=0' + \
+ ' --Glacier2.Server.Trace.Override=0' + \
+ ' --Glacier2.Server.Trace.Request=0' + \
+ ' --Ice.Admin.InstanceName="Glacier2"' + \
+ ' --Glacier2.Client.Buffered=1 --Glacier2.Server.Buffered=1' + \
+ ' --Glacier2.Client.SleepTime=50 --Glacier2.Server.SleepTime=50'
+
+ print "starting router in buffered mode...",
+ starterProc = TestUtil.startServer(router, args, count=2)
+ print "ok"
+ return starterProc
+
+name = os.path.join("Glacier2", "override")
+
+starterProc = startRouter()
+TestUtil.clientServerTest(name, additionalClientOptions = " --shutdown")
+starterProc.waitTestSuccess()
+
+if TestUtil.appverifier:
+ TestUtil.appVerifierAfterTestEnd([router])
+