summaryrefslogtreecommitdiff
path: root/cpp/src/Ice/ConnectionFactory.cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2015-12-01 17:36:19 +0100
committerJose <jose@zeroc.com>2015-12-01 17:36:19 +0100
commit2029ff368e49fae489b8ec8fc12f7d126b182dfb (patch)
tree6075d652b7851831c39e6f22004d8720864f1a60 /cpp/src/Ice/ConnectionFactory.cpp
parentThe default LMDB map size for IceGrid and IceStorm is now 10MB (Windows) (diff)
downloadice-2029ff368e49fae489b8ec8fc12f7d126b182dfb.tar.bz2
ice-2029ff368e49fae489b8ec8fc12f7d126b182dfb.tar.xz
ice-2029ff368e49fae489b8ec8fc12f7d126b182dfb.zip
C++11 mapping initial commit
Diffstat (limited to 'cpp/src/Ice/ConnectionFactory.cpp')
-rw-r--r--cpp/src/Ice/ConnectionFactory.cpp114
1 files changed, 100 insertions, 14 deletions
diff --git a/cpp/src/Ice/ConnectionFactory.cpp b/cpp/src/Ice/ConnectionFactory.cpp
index 3dbef2a5a6d..6ce8b78d45e 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 Map::mapped_type
+find(const Map& m, const typename Map::key_type& k, function<bool (const typename Map::mapped_type&)> 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,12 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartComplete
}
connection->activate();
+#ifdef ICE_CPP11_MAPPING
+ _factory->finishGetConnection(_connectors, *_iter, connection,
+ dynamic_pointer_cast<ConnectCallback>(shared_from_this()));
+#else
_factory->finishGetConnection(_connectors, *_iter, connection, this);
+#endif
}
void
@@ -845,7 +890,11 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartFailed(c
_factory->handleConnectionException(ex, _hasMore || _iter != _connectors.end() - 1);
if(dynamic_cast<const Ice::CommunicatorDestroyedException*>(&ex)) // No need to continue.
{
+#ifdef ICE_CPP11_MAPPING
+ _factory->finishGetConnection(_connectors, ex, dynamic_pointer_cast<ConnectCallback>(shared_from_this()));
+#else
_factory->finishGetConnection(_connectors, ex, this);
+#endif
}
else if(++_iter != _connectors.end()) // Try the next connector.
{
@@ -853,7 +902,11 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::connectionStartFailed(c
}
else
{
+#ifdef ICE_CPP11_MAPPING
+ _factory->finishGetConnection(_connectors, ex, dynamic_pointer_cast<ConnectCallback>(shared_from_this()));
+#else
_factory->finishGetConnection(_connectors, ex, this);
+#endif
}
}
@@ -936,7 +989,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)
{
@@ -954,7 +1008,14 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::getConnection()
// connection.
//
bool compress;
+#ifdef ICE_CPP11_MAPPING
+ Ice::ConnectionIPtr connection = _factory->getConnection(
+ _connectors,
+ dynamic_pointer_cast<ConnectCallback>(shared_from_this()),
+ compress);
+#else
Ice::ConnectionIPtr connection = _factory->getConnection(_connectors, this, compress);
+#endif
if(!connection)
{
//
@@ -982,7 +1043,6 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::nextConnector()
Ice::ConnectionIPtr connection;
try
{
-
const CommunicatorObserverPtr& obsv = _factory->_instance->initializationData().observer;
if(obsv)
{
@@ -1002,7 +1062,7 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::nextConnector()
<< _iter->connector->toString();
}
connection = _factory->createConnection(_iter->connector->connect(), *_iter);
- connection->start(this);
+ connection->start(ICE_SHARED_FROM_THIS);
}
catch(const Ice::LocalException& ex)
{
@@ -1062,7 +1122,11 @@ IceInternal::OutgoingConnectionFactory::ConnectCallback::removeConnectors(const
void
IceInternal::OutgoingConnectionFactory::ConnectCallback::removeFromPending()
{
+#ifdef ICE_CPP11_MAPPING
+ _factory->removeFromPending(dynamic_pointer_cast<ConnectCallback>(shared_from_this()), _connectors);
+#else
_factory->removeFromPending(this, _connectors);
+#endif
}
bool
@@ -1345,8 +1409,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)
{
@@ -1371,7 +1435,11 @@ IceInternal::IncomingConnectionFactory::message(ThreadPoolCurrent& current)
}
assert(connection);
+#ifdef ICE_CPP11_MAPPING
+ connection->start(dynamic_pointer_cast<IncomingConnectionFactory>(shared_from_this()));
+#else
connection->start(this);
+#endif
}
void
@@ -1545,7 +1613,6 @@ IceInternal::IncomingConnectionFactory::initialize()
{
_endpoint = _endpoint->compress(_instance->defaultsAndOverrides()->overrideCompressValue);
}
-
try
{
const_cast<TransceiverPtr&>(_transceiver) = _endpoint->transceiver();
@@ -1557,9 +1624,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);
}
@@ -1627,7 +1693,12 @@ IceInternal::IncomingConnectionFactory::setState(State state)
Trace out(_instance->initializationData().logger, _instance->traceLevels()->networkCat);
out << "accepting " << _endpoint->protocol() << " connections at " << _acceptor->toString();
}
+#ifdef ICE_CPP11_MAPPING
+ _adapter->getThreadPool()->_register(dynamic_pointer_cast<EventHandler>(shared_from_this()),
+ SocketOperationRead);
+#else
_adapter->getThreadPool()->_register(this, SocketOperationRead);
+#endif
}
for_each(_connections.begin(), _connections.end(), Ice::voidMemFun(&ConnectionI::activate));
break;
@@ -1646,7 +1717,12 @@ IceInternal::IncomingConnectionFactory::setState(State state)
Trace out(_instance->initializationData().logger, _instance->traceLevels()->networkCat);
out << "holding " << _endpoint->protocol() << " connections at " << _acceptor->toString();
}
+#ifdef ICE_CPP11_MAPPING
+ _adapter->getThreadPool()->unregister(dynamic_pointer_cast<EventHandler>(shared_from_this()),
+ SocketOperationRead);
+#else
_adapter->getThreadPool()->unregister(this, SocketOperationRead);
+#endif
}
for_each(_connections.begin(), _connections.end(), Ice::voidMemFun(&ConnectionI::hold));
break;
@@ -1663,7 +1739,11 @@ IceInternal::IncomingConnectionFactory::setState(State state)
// the finish() call. Not all selector implementations do support this
// however.
//
+#ifdef ICE_CPP11_MAPPING
+ if(_adapter->getThreadPool()->finish(dynamic_pointer_cast<EventHandler>(shared_from_this()), true))
+#else
if(_adapter->getThreadPool()->finish(this, true))
+#endif
{
closeAcceptor();
}
@@ -1696,7 +1776,6 @@ IceInternal::IncomingConnectionFactory::createAcceptor()
{
_acceptor = _endpoint->acceptor(_adapter->getName());
assert(_acceptor);
-
if(_instance->traceLevels()->network >= 2)
{
Trace out(_instance->initializationData().logger, _instance->traceLevels()->networkCat);
@@ -1704,18 +1783,25 @@ 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();
}
+#ifdef ICE_CPP11_MAPPING
+ _adapter->getThreadPool()->initialize(dynamic_pointer_cast<EventHandler>(shared_from_this()));
+#else
_adapter->getThreadPool()->initialize(this);
-
+#endif
if(_state == StateActive)
{
+#ifdef ICE_CPP11_MAPPING
+ _adapter->getThreadPool()->_register(dynamic_pointer_cast<EventHandler>(shared_from_this()),
+ SocketOperationRead);
+#else
_adapter->getThreadPool()->_register(this, SocketOperationRead);
+#endif
}
}
catch(const Ice::Exception&)