summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ObjectAdapterI.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Ice/ObjectAdapterI.cpp')
-rw-r--r--cpp/src/Ice/ObjectAdapterI.cpp209
1 files changed, 158 insertions, 51 deletions
diff --git a/cpp/src/Ice/ObjectAdapterI.cpp b/cpp/src/Ice/ObjectAdapterI.cpp
index fc9ee4cc462..5de6bf0acaa 100644
--- a/cpp/src/Ice/ObjectAdapterI.cpp
+++ b/cpp/src/Ice/ObjectAdapterI.cpp
@@ -7,8 +7,9 @@
//
// **********************************************************************
-#include <IceUtil/UUID.h>
+#include <Ice/UUID.h>
#include <Ice/ObjectAdapterI.h>
+#include <Ice/CommunicatorI.h>
#include <Ice/ObjectAdapterFactory.h>
#include <Ice/Instance.h>
#include <Ice/Proxy.h>
@@ -31,6 +32,7 @@
#include <Ice/DefaultsAndOverrides.h>
#include <Ice/TraceLevels.h>
#include <Ice/PropertyNames.h>
+#include <Ice/ConsoleUtil.h>
#ifdef _WIN32
# include <sys/timeb.h>
@@ -61,6 +63,12 @@ inline void checkServant(const ObjectPtr& servant)
throw IllegalServantException(__FILE__, __LINE__, "cannot add null servant to Object Adapter");
}
}
+
+inline EndpointIPtr toEndpointI(const EndpointPtr& endp)
+{
+ return ICE_DYNAMIC_CAST(EndpointI, endp);
+}
+
}
string
@@ -95,8 +103,16 @@ Ice::ObjectAdapterI::activate()
//
if(_state != StateUninitialized)
{
+#ifdef ICE_CPP11_MAPPING
+ for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
+ [](const IncomingConnectionFactoryPtr& factory)
+ {
+ factory->activate();
+ });
+#else
for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
Ice::voidMemFun(&IncomingConnectionFactory::activate));
+#endif
return;
}
@@ -141,16 +157,23 @@ Ice::ObjectAdapterI::activate()
if(printAdapterReady)
{
- cout << _name << " ready" << endl;
+ consoleOut << _name << " ready" << endl;
}
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
assert(_state == StateActivating);
+#ifdef ICE_CPP11_MAPPING
+ for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
+ [](const IncomingConnectionFactoryPtr& factory)
+ {
+ factory->activate();
+ });
+#else
for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
Ice::voidMemFun(&IncomingConnectionFactory::activate));
-
+#endif
_state = StateActive;
notifyAll();
}
@@ -164,8 +187,16 @@ Ice::ObjectAdapterI::hold()
checkForDeactivation();
_state = StateHeld;
+#ifdef ICE_CPP11_MAPPING
+ for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
+ [](const IncomingConnectionFactoryPtr& factory)
+ {
+ factory->hold();
+ });
+#else
for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
Ice::voidMemFun(&IncomingConnectionFactory::hold));
+#endif
}
void
@@ -180,8 +211,16 @@ Ice::ObjectAdapterI::waitForHold()
incomingConnectionFactories = _incomingConnectionFactories;
}
+#ifdef ICE_CPP11_MAPPING
+ for_each(incomingConnectionFactories.begin(), incomingConnectionFactories.end(),
+ [](const IncomingConnectionFactoryPtr& factory)
+ {
+ factory->waitUntilHolding();
+ });
+#else
for_each(incomingConnectionFactories.begin(), incomingConnectionFactories.end(),
Ice::constVoidMemFun(&IncomingConnectionFactory::waitUntilHolding));
+#endif
}
void
@@ -240,15 +279,23 @@ Ice::ObjectAdapterI::deactivate()
// Connection::destroy() might block when sending a CloseConnection
// message.
//
+#ifdef ICE_CPP11_MAPPING
+ for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
+ [](const IncomingConnectionFactoryPtr& factory)
+ {
+ factory->destroy();
+ });
+#else
for_each(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
Ice::voidMemFun(&IncomingConnectionFactory::destroy));
+#endif
//
// Must be called outside the thread synchronization, because
// changing the object adapter might block if there are still
// requests being dispatched.
//
- _instance->outgoingConnectionFactory()->removeAdapter(this);
+ _instance->outgoingConnectionFactory()->removeAdapter(ICE_SHARED_FROM_THIS);
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
@@ -285,8 +332,16 @@ Ice::ObjectAdapterI::waitForDeactivate()
// Now we wait until all incoming connection factories are
// finished.
//
+#ifdef ICE_CPP11_MAPPING
+ for_each(incomingConnectionFactories.begin(), incomingConnectionFactories.end(),
+ [](const IncomingConnectionFactoryPtr& factory)
+ {
+ factory->waitUntilFinished();
+ });
+#else
for_each(incomingConnectionFactories.begin(), incomingConnectionFactories.end(),
Ice::voidMemFun(&IncomingConnectionFactory::waitUntilFinished));
+#endif
}
bool
@@ -298,7 +353,7 @@ Ice::ObjectAdapterI::isDeactivated() const
}
void
-Ice::ObjectAdapterI::destroy()
+Ice::ObjectAdapterI::destroy() ICE_NOEXCEPT
{
//
// Deactivate and wait for completion.
@@ -343,7 +398,7 @@ Ice::ObjectAdapterI::destroy()
if(_objectAdapterFactory)
{
- _objectAdapterFactory->removeObjectAdapter(this);
+ _objectAdapterFactory->removeObjectAdapter(ICE_SHARED_FROM_THIS);
}
{
@@ -372,13 +427,13 @@ Ice::ObjectAdapterI::destroy()
}
}
-ObjectPrx
+ObjectPrxPtr
Ice::ObjectAdapterI::add(const ObjectPtr& object, const Identity& ident)
{
return addFacet(object, ident, "");
}
-ObjectPrx
+ObjectPrxPtr
Ice::ObjectAdapterI::addFacet(const ObjectPtr& object, const Identity& ident, const string& facet)
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
@@ -392,17 +447,17 @@ Ice::ObjectAdapterI::addFacet(const ObjectPtr& object, const Identity& ident, co
return newProxy(ident, facet);
}
-ObjectPrx
+ObjectPrxPtr
Ice::ObjectAdapterI::addWithUUID(const ObjectPtr& object)
{
return addFacetWithUUID(object, "");
}
-ObjectPrx
+ObjectPrxPtr
Ice::ObjectAdapterI::addFacetWithUUID(const ObjectPtr& object, const string& facet)
{
Identity ident;
- ident.name = IceUtil::generateUUID();
+ ident.name = Ice::generateUUID();
return addFacet(object, ident, facet);
}
@@ -484,13 +539,13 @@ Ice::ObjectAdapterI::findAllFacets(const Identity& ident) const
}
ObjectPtr
-Ice::ObjectAdapterI::findByProxy(const ObjectPrx& proxy) const
+Ice::ObjectAdapterI::findByProxy(const ObjectPrxPtr& proxy) const
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
checkForDeactivation();
- ReferencePtr ref = proxy->__reference();
+ ReferencePtr ref = proxy->_getReference();
return findFacet(ref->getIdentity(), ref->getFacet());
}
@@ -534,7 +589,7 @@ Ice::ObjectAdapterI::findServantLocator(const string& prefix) const
return _servantManager->findServantLocator(prefix);
}
-ObjectPrx
+ObjectPrxPtr
Ice::ObjectAdapterI::createProxy(const Identity& ident) const
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
@@ -545,7 +600,7 @@ Ice::ObjectAdapterI::createProxy(const Identity& ident) const
return newProxy(ident, "");
}
-ObjectPrx
+ObjectPrxPtr
Ice::ObjectAdapterI::createDirectProxy(const Identity& ident) const
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
@@ -556,7 +611,7 @@ Ice::ObjectAdapterI::createDirectProxy(const Identity& ident) const
return newDirectProxy(ident, "");
}
-ObjectPrx
+ObjectPrxPtr
Ice::ObjectAdapterI::createIndirectProxy(const Identity& ident) const
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
@@ -568,7 +623,7 @@ Ice::ObjectAdapterI::createIndirectProxy(const Identity& ident) const
}
void
-Ice::ObjectAdapterI::setLocator(const LocatorPrx& locator)
+Ice::ObjectAdapterI::setLocator(const LocatorPrxPtr& locator)
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
@@ -577,7 +632,7 @@ Ice::ObjectAdapterI::setLocator(const LocatorPrx& locator)
_locatorInfo = _instance->locatorManager()->get(locator);
}
-LocatorPrx
+LocatorPrxPtr
Ice::ObjectAdapterI::getLocator() const
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
@@ -592,6 +647,24 @@ Ice::ObjectAdapterI::getLocator() const
}
}
+EndpointSeq
+Ice::ObjectAdapterI::getEndpoints() const
+{
+ IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
+
+ EndpointSeq endpoints;
+ transform(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
+ back_inserter(endpoints),
+#ifdef ICE_CPP11_MAPPING
+ [](const IncomingConnectionFactoryPtr& factory)
+ {
+ return factory->endpoint();
+ });
+#else
+ Ice::constMemFun(&IncomingConnectionFactory::endpoint));
+#endif
+ return endpoints;
+}
void
Ice::ObjectAdapterI::refreshPublishedEndpoints()
@@ -601,7 +674,6 @@ Ice::ObjectAdapterI::refreshPublishedEndpoints()
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
-
checkForDeactivation();
oldPublishedEndpoints = _publishedEndpoints;
@@ -629,35 +701,60 @@ Ice::ObjectAdapterI::refreshPublishedEndpoints()
}
EndpointSeq
-Ice::ObjectAdapterI::getEndpoints() const
+Ice::ObjectAdapterI::getPublishedEndpoints() const
{
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
EndpointSeq endpoints;
- transform(_incomingConnectionFactories.begin(), _incomingConnectionFactories.end(),
- back_inserter(endpoints), Ice::constMemFun(&IncomingConnectionFactory::endpoint));
+ copy(_publishedEndpoints.begin(), _publishedEndpoints.end(), back_inserter(endpoints));
return endpoints;
}
-EndpointSeq
-Ice::ObjectAdapterI::getPublishedEndpoints() const
+void
+Ice::ObjectAdapterI::setPublishedEndpoints(const EndpointSeq& newEndpoints)
{
- IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
+ vector<EndpointIPtr> newPublishedEndpoints;
+ transform(newEndpoints.begin(), newEndpoints.end(), back_inserter(newPublishedEndpoints), toEndpointI);
- EndpointSeq endpoints;
- copy(_publishedEndpoints.begin(), _publishedEndpoints.end(), back_inserter(endpoints));
- return endpoints;
+ LocatorInfoPtr locatorInfo;
+ vector<EndpointIPtr> oldPublishedEndpoints;
+ {
+ IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
+ checkForDeactivation();
+
+ oldPublishedEndpoints = _publishedEndpoints;
+ _publishedEndpoints = newPublishedEndpoints;
+
+ locatorInfo = _locatorInfo;
+ }
+
+ try
+ {
+ Ice::Identity dummy;
+ dummy.name = "dummy";
+ updateLocatorRegistry(locatorInfo, createDirectProxy(dummy));
+ }
+ catch(const Ice::LocalException&)
+ {
+ IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
+
+ //
+ // Restore the old published endpoints.
+ //
+ _publishedEndpoints = oldPublishedEndpoints;
+ throw;
+ }
}
bool
-Ice::ObjectAdapterI::isLocal(const ObjectPrx& proxy) const
+Ice::ObjectAdapterI::isLocal(const ObjectPrxPtr& proxy) const
{
//
// NOTE: it's important that isLocal() doesn't perform any blocking operations as
// it can be called for AMI invocations if the proxy has no delegate set yet.
//
- ReferencePtr ref = proxy->__reference();
+ ReferencePtr ref = proxy->_getReference();
if(ref->isWellKnown())
{
//
@@ -730,7 +827,7 @@ Ice::ObjectAdapterI::isLocal(const ObjectPrx& proxy) const
}
void
-Ice::ObjectAdapterI::flushAsyncBatchRequests(const CommunicatorFlushBatchAsyncPtr& outAsync)
+Ice::ObjectAdapterI::flushAsyncBatchRequests(const CommunicatorFlushBatchAsyncPtr& outAsync, CompressBatch compress)
{
vector<IncomingConnectionFactoryPtr> f;
{
@@ -740,7 +837,7 @@ Ice::ObjectAdapterI::flushAsyncBatchRequests(const CommunicatorFlushBatchAsyncPt
for(vector<IncomingConnectionFactoryPtr>::const_iterator p = f.begin(); p != f.end(); ++p)
{
- (*p)->flushAsyncBatchRequests(outAsync);
+ (*p)->flushAsyncBatchRequests(outAsync, compress);
}
}
@@ -752,7 +849,15 @@ Ice::ObjectAdapterI::updateConnectionObservers()
IceUtil::Monitor<IceUtil::RecMutex>::Lock sync(*this);
f = _incomingConnectionFactories;
}
+#ifdef ICE_CPP11_MAPPING
+ for_each(f.begin(), f.end(),
+ [](const IncomingConnectionFactoryPtr& factory)
+ {
+ factory->updateConnectionObservers();
+ });
+#else
for_each(f.begin(), f.end(), Ice::voidMemFun(&IncomingConnectionFactory::updateConnectionObservers));
+#endif
}
void
@@ -842,7 +947,7 @@ Ice::ObjectAdapterI::getACM() const
//
Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const CommunicatorPtr& communicator,
const ObjectAdapterFactoryPtr& objectAdapterFactory, const string& name,
- /*const RouterPrx& router,*/ bool noConfig) :
+ /*const RouterPrxPtr& router,*/ bool noConfig) :
_state(StateUninitialized),
_instance(instance),
_communicator(communicator),
@@ -856,7 +961,7 @@ Ice::ObjectAdapterI::ObjectAdapterI(const InstancePtr& instance, const Communica
}
void
-Ice::ObjectAdapterI::initialize(const RouterPrx& router)
+Ice::ObjectAdapterI::initialize(const RouterPrxPtr& router)
{
if(_noConfig)
{
@@ -944,8 +1049,8 @@ Ice::ObjectAdapterI::initialize(const RouterPrx& router)
if(!router)
{
- const_cast<RouterPrx&>(router) = RouterPrx::uncheckedCast(
- _instance->proxyFactory()->propertyToProxy(_name + ".Router"));
+ const_cast<RouterPrxPtr&>(router) = ICE_UNCHECKED_CAST(RouterPrx,
+ _instance->proxyFactory()->propertyToProxy(_name + ".Router"));
}
if(router)
{
@@ -957,8 +1062,9 @@ Ice::ObjectAdapterI::initialize(const RouterPrx& router)
//
if(_routerInfo->getAdapter())
{
- throw AlreadyRegisteredException(__FILE__, __LINE__, "object adapter with router",
- _instance->identityToString(router->ice_getIdentity()));
+ throw AlreadyRegisteredException(__FILE__, __LINE__,
+ "object adapter with router",
+ _communicator->identityToString(router->ice_getIdentity()));
}
//
@@ -976,7 +1082,7 @@ Ice::ObjectAdapterI::initialize(const RouterPrx& router)
// new outgoing connections to the router's client proxy will
// use this object adapter for callbacks.
//
- _routerInfo->setAdapter(this);
+ _routerInfo->setAdapter(ICE_SHARED_FROM_THIS);
//
// Also modify all existing outgoing connections to the
@@ -996,7 +1102,7 @@ Ice::ObjectAdapterI::initialize(const RouterPrx& router)
vector<EndpointIPtr> endpoints = parseEndpoints(properties->getProperty(_name + ".Endpoints"), true);
for(vector<EndpointIPtr>::iterator p = endpoints.begin(); p != endpoints.end(); ++p)
{
- IncomingConnectionFactoryPtr factory = new IncomingConnectionFactory(_instance, *p, this);
+ IncomingConnectionFactoryPtr factory = ICE_MAKE_SHARED(IncomingConnectionFactory, _instance, *p, ICE_SHARED_FROM_THIS);
factory->initialize();
_incomingConnectionFactories.push_back(factory);
}
@@ -1019,7 +1125,7 @@ Ice::ObjectAdapterI::initialize(const RouterPrx& router)
if(!properties->getProperty(_name + ".Locator").empty())
{
- setLocator(LocatorPrx::uncheckedCast(_instance->proxyFactory()->propertyToProxy(_name + ".Locator")));
+ setLocator(ICE_UNCHECKED_CAST(LocatorPrx, _instance->proxyFactory()->propertyToProxy(_name + ".Locator")));
}
else
{
@@ -1054,7 +1160,7 @@ Ice::ObjectAdapterI::~ObjectAdapterI()
}
}
-ObjectPrx
+ObjectPrxPtr
Ice::ObjectAdapterI::newProxy(const Identity& ident, const string& facet) const
{
if(_id.empty())
@@ -1071,7 +1177,7 @@ Ice::ObjectAdapterI::newProxy(const Identity& ident, const string& facet) const
}
}
-ObjectPrx
+ObjectPrxPtr
Ice::ObjectAdapterI::newDirectProxy(const Identity& ident, const string& facet) const
{
vector<EndpointIPtr> endpoints = _publishedEndpoints;
@@ -1090,7 +1196,7 @@ Ice::ObjectAdapterI::newDirectProxy(const Identity& ident, const string& facet)
return _instance->proxyFactory()->referenceToProxy(ref);
}
-ObjectPrx
+ObjectPrxPtr
Ice::ObjectAdapterI::newIndirectProxy(const Identity& ident, const string& facet, const string& id) const
{
//
@@ -1129,6 +1235,10 @@ Ice::ObjectAdapterI::parseEndpoints(const string& endpts, bool oaEndpoints) cons
beg = endpts.find_first_not_of(delim, end);
if(beg == string::npos)
{
+ if(!endpoints.empty())
+ {
+ throw EndpointParseException(__FILE__, __LINE__, "invalid empty object adapter endpoint");
+ }
break;
}
@@ -1177,17 +1287,14 @@ Ice::ObjectAdapterI::parseEndpoints(const string& endpts, bool oaEndpoints) cons
if(end == beg)
{
- ++end;
- continue;
+ throw EndpointParseException(__FILE__, __LINE__, "invalid empty object adapter endpoint");
}
string s = endpts.substr(beg, end - beg);
EndpointIPtr endp = _instance->endpointFactoryManager()->create(s, oaEndpoints);
if(endp == 0)
{
- EndpointParseException ex(__FILE__, __LINE__);
- ex.str = "invalid object adapter endpoint `" + s + "'";
- throw ex;
+ throw EndpointParseException(__FILE__, __LINE__, "invalid object adapter endpoint `" + s + "'");
}
endpoints.push_back(endp);
@@ -1238,14 +1345,14 @@ ObjectAdapterI::parsePublishedEndpoints()
}
void
-ObjectAdapterI::updateLocatorRegistry(const IceInternal::LocatorInfoPtr& locatorInfo, const Ice::ObjectPrx& proxy)
+ObjectAdapterI::updateLocatorRegistry(const IceInternal::LocatorInfoPtr& locatorInfo, const Ice::ObjectPrxPtr& proxy)
{
if(_id.empty() || !locatorInfo)
{
return; // Nothing to update.
}
- LocatorRegistryPrx locatorRegistry = locatorInfo->getLocatorRegistry();
+ LocatorRegistryPrxPtr locatorRegistry = locatorInfo->getLocatorRegistry();
if(!locatorRegistry)
{
return;