summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ConnectionFactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/Ice/ConnectionFactory.cpp')
-rw-r--r--cpp/src/Ice/ConnectionFactory.cpp87
1 files changed, 61 insertions, 26 deletions
diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp
index f9f329b3c41..43dc7f670ce 100644
--- a/cpp/src/Ice/ConnectionFactory.cpp
+++ b/cpp/src/Ice/ConnectionFactory.cpp
@@ -44,7 +44,10 @@ using namespace Ice::Instrumentation;
using namespace IceInternal;
IceUtil::Shared* IceInternal::upCast(OutgoingConnectionFactory* p) { return p; }
+
+#ifndef ICE_CPP11_MAPPING
IceUtil::Shared* IceInternal::upCast(IncomingConnectionFactory* p) { return p; }
+#endif
namespace
{
@@ -57,6 +60,38 @@ struct RandomNumberGenerator : public std::unary_function<ptrdiff_t, ptrdiff_t>
}
};
+#ifdef ICE_CPP11_MAPPING
+template <typename Map> void
+remove(Map& m, const typename Map::key_type& k, const typename Map::mapped_type& v)
+{
+ auto pr = m.equal_range(k);
+ assert(pr.first != pr.second);
+ for(auto q = pr.first; q != pr.second; ++q)
+ {
+ if(q->second.get() == v.get())
+ {
+ m.erase(q);
+ return;
+ }
+ }
+ assert(false); // Nothing was removed which is an error.
+}
+
+template<typename Map, typename Predicate> typename Map::mapped_type
+find(const Map& m, const typename Map::key_type& k, Predicate predicate)
+{
+ auto pr = m.equal_range(k);
+ for(auto q = pr.first; q != pr.second; ++q)
+ {
+ if(predicate(q->second))
+ {
+ return q->second;
+ }
+ }
+ return nullptr;
+}
+
+#else
template <typename K, typename V> void
remove(multimap<K, V>& m, K k, V v)
{
@@ -89,6 +124,7 @@ find(const multimap<K,::IceInternal::Handle<V> >& m,
}
return IceInternal::Handle<V>();
}
+#endif
}
@@ -198,7 +234,11 @@ IceInternal::OutgoingConnectionFactory::create(const vector<EndpointIPtr>& endpt
return;
}
+#ifdef ICE_CPP11_MAPPING
+ auto cb = make_shared<ConnectCallback>(_instance, this, endpoints, hasMore, callback, selType);
+#else
ConnectCallbackPtr cb = new ConnectCallback(_instance, this, endpoints, hasMore, callback, selType);
+#endif
cb->getConnectors();
}
@@ -545,8 +585,8 @@ IceInternal::OutgoingConnectionFactory::createConnection(const TransceiverPtr& t
throw Ice::CommunicatorDestroyedException(__FILE__, __LINE__);
}
- connection = new ConnectionI(_communicator, _instance, _monitor, transceiver, ci.connector,
- ci.endpoint->compress(false), 0);
+ connection = ConnectionI::create(_communicator, _instance, _monitor, transceiver, ci.connector,
+ ci.endpoint->compress(false), ICE_NULLPTR);
}
catch(const Ice::LocalException&)
{
@@ -827,7 +867,7 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartComplete
}
connection->activate();
- _factory->finishGetConnection(_connectors, *_iter, connection, this);
+ _factory->finishGetConnection(_connectors, *_iter, connection, shared_from_this());
}
void
@@ -920,7 +960,8 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::nextEndpoint()
try
{
assert(_endpointsIter != _endpoints.end());
- (*_endpointsIter)->connectors_async(_selType, this);
+ (*_endpointsIter)->connectors_async(_selType, ICE_SHARED_FROM_THIS);
+
}
catch(const Ice::LocalException& ex)
{
@@ -938,7 +979,7 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::getConnection()
// connection.
//
bool compress;
- Ice::ConnectionIPtr connection = _factory->getConnection(_connectors, this, compress);
+ Ice::ConnectionIPtr connection = _factory->getConnection(_connectors, shared_from_this(), compress);
if(!connection)
{
//
@@ -986,7 +1027,7 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::nextConnector()
<< _iter->connector->toString();
}
Ice::ConnectionIPtr connection = _factory->createConnection(_iter->connector->connect(), *_iter);
- connection->start(this);
+ connection->start(ICE_SHARED_FROM_THIS);
}
catch(const Ice::LocalException& ex)
{
@@ -1052,7 +1093,7 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::removeConnectors(const
void
IceInternal::OutgoingConnectionFactory::ConnectCallback::removeFromPending()
{
- _factory->removeFromPending(this, _connectors);
+ _factory->removeFromPending(shared_from_this(), _connectors);
}
bool
@@ -1066,14 +1107,14 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartFailedIm
{
if(_observer)
{
- _observer->failed(ex.ice_name());
+ _observer->failed(ex.ice_id());
_observer->detach();
}
_factory->handleConnectionException(ex, _hasMore || _iter != _connectors.end() - 1);
if(dynamic_cast<const Ice::CommunicatorDestroyedException*>(&ex)) // No need to continue.
{
- _factory->finishGetConnection(_connectors, ex, this);
+ _factory->finishGetConnection(_connectors, ex, ICE_SHARED_FROM_THIS);
}
else if(++_iter != _connectors.end()) // Try the next connector.
{
@@ -1081,7 +1122,7 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartFailedIm
}
else
{
- _factory->finishGetConnection(_connectors, ex, this);
+ _factory->finishGetConnection(_connectors, ex, ICE_SHARED_FROM_THIS);
}
return false;
}
@@ -1360,8 +1401,8 @@ IceInternal::IncomingConnectionFactory::message(ThreadPoolCurrent& current)
try
{
- connection = new ConnectionI(_adapter->getCommunicator(), _instance, _monitor, transceiver, 0, _endpoint,
- _adapter);
+ connection = ConnectionI::create(_adapter->getCommunicator(), _instance, _monitor, transceiver, 0,
+ _endpoint, _adapter);
}
catch(const LocalException& ex)
{
@@ -1386,7 +1427,7 @@ IceInternal::IncomingConnectionFactory::message(ThreadPoolCurrent& current)
}
assert(connection);
- connection->start(this);
+ connection->start(shared_from_this());
}
void
@@ -1428,7 +1469,6 @@ string
IceInternal::IncomingConnectionFactory::toString() const
{
IceUtil::Monitor<IceUtil::Mutex>::Lock sync(*this);
-
if(_transceiver)
{
return _transceiver->toString();
@@ -1561,7 +1601,6 @@ IceInternal::IncomingConnectionFactory::initialize()
{
_endpoint = _endpoint->compress(_instance->defaultsAndOverrides()->overrideCompressValue);
}
-
try
{
const_cast<TransceiverPtr&>(_transceiver) = _endpoint->transceiver();
@@ -1573,9 +1612,8 @@ IceInternal::IncomingConnectionFactory::initialize()
out << "attempting to bind to " << _endpoint->protocol() << " socket\n" << _transceiver->toString();
}
const_cast<EndpointIPtr&>(_endpoint) = _transceiver->bind();
-
- ConnectionIPtr connection = new ConnectionI(_adapter->getCommunicator(), _instance, 0, _transceiver, 0,
- _endpoint, _adapter);
+ ConnectionIPtr connection(ConnectionI::create(_adapter->getCommunicator(), _instance, 0, _transceiver, 0,
+ _endpoint, _adapter));
connection->start(0);
_connections.insert(connection);
}
@@ -1643,7 +1681,7 @@ IceInternal::IncomingConnectionFactory::setState(State state)
Trace out(_instance->initializationData().logger, _instance->traceLevels()->networkCat);
out << "accepting " << _endpoint->protocol() << " connections at " << _acceptor->toString();
}
- _adapter->getThreadPool()->_register(this, SocketOperationRead);
+ _adapter->getThreadPool()->_register(shared_from_this(), SocketOperationRead);
}
for_each(_connections.begin(), _connections.end(), Ice::voidMemFun(&ConnectionI::activate));
break;
@@ -1662,7 +1700,7 @@ IceInternal::IncomingConnectionFactory::setState(State state)
Trace out(_instance->initializationData().logger, _instance->traceLevels()->networkCat);
out << "holding " << _endpoint->protocol() << " connections at " << _acceptor->toString();
}
- _adapter->getThreadPool()->unregister(this, SocketOperationRead);
+ _adapter->getThreadPool()->unregister(shared_from_this(), SocketOperationRead);
}
for_each(_connections.begin(), _connections.end(), Ice::voidMemFun(&ConnectionI::hold));
break;
@@ -1679,7 +1717,7 @@ IceInternal::IncomingConnectionFactory::setState(State state)
// the finish() call. Not all selector implementations do support this
// however.
//
- if(_adapter->getThreadPool()->finish(this, true))
+ if(_adapter->getThreadPool()->finish(shared_from_this(), true))
{
closeAcceptor();
}
@@ -1712,7 +1750,6 @@ IceInternal::IncomingConnectionFactory::createAcceptor()
{
_acceptor = _endpoint->acceptor(_adapter->getName());
assert(_acceptor);
-
if(_instance->traceLevels()->network >= 2)
{
Trace out(_instance->initializationData().logger, _instance->traceLevels()->networkCat);
@@ -1720,18 +1757,16 @@ IceInternal::IncomingConnectionFactory::createAcceptor()
}
_endpoint = _acceptor->listen();
-
if(_instance->traceLevels()->network >= 1)
{
Trace out(_instance->initializationData().logger, _instance->traceLevels()->networkCat);
out << "listening for " << _endpoint->protocol() << " connections\n" << _acceptor->toDetailedString();
}
- _adapter->getThreadPool()->initialize(this);
-
+ _adapter->getThreadPool()->initialize(shared_from_this());
if(_state == StateActive)
{
- _adapter->getThreadPool()->_register(this, SocketOperationRead);
+ _adapter->getThreadPool()->_register(shared_from_this(), SocketOperationRead);
}
}
catch(const Ice::Exception&)