From 72b90a5bbf7a9308f7172f38be88e29bab58a21b Mon Sep 17 00:00:00 2001 From: german77 Date: Sat, 13 Aug 2022 13:11:01 -0500 Subject: core: network: Address review comments --- src/core/internal_network/socket_proxy.cpp | 46 ++++++++++++++++-------------- 1 file changed, 25 insertions(+), 21 deletions(-) (limited to 'src/core/internal_network/socket_proxy.cpp') diff --git a/src/core/internal_network/socket_proxy.cpp b/src/core/internal_network/socket_proxy.cpp index 216893ba1..7ce22dbfa 100644 --- a/src/core/internal_network/socket_proxy.cpp +++ b/src/core/internal_network/socket_proxy.cpp @@ -14,10 +14,6 @@ namespace Network { ProxySocket::ProxySocket(RoomNetwork& room_network_) noexcept : room_network{room_network_} {} -ProxySocket::ProxySocket(ProxySocket&& rhs) noexcept : room_network{rhs.room_network} { - fd = std::exchange(rhs.fd, INVALID_SOCKET); -} - ProxySocket::~ProxySocket() { if (fd == INVALID_SOCKET) { return; @@ -36,7 +32,6 @@ void ProxySocket::HandleProxyPacket(const ProxyPacket& packet) { template Errno ProxySocket::SetSockOpt(SOCKET fd_, int option, T value) { - socket_options[option] = reinterpret_cast(&value); return Errno::SUCCESS; } @@ -100,27 +95,36 @@ std::pair ProxySocket::RecvFrom(int flags, std::vector& message, ASSERT(flags == 0); ASSERT(message.size() < static_cast(std::numeric_limits::max())); - { - std::lock_guard guard(packets_mutex); - if (received_packets.size() > 0) { - return ReceivePacket(flags, message, addr, message.size()); + const auto timestamp = std::chrono::steady_clock::now(); + + while (true) { + { + std::lock_guard guard(packets_mutex); + if (received_packets.size() > 0) { + return ReceivePacket(flags, message, addr, message.size()); + } } - } - if (blocking) { - if (receive_timeout > 0) { - std::this_thread::sleep_for(std::chrono::milliseconds(receive_timeout)); + if (!blocking) { + return {-1, Errno::AGAIN}; } - } else { - return {-1, Errno::AGAIN}; - } - std::lock_guard guard(packets_mutex); - if (received_packets.size() > 0) { - return ReceivePacket(flags, message, addr, message.size()); - } + // TODO: break if socket connection is lost + + std::this_thread::yield(); + + if (receive_timeout == 0) { + continue; + } - return {-1, Errno::TIMEDOUT}; + const auto time_diff = std::chrono::steady_clock::now() - timestamp; + const auto time_diff_ms = + std::chrono::duration_cast(time_diff).count(); + + if (time_diff_ms > receive_timeout) { + return {-1, Errno::TIMEDOUT}; + } + } } std::pair ProxySocket::ReceivePacket(int flags, std::vector& message, -- cgit v1.2.3