summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorMarc Laukien <marc@zeroc.com>2004-08-11 15:16:48 +0000
committerMarc Laukien <marc@zeroc.com>2004-08-11 15:16:48 +0000
commitcf4f48c92865a0ee086402f238c8b510d1c9d43a (patch)
tree702367a199509c4f2a321e60f9f51d54c1d546af /cpp
parentmore glacier2 stuff (diff)
downloadice-cf4f48c92865a0ee086402f238c8b510d1c9d43a.tar.bz2
ice-cf4f48c92865a0ee086402f238c8b510d1c9d43a.tar.xz
ice-cf4f48c92865a0ee086402f238c8b510d1c9d43a.zip
more glacier 2 and reverse proxy work
Diffstat (limited to 'cpp')
-rw-r--r--cpp/slice/Ice/Current.ice6
-rw-r--r--cpp/slice/Ice/ObjectAdapter.ice8
-rw-r--r--cpp/src/Glacier2/Blobject.cpp8
-rw-r--r--cpp/src/Glacier2/Blobject.h1
-rw-r--r--cpp/src/Glacier2/Request.cpp8
-rw-r--r--cpp/src/Glacier2/Request.h1
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp37
-rw-r--r--cpp/src/Ice/ObjectAdapterI.h2
-rw-r--r--cpp/src/Ice/Reference.cpp138
-rw-r--r--cpp/src/Ice/Reference.h5
-rw-r--r--cpp/src/Ice/ReferenceFactory.cpp7
-rw-r--r--cpp/src/Ice/ReferenceFactory.h3
-rwxr-xr-xcpp/src/Ice/TransportInfoI.cpp7
-rw-r--r--cpp/src/Ice/TransportInfoI.h5
14 files changed, 105 insertions, 131 deletions
diff --git a/cpp/slice/Ice/Current.ice b/cpp/slice/Ice/Current.ice
index 1b1a3adcd4c..977d685016e 100644
--- a/cpp/slice/Ice/Current.ice
+++ b/cpp/slice/Ice/Current.ice
@@ -77,10 +77,8 @@ enum OperationMode
*
* Information about the current method invocation for servers. Each
* operation on the server has a [Current] as its implicit final
- * parameter. [Current] is mostly used for &Ice; services, such as
- * &IceStorm;. Most applications ignore this parameter.
- *
- * @see IceStorm
+ * parameter. [Current] is mostly used for &Ice; services. Most
+ * applications ignore this parameter.
*
**/
local struct Current
diff --git a/cpp/slice/Ice/ObjectAdapter.ice b/cpp/slice/Ice/ObjectAdapter.ice
index 2eb8c8ae632..de95fbe3f32 100644
--- a/cpp/slice/Ice/ObjectAdapter.ice
+++ b/cpp/slice/Ice/ObjectAdapter.ice
@@ -490,13 +490,15 @@ local interface ObjectAdapter
* @param id The identity for which a proxy is to be created.
*
* @param transport The transport that should be used, or null if
- * all available connections to this object adapater should be
- * used.
+ * the first available connection to this object adapater should
+ * be used.
*
* @return A "reverse proxy" that matches the given identity and
- * this object adapter.
+ * this object adapter. If no connections have been established to
+ * this object adapter, a null proxy is returned.
*
* @see Identity
+ * @see TransportInfo
*
**/
Object* createReverseProxy(Identity id, TransportInfo transport);
diff --git a/cpp/src/Glacier2/Blobject.cpp b/cpp/src/Glacier2/Blobject.cpp
index 779dc292615..7f1f5244ca5 100644
--- a/cpp/src/Glacier2/Blobject.cpp
+++ b/cpp/src/Glacier2/Blobject.cpp
@@ -13,8 +13,14 @@ using namespace std;
using namespace Ice;
using namespace Glacier;
+static const string serverAlwaysBatch = "Glacier2.Server.AlwaysBatch";
+static const string clientAlwaysBatch = "Glacier2.Client.AlwaysBatch";
+
Glacier::Blobject::Blobject(const CommunicatorPtr& communicator, bool reverse) :
- _logger(communicator->getLogger())
+ _logger(communicator->getLogger()),
+ _alwaysBatch(reverse ?
+ communicator->getProperties()->getPropertyAsInt(serverAlwaysBatch) > 0 :
+ communicator->getProperties()->getPropertyAsInt(clientAlwaysBatch) > 0)
{
_requestQueue = new RequestQueue(communicator, reverse);
_requestQueueControl = _requestQueue->start();
diff --git a/cpp/src/Glacier2/Blobject.h b/cpp/src/Glacier2/Blobject.h
index 79eeea4c41e..3cafcd503f7 100644
--- a/cpp/src/Glacier2/Blobject.h
+++ b/cpp/src/Glacier2/Blobject.h
@@ -36,6 +36,7 @@ private:
void modifyProxy(Ice::ObjectPrx&, const Ice::Current&) const;
+ const bool _alwaysBatch;
RequestQueuePtr _requestQueue;
IceUtil::ThreadControl _requestQueueControl;
};
diff --git a/cpp/src/Glacier2/Request.cpp b/cpp/src/Glacier2/Request.cpp
index 091299bdb65..fbfcd87e6c1 100644
--- a/cpp/src/Glacier2/Request.cpp
+++ b/cpp/src/Glacier2/Request.cpp
@@ -119,16 +119,16 @@ static const string clientSleepTime = "Glacier2.Client.SleepTime";
Glacier::RequestQueue::RequestQueue(const Ice::CommunicatorPtr& communicator, bool reverse) :
_logger(communicator->getLogger()),
_reverse(reverse),
- _traceLevelRequest(_reverse ?
+ _traceLevelRequest(reverse ?
communicator->getProperties()->getPropertyAsInt(serverTraceRequest) :
communicator->getProperties()->getPropertyAsInt(clientTraceRequest)),
- _traceLevelOverride(_reverse ?
+ _traceLevelOverride(reverse ?
communicator->getProperties()->getPropertyAsInt(serverTraceOverride) :
communicator->getProperties()->getPropertyAsInt(clientTraceOverride)),
- _forwardContext(_reverse ?
+ _forwardContext(reverse ?
communicator->getProperties()->getPropertyAsInt(serverForwardContext) > 0 :
communicator->getProperties()->getPropertyAsInt(clientForwardContext) > 0),
- _sleepTime(_reverse ?
+ _sleepTime(reverse ?
IceUtil::Time::milliSeconds(communicator->getProperties()->getPropertyAsInt(serverSleepTime)) :
IceUtil::Time::milliSeconds(communicator->getProperties()->getPropertyAsInt(clientSleepTime))),
_destroy(false)
diff --git a/cpp/src/Glacier2/Request.h b/cpp/src/Glacier2/Request.h
index 90d10243636..5d26d3f56f2 100644
--- a/cpp/src/Glacier2/Request.h
+++ b/cpp/src/Glacier2/Request.h
@@ -69,7 +69,6 @@ private:
const IceUtil::Time _sleepTime;
std::vector<RequestPtr> _requests;
- std::vector<RequestPtr> _batchRequests;
bool _destroy;
};
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index a5c62cbfe95..82a02f9ea1e 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -15,6 +15,7 @@
#include <Ice/ReferenceFactory.h>
#include <Ice/Endpoint.h>
#include <Ice/EndpointFactoryManager.h>
+#include <Ice/Connection.h> // For Connection::getTransportInfo()
#include <Ice/ConnectionFactory.h>
#include <Ice/ServantManager.h>
#include <Ice/RouterInfo.h>
@@ -451,12 +452,40 @@ Ice::ObjectAdapterI::createReverseProxy(const Identity& ident, const TransportIn
checkIdentity(ident);
//
+ // If no connection is specified, we use the first connection of
+ // this object adapter.
+ //
+ TransportInfoPtr tr = transport;
+ if(!tr)
+ {
+ vector<IncomingConnectionFactoryPtr>::const_iterator p;
+ for(p = _incomingConnectionFactories.begin(); p != _incomingConnectionFactories.end(); ++p)
+ {
+ list<ConnectionPtr> connections = (*p)->connections();
+ if(!connections.empty())
+ {
+ tr = (*connections.begin())->getTransportInfo();
+ break;
+ }
+ }
+
+ //
+ // If there is no incoming connection for the object adapter,
+ // we return a null proxy.
+ //
+ if(!tr)
+ {
+ return 0;
+ }
+ }
+
+ //
// Create a reference and return a reverse proxy for this
// reference.
//
vector<EndpointPtr> endpoints;
ReferencePtr ref = _instance->referenceFactory()->create(ident, Context(), "", Reference::ModeTwoway,
- false, "", endpoints, 0, 0, this, transport, true);
+ false, "", endpoints, 0, 0, tr, true);
return _instance->proxyFactory()->referenceToProxy(ref);
}
@@ -575,6 +604,7 @@ Ice::ObjectAdapterI::isLocal(const ObjectPrx& proxy) const
return false;
}
+/*
list<ConnectionPtr>
Ice::ObjectAdapterI::getIncomingConnections() const
{
@@ -591,6 +621,7 @@ Ice::ObjectAdapterI::getIncomingConnections() const
}
return connections;
}
+*/
void
Ice::ObjectAdapterI::flushBatchRequests()
@@ -792,7 +823,7 @@ Ice::ObjectAdapterI::newProxy(const Identity& ident) const
vector<EndpointPtr> endpoints;
ReferencePtr ref = _instance->referenceFactory()->create(ident, Context(), "",
Reference::ModeTwoway, false, _id,
- endpoints, 0, _locatorInfo, 0, 0, true);
+ endpoints, 0, _locatorInfo, 0, true);
//
// Return a proxy for the reference.
@@ -824,7 +855,7 @@ Ice::ObjectAdapterI::newDirectProxy(const Identity& ident) const
// Create a reference and return a proxy for this reference.
//
ReferencePtr ref = _instance->referenceFactory()->create(ident, Context(), "", Reference::ModeTwoway,
- false, "", endpoints, 0, _locatorInfo, 0, 0, true);
+ false, "", endpoints, 0, _locatorInfo, 0, true);
return _instance->proxyFactory()->referenceToProxy(ref);
}
diff --git a/cpp/src/Ice/ObjectAdapterI.h b/cpp/src/Ice/ObjectAdapterI.h
index 4176c12ddba..67e265eafa3 100644
--- a/cpp/src/Ice/ObjectAdapterI.h
+++ b/cpp/src/Ice/ObjectAdapterI.h
@@ -74,7 +74,7 @@ public:
bool isLocal(const ObjectPrx&) const;
- std::list<IceInternal::ConnectionPtr> getIncomingConnections() const;
+// std::list<IceInternal::ConnectionPtr> getIncomingConnections() const;
void flushBatchRequests();
diff --git a/cpp/src/Ice/Reference.cpp b/cpp/src/Ice/Reference.cpp
index 93bfb1d602e..9e03acceef5 100644
--- a/cpp/src/Ice/Reference.cpp
+++ b/cpp/src/Ice/Reference.cpp
@@ -19,9 +19,9 @@
#include <Ice/LocatorInfo.h>
#include <Ice/Locator.h>
#include <Ice/Functional.h>
-#include <Ice/ObjectAdapterI.h> // For getIncomingConnections().
#include <Ice/Connection.h>
#include <Ice/ConnectionFactory.h>
+#include <Ice/TransportInfoI.h>
#include <Ice/LoggerUtil.h>
#include <Ice/TraceLevels.h>
#include <IceUtil/StringUtil.h>
@@ -86,11 +86,6 @@ IceInternal::Reference::operator==(const Reference& r) const
return false;
}
- if(reverseAdapter != r.reverseAdapter)
- {
- return false;
- }
-
if(reverseTransport != r.reverseTransport)
{
return false;
@@ -199,15 +194,6 @@ IceInternal::Reference::operator<(const Reference& r) const
return false;
}
- if(reverseAdapter < r.reverseAdapter)
- {
- return true;
- }
- else if(r.reverseAdapter < reverseAdapter)
- {
- return false;
- }
-
if(reverseTransport < r.reverseTransport)
{
return true;
@@ -398,8 +384,8 @@ IceInternal::Reference::changeIdentity(const Identity& newIdentity) const
else
{
return instance->referenceFactory()->create(newIdentity, context, facet, mode, secure, adapterId,
- endpoints, routerInfo, locatorInfo, reverseAdapter,
- reverseTransport, collocationOptimization);
+ endpoints, routerInfo, locatorInfo, reverseTransport,
+ collocationOptimization);
}
}
@@ -413,8 +399,8 @@ IceInternal::Reference::changeContext(const Context& newContext) const
else
{
return instance->referenceFactory()->create(identity, newContext, facet, mode, secure, adapterId,
- endpoints, routerInfo, locatorInfo, reverseAdapter,
- reverseTransport, collocationOptimization);
+ endpoints, routerInfo, locatorInfo, reverseTransport,
+ collocationOptimization);
}
}
@@ -428,8 +414,8 @@ IceInternal::Reference::changeFacet(const string& newFacet) const
else
{
return instance->referenceFactory()->create(identity, context, newFacet, mode, secure, adapterId,
- endpoints, routerInfo, locatorInfo, reverseAdapter,
- reverseTransport, collocationOptimization);
+ endpoints, routerInfo, locatorInfo, reverseTransport,
+ collocationOptimization);
}
}
@@ -479,8 +465,8 @@ IceInternal::Reference::changeTimeout(int newTimeout) const
}
return instance->referenceFactory()->create(identity, context, facet, mode, secure, adapterId,
- newEndpoints, newRouterInfo, newLocatorInfo, reverseAdapter,
- reverseTransport, collocationOptimization);
+ newEndpoints, newRouterInfo, newLocatorInfo, reverseTransport,
+ collocationOptimization);
}
ReferencePtr
@@ -493,8 +479,8 @@ IceInternal::Reference::changeMode(Mode newMode) const
else
{
return instance->referenceFactory()->create(identity, context, facet, newMode, secure, adapterId,
- endpoints, routerInfo, locatorInfo, reverseAdapter,
- reverseTransport, collocationOptimization);
+ endpoints, routerInfo, locatorInfo, reverseTransport,
+ collocationOptimization);
}
}
@@ -508,8 +494,8 @@ IceInternal::Reference::changeSecure(bool newSecure) const
else
{
return instance->referenceFactory()->create(identity, context, facet, mode, newSecure, adapterId,
- endpoints, routerInfo, locatorInfo, reverseAdapter,
- reverseTransport, collocationOptimization);
+ endpoints, routerInfo, locatorInfo, reverseTransport,
+ collocationOptimization);
}
}
@@ -559,8 +545,8 @@ IceInternal::Reference::changeCompress(bool newCompress) const
}
return instance->referenceFactory()->create(identity, context, facet, mode, secure, adapterId,
- newEndpoints, newRouterInfo, newLocatorInfo, reverseAdapter,
- reverseTransport, collocationOptimization);
+ newEndpoints, newRouterInfo, newLocatorInfo, reverseTransport,
+ collocationOptimization);
}
ReferencePtr
@@ -573,8 +559,8 @@ IceInternal::Reference::changeAdapterId(const string& newAdapterId) const
else
{
return instance->referenceFactory()->create(identity, context, facet, mode, secure, newAdapterId,
- endpoints, routerInfo, locatorInfo, reverseAdapter,
- reverseTransport, collocationOptimization);
+ endpoints, routerInfo, locatorInfo, reverseTransport,
+ collocationOptimization);
}
}
@@ -588,8 +574,8 @@ IceInternal::Reference::changeEndpoints(const vector<EndpointPtr>& newEndpoints)
else
{
return instance->referenceFactory()->create(identity, context, facet, mode, secure, adapterId,
- newEndpoints, routerInfo, locatorInfo, reverseAdapter,
- reverseTransport, collocationOptimization);
+ newEndpoints, routerInfo, locatorInfo, reverseTransport,
+ collocationOptimization);
}
}
@@ -605,8 +591,8 @@ IceInternal::Reference::changeRouter(const RouterPrx& newRouter) const
else
{
return instance->referenceFactory()->create(identity, context, facet, mode, secure, adapterId,
- endpoints, newRouterInfo, locatorInfo, reverseAdapter,
- reverseTransport, collocationOptimization);
+ endpoints, newRouterInfo, locatorInfo, reverseTransport,
+ collocationOptimization);
}
}
@@ -622,8 +608,8 @@ IceInternal::Reference::changeLocator(const LocatorPrx& newLocator) const
else
{
return instance->referenceFactory()->create(identity, context, facet, mode, secure, adapterId,
- endpoints, routerInfo, newLocatorInfo, reverseAdapter,
- reverseTransport, collocationOptimization);
+ endpoints, routerInfo, newLocatorInfo, reverseTransport,
+ collocationOptimization);
}
}
@@ -637,8 +623,8 @@ IceInternal::Reference::changeCollocationOptimization(bool newCollocationOptimiz
else
{
return instance->referenceFactory()->create(identity, context, facet, mode, secure, adapterId,
- endpoints, routerInfo, locatorInfo, reverseAdapter,
- reverseTransport, newCollocationOptimization);
+ endpoints, routerInfo, locatorInfo, reverseTransport,
+ newCollocationOptimization);
}
}
@@ -651,7 +637,7 @@ IceInternal::Reference::changeDefault() const
get(instance->referenceFactory()->getDefaultLocator());
return instance->referenceFactory()->create(identity, context, "", ModeTwoway, false, adapterId,
- endpoints, defaultRouterInfo, defaultLocatorInfo, 0, 0, true);
+ endpoints, defaultRouterInfo, defaultLocatorInfo, 0, true);
}
ConnectionPtr
@@ -659,71 +645,17 @@ IceInternal::Reference::getConnection(bool& compress) const
{
ConnectionPtr connection;
- if(reverseAdapter)
+ if(reverseTransport)
{
- //
- // If we have a reverse object adapter, we use the incoming
- // connections from such object adapter.
- //
- ObjectAdapterIPtr adapter = ObjectAdapterIPtr::dynamicCast(reverseAdapter);
- assert(adapter);
-
- list<ConnectionPtr> connections = adapter->getIncomingConnections();
- list<ConnectionPtr>::iterator p;
-
- //
- // If we have a reverse transport, then we only use the
- // incoming connection that corresponds to this
- // transport. Otherwise we use the first suitable incoming
- // connections.
- //
- if(reverseTransport)
- {
- //
- // TODO: This doesn't scale if we have many connections!!
- //
- for(p = connections.begin(); p != connections.end(); ++p)
- {
- if((*p)->getTransportInfo() == reverseTransport)
- {
- break;
- }
- }
-
- if(p == connections.end())
- {
- NoEndpointException ex(__FILE__, __LINE__);
- ex.proxy = toString();
- throw ex;
- }
- }
- else
+ connection = dynamic_cast<TransportInfoI*>(reverseTransport.get())->getConnection();
+
+ if(!connection)
{
- vector<EndpointPtr> endpts;
- endpts.reserve(connections.size());
- transform(connections.begin(), connections.end(), back_inserter(endpts),
- ::Ice::constMemFun(&Connection::endpoint));
-
- endpts = filterEndpoints(endpts);
-
- if(endpts.empty())
- {
- NoEndpointException ex(__FILE__, __LINE__);
- ex.proxy = toString();
- throw ex;
- }
-
- for(p = connections.begin(); p != connections.end(); ++p)
- {
- if((*p)->endpoint() == endpts.front())
- {
- break;
- }
- }
- assert(p != connections.end());
+ NoEndpointException ex(__FILE__, __LINE__);
+ ex.proxy = toString();
+ throw ex;
}
-
- connection = *p;
+
compress = connection->endpoint()->compress();
}
else
@@ -887,7 +819,6 @@ IceInternal::Reference::Reference(const InstancePtr& inst,
const vector<EndpointPtr>& endpts,
const RouterInfoPtr& rtrInfo,
const LocatorInfoPtr& locInfo,
- const ObjectAdapterPtr& rvAdapter,
const TransportInfoPtr& rvTransport,
bool collocationOpt) :
instance(inst),
@@ -900,7 +831,6 @@ IceInternal::Reference::Reference(const InstancePtr& inst,
endpoints(endpts),
routerInfo(rtrInfo),
locatorInfo(locInfo),
- reverseAdapter(rvAdapter),
reverseTransport(rvTransport),
collocationOptimization(collocationOpt),
hashValue(0)
diff --git a/cpp/src/Ice/Reference.h b/cpp/src/Ice/Reference.h
index 831f7a648d7..11a7a2efd52 100644
--- a/cpp/src/Ice/Reference.h
+++ b/cpp/src/Ice/Reference.h
@@ -19,7 +19,6 @@
#include <Ice/LocatorF.h>
#include <Ice/RouterInfoF.h>
#include <Ice/LocatorInfoF.h>
-#include <Ice/ObjectAdapterF.h>
#include <Ice/TransportInfoF.h>
#include <Ice/ConnectionF.h>
#include <Ice/Identity.h>
@@ -70,7 +69,6 @@ public:
const std::vector<EndpointPtr> endpoints;
const RouterInfoPtr routerInfo; // Null if no router is used.
const LocatorInfoPtr locatorInfo; // Null if no locator is used.
- const Ice::ObjectAdapterPtr reverseAdapter; // For reverse communications using the adapter's incoming connections.
const Ice::TransportInfoPtr reverseTransport; // If not null, use this transport for reverse communications.
const bool collocationOptimization;
const Ice::Int hashValue;
@@ -107,8 +105,7 @@ private:
Reference(const InstancePtr&, const Ice::Identity&, const Ice::Context&, const std::string&, Mode, bool,
const std::string&, const std::vector<EndpointPtr>&,
- const RouterInfoPtr&, const LocatorInfoPtr&, const Ice::ObjectAdapterPtr&, const Ice::TransportInfoPtr&,
- bool);
+ const RouterInfoPtr&, const LocatorInfoPtr&, const Ice::TransportInfoPtr&, bool);
friend class ReferenceFactory;
};
diff --git a/cpp/src/Ice/ReferenceFactory.cpp b/cpp/src/Ice/ReferenceFactory.cpp
index d50672ab0f3..883a0832ba1 100644
--- a/cpp/src/Ice/ReferenceFactory.cpp
+++ b/cpp/src/Ice/ReferenceFactory.cpp
@@ -35,7 +35,6 @@ IceInternal::ReferenceFactory::create(const Identity& ident,
const vector<EndpointPtr>& endpoints,
const RouterInfoPtr& routerInfo,
const LocatorInfoPtr& locatorInfo,
- const ObjectAdapterPtr& reverseAdapter,
const TransportInfoPtr& reverseTransport,
bool collocationOptimization)
{
@@ -55,7 +54,7 @@ IceInternal::ReferenceFactory::create(const Identity& ident,
// Create new reference
//
ReferencePtr ref = new Reference(_instance, ident, context, facet, mode, secure, adapterId,
- endpoints, routerInfo, locatorInfo, reverseAdapter, reverseTransport,
+ endpoints, routerInfo, locatorInfo, reverseTransport,
collocationOptimization);
@@ -455,7 +454,7 @@ IceInternal::ReferenceFactory::create(const string& str)
RouterInfoPtr routerInfo = _instance->routerManager()->get(getDefaultRouter());
LocatorInfoPtr locatorInfo = _instance->locatorManager()->get(getDefaultLocator());
- return create(ident, Context(), facet, mode, secure, adapter, endpoints, routerInfo, locatorInfo, 0, 0, true);
+ return create(ident, Context(), facet, mode, secure, adapter, endpoints, routerInfo, locatorInfo, 0, true);
}
ReferencePtr
@@ -519,7 +518,7 @@ IceInternal::ReferenceFactory::create(const Identity& ident, BasicStream* s)
RouterInfoPtr routerInfo = _instance->routerManager()->get(getDefaultRouter());
LocatorInfoPtr locatorInfo = _instance->locatorManager()->get(getDefaultLocator());
- return create(ident, Context(), facet, mode, secure, adapterId, endpoints, routerInfo, locatorInfo, 0, 0, true);
+ return create(ident, Context(), facet, mode, secure, adapterId, endpoints, routerInfo, locatorInfo, 0, true);
}
void
diff --git a/cpp/src/Ice/ReferenceFactory.h b/cpp/src/Ice/ReferenceFactory.h
index 94b0d5fee32..b49b416ffb9 100644
--- a/cpp/src/Ice/ReferenceFactory.h
+++ b/cpp/src/Ice/ReferenceFactory.h
@@ -25,8 +25,7 @@ public:
ReferencePtr create(const Ice::Identity&, const Ice::Context&, const std::string&,
Reference::Mode, bool, const std::string&, const std::vector<EndpointPtr>&,
- const RouterInfoPtr&, const LocatorInfoPtr&, const Ice::ObjectAdapterPtr&,
- const Ice::TransportInfoPtr&, bool);
+ const RouterInfoPtr&, const LocatorInfoPtr&, const Ice::TransportInfoPtr&, bool);
ReferencePtr create(const std::string&);
ReferencePtr create(const Ice::Identity&, BasicStream*);
diff --git a/cpp/src/Ice/TransportInfoI.cpp b/cpp/src/Ice/TransportInfoI.cpp
index 8b035e94195..1a70ac0a44f 100755
--- a/cpp/src/Ice/TransportInfoI.cpp
+++ b/cpp/src/Ice/TransportInfoI.cpp
@@ -39,3 +39,10 @@ Ice::TransportInfoI::setConnection(const ConnectionPtr& connection)
IceUtil::Mutex::Lock sync(_connectionMutex);
_connection = connection;
}
+
+ConnectionPtr
+Ice::TransportInfoI::getConnection() const
+{
+ IceUtil::Mutex::Lock sync(_connectionMutex);
+ return _connection;
+}
diff --git a/cpp/src/Ice/TransportInfoI.h b/cpp/src/Ice/TransportInfoI.h
index affc9dccf9e..a9dba694372 100644
--- a/cpp/src/Ice/TransportInfoI.h
+++ b/cpp/src/Ice/TransportInfoI.h
@@ -12,6 +12,7 @@
#include <IceUtil/Mutex.h>
#include <Ice/ConnectionF.h>
+#include <Ice/ReferenceF.h>
#include <Ice/TransportInfo.h>
namespace Ice
@@ -29,6 +30,10 @@ private:
friend class IceInternal::Connection;
void setConnection(const IceInternal::ConnectionPtr&);
+ // IceInternal::Reference needs this method.
+ friend class IceInternal::Reference;
+ IceInternal::ConnectionPtr getConnection() const;
+
IceInternal::ConnectionPtr _connection;
IceUtil::Mutex _connectionMutex;
};