bool connection_handler::do_receives() { hpx::util::high_resolution_timer t; hpx::lcos::local::spinlock::scoped_try_lock l(receivers_mtx_); for( receivers_type::iterator it = receivers_.begin(); !stopped_ && enable_parcel_handling_ && it != receivers_.end(); /**/) { boost::system::error_code ec; if((*it)->done(*this, ec)) { if(!ec) { HPX_IBVERBS_RESET_EC(ec) (*it)->async_read(ec); } } if(ec == boost::asio::error::eof || ec == boost::asio::error::operation_aborted) { it = receivers_.erase(it); continue; } ++it; } time_recv += t.elapsed(); return !receivers_.empty(); }
void close(boost::system::error_code &ec) { if(!event_channel_) { HPX_IBVERBS_RESET_EC(ec); return; } if(event_channel_) { rdma_destroy_event_channel(event_channel_); event_channel_ = 0; } else { HPX_IBVERBS_THROWS_IF(ec, boost::asio::error::not_connected); } if(listener_) { rdma_destroy_id(listener_); listener_ = 0; } HPX_IBVERBS_RESET_EC(ec); }
void bind( boost::asio::ip::tcp::endpoint const & ep , boost::system::error_code &ec) { if(event_channel_) { HPX_IBVERBS_THROWS_IF(ec, boost::asio::error::already_connected); } else { event_channel_ = rdma_create_event_channel(); if(!event_channel_) { int verrno = errno; close(ec); boost::system::error_code err(verrno, boost::system::system_category()); HPX_IBVERBS_THROWS_IF( ec , err ); return; } set_nonblocking(event_channel_->fd, ec); if(ec) { close(ec); return; } int ret = 0; ret = rdma_create_id(event_channel_, &listener_, NULL, RDMA_PS_TCP); if(ret) { int verrno = errno; close(ec); boost::system::error_code err(verrno, boost::system::system_category()); HPX_IBVERBS_THROWS_IF( ec , err ); return; } std::string host = ep.address().to_string(); std::string port = boost::lexical_cast<std::string>(ep.port()); addrinfo *addr; getaddrinfo(host.c_str(), port.c_str(), NULL, &addr); ret = rdma_bind_addr(listener_, addr->ai_addr); freeaddrinfo(addr); if(ret) { int verrno = errno; close(ec); boost::system::error_code err(verrno, boost::system::system_category()); HPX_IBVERBS_THROWS_IF( ec , err ); return; } ret = rdma_listen(listener_, 10); /* backlog = 10 is arbitrary */ if(ret) { int verrno = errno; close(ec); boost::system::error_code err(verrno, boost::system::system_category()); HPX_IBVERBS_THROWS_IF( ec , err ); return; } HPX_IBVERBS_RESET_EC(ec); } }