diff options
Diffstat (limited to 'cpp/src/Ice/ConnectionFactory.cpp')
-rw-r--r-- | cpp/src/Ice/ConnectionFactory.cpp | 87 |
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&) |