void AsyncSecureStream::connect(const asio::ip::tcp::resolver::iterator endpoints, ConnectHandler&& connectHandler) { // Stash the connectHandler as we won't be able to call it until we re-enter the state // machine. _userHandler = std::move(connectHandler); asio::async_connect(_stream.lowest_layer(), std::move(endpoints), [this](std::error_code ec, asio::ip::tcp::resolver::iterator iter) { if (ec) { return _userHandler(ec); } return _handleConnect(ec, std::move(iter)); }); }
//---------------------------------------------------------------------- // receiver thread functions //---------------------------------------------------------------------- void LocalNode::_runReceiverThread() { EQ_TS_THREAD( _rcvThread ); int nErrors = 0; while( _state == STATE_LISTENING ) { const ConnectionSet::Event result = _incoming.select(); switch( result ) { case ConnectionSet::EVENT_CONNECT: _handleConnect(); break; case ConnectionSet::EVENT_DATA: _handleData(); break; case ConnectionSet::EVENT_DISCONNECT: case ConnectionSet::EVENT_INVALID_HANDLE: _handleDisconnect(); break; case ConnectionSet::EVENT_TIMEOUT: EQINFO << "select timeout" << std::endl; break; case ConnectionSet::EVENT_ERROR: ++nErrors; EQWARN << "Connection error during select" << std::endl; if( nErrors > 100 ) { EQWARN << "Too many errors in a row, capping connection" << std::endl; _handleDisconnect(); } break; case ConnectionSet::EVENT_SELECT_ERROR: EQWARN << "Error during select" << std::endl; ++nErrors; if( nErrors > 10 ) { EQWARN << "Too many errors in a row" << std::endl; EQUNIMPLEMENTED; } break; case ConnectionSet::EVENT_INTERRUPT: _redispatchCommands(); break; default: EQUNIMPLEMENTED; } if( result != ConnectionSet::EVENT_ERROR && result != ConnectionSet::EVENT_SELECT_ERROR ) nErrors = 0; } if( !_pendingCommands.empty( )) EQWARN << _pendingCommands.size() << " commands pending while leaving command thread" << std::endl; for( CommandList::const_iterator i = _pendingCommands.begin(); i != _pendingCommands.end(); ++i ) { Command* command = *i; command->release(); } EQCHECK( _commandThread->join( )); _objectStore->clear(); _pendingCommands.clear(); _commandCache.flush(); EQINFO << "Leaving receiver thread of " << base::className( this ) << std::endl; }