summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/RequestHandlerFactory.cpp
diff options
context:
space:
mode:
authorBenoit Foucher <benoit@zeroc.com>2015-03-10 12:12:10 +0100
committerBenoit Foucher <benoit@zeroc.com>2015-03-10 12:12:10 +0100
commitc6ca68d97aa5bbc2a172e3e35171b5452657fa22 (patch)
tree46edcca4c8e313285a205bf6fad7c56c452c0cc0 /cpp/src/Ice/RequestHandlerFactory.cpp
parentMinor JS style fixes (diff)
downloadice-c6ca68d97aa5bbc2a172e3e35171b5452657fa22.tar.bz2
ice-c6ca68d97aa5bbc2a172e3e35171b5452657fa22.tar.xz
ice-c6ca68d97aa5bbc2a172e3e35171b5452657fa22.zip
ICE-6170 - fixed behavior of batch requests
Diffstat (limited to 'cpp/src/Ice/RequestHandlerFactory.cpp')
-rw-r--r--cpp/src/Ice/RequestHandlerFactory.cpp38
1 files changed, 23 insertions, 15 deletions
diff --git a/cpp/src/Ice/RequestHandlerFactory.cpp b/cpp/src/Ice/RequestHandlerFactory.cpp
index 0ca1ce15115..0b2d0ff10ed 100644
--- a/cpp/src/Ice/RequestHandlerFactory.cpp
+++ b/cpp/src/Ice/RequestHandlerFactory.cpp
@@ -22,49 +22,57 @@ RequestHandlerFactory::RequestHandlerFactory(const InstancePtr& instance) : _ins
{
}
-RequestHandlerPtr
-IceInternal::RequestHandlerFactory::getRequestHandler(const ReferencePtr& ref, const Ice::ObjectPrx& proxy)
+RequestHandlerPtr
+IceInternal::RequestHandlerFactory::getRequestHandler(const RoutableReferencePtr& ref, const Ice::ObjectPrx& proxy)
{
if(ref->getCollocationOptimized())
{
Ice::ObjectAdapterPtr adapter = _instance->objectAdapterFactory()->findObjectAdapter(proxy);
if(adapter)
{
- return new CollocatedRequestHandler(ref, adapter);
+ return proxy->__setRequestHandler(new CollocatedRequestHandler(ref, adapter));
}
}
+ ConnectRequestHandlerPtr handler;
+ bool connect = false;
if(ref->getCacheConnection())
{
Lock sync(*this);
-
- map<ReferencePtr, RequestHandlerPtr>::iterator p = _handlers.find(ref);
- if(p != _handlers.end())
+ map<ReferencePtr, ConnectRequestHandlerPtr>::iterator p = _handlers.find(ref);
+ if(p == _handlers.end())
{
- return p->second;
+ handler = new ConnectRequestHandler(ref, proxy);
+ _handlers.insert(make_pair(ref, handler));
+ connect = true;
+ }
+ else
+ {
+ handler = p->second;
}
-
- RequestHandlerPtr handler = new ConnectRequestHandler(ref, proxy);
- _handlers.insert(make_pair(ref, handler));
- return handler;
}
else
{
- return new ConnectRequestHandler(ref, proxy);
+ handler = new ConnectRequestHandler(ref, proxy);
+ connect = true;
}
+ if(connect)
+ {
+ ref->getConnection(handler.get());
+ }
+ return proxy->__setRequestHandler(handler->connect(proxy));
}
-void
+void
IceInternal::RequestHandlerFactory::removeRequestHandler(const ReferencePtr& ref, const RequestHandlerPtr& handler)
{
if(ref->getCacheConnection())
{
Lock sync(*this);
- map<ReferencePtr, RequestHandlerPtr>::iterator p = _handlers.find(ref);
+ map<ReferencePtr, ConnectRequestHandlerPtr>::iterator p = _handlers.find(ref);
if(p != _handlers.end() && p->second.get() == handler.get())
{
_handlers.erase(p);
}
}
}
-