diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/internal_network/network.cpp | 32 | ||||
| -rw-r--r-- | src/core/internal_network/sockets.h | 3 |
2 files changed, 21 insertions, 14 deletions
diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index a983f23ea..7785c1d16 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp | |||
| @@ -693,20 +693,23 @@ std::pair<SocketBase::AcceptResult, Errno> Socket::Accept() { | |||
| 693 | sockaddr_in addr; | 693 | sockaddr_in addr; |
| 694 | socklen_t addrlen = sizeof(addr); | 694 | socklen_t addrlen = sizeof(addr); |
| 695 | 695 | ||
| 696 | std::vector<WSAPOLLFD> host_pollfds{ | 696 | const bool wait_for_accept = !is_non_blocking; |
| 697 | WSAPOLLFD{fd, POLLIN, 0}, | 697 | if (wait_for_accept) { |
| 698 | WSAPOLLFD{GetInterruptSocket(), POLLIN, 0}, | 698 | std::vector<WSAPOLLFD> host_pollfds{ |
| 699 | }; | 699 | WSAPOLLFD{fd, POLLIN, 0}, |
| 700 | 700 | WSAPOLLFD{GetInterruptSocket(), POLLIN, 0}, | |
| 701 | while (true) { | 701 | }; |
| 702 | const int pollres = | 702 | |
| 703 | WSAPoll(host_pollfds.data(), static_cast<ULONG>(host_pollfds.size()), -1); | 703 | while (true) { |
| 704 | if (host_pollfds[1].revents != 0) { | 704 | const int pollres = |
| 705 | // Interrupt signaled before a client could be accepted, break | 705 | WSAPoll(host_pollfds.data(), static_cast<ULONG>(host_pollfds.size()), -1); |
| 706 | return {AcceptResult{}, Errno::AGAIN}; | 706 | if (host_pollfds[1].revents != 0) { |
| 707 | } | 707 | // Interrupt signaled before a client could be accepted, break |
| 708 | if (pollres > 0) { | 708 | return {AcceptResult{}, Errno::AGAIN}; |
| 709 | break; | 709 | } |
| 710 | if (pollres > 0) { | ||
| 711 | break; | ||
| 712 | } | ||
| 710 | } | 713 | } |
| 711 | } | 714 | } |
| 712 | 715 | ||
| @@ -913,6 +916,7 @@ Errno Socket::SetRcvTimeo(u32 value) { | |||
| 913 | 916 | ||
| 914 | Errno Socket::SetNonBlock(bool enable) { | 917 | Errno Socket::SetNonBlock(bool enable) { |
| 915 | if (EnableNonBlock(fd, enable)) { | 918 | if (EnableNonBlock(fd, enable)) { |
| 919 | is_non_blocking = enable; | ||
| 916 | return Errno::SUCCESS; | 920 | return Errno::SUCCESS; |
| 917 | } | 921 | } |
| 918 | return GetAndLogLastError(); | 922 | return GetAndLogLastError(); |
diff --git a/src/core/internal_network/sockets.h b/src/core/internal_network/sockets.h index 4ba51f62c..3a32dff75 100644 --- a/src/core/internal_network/sockets.h +++ b/src/core/internal_network/sockets.h | |||
| @@ -166,6 +166,9 @@ public: | |||
| 166 | bool IsOpened() const override; | 166 | bool IsOpened() const override; |
| 167 | 167 | ||
| 168 | void HandleProxyPacket(const ProxyPacket& packet) override; | 168 | void HandleProxyPacket(const ProxyPacket& packet) override; |
| 169 | |||
| 170 | private: | ||
| 171 | bool is_non_blocking = false; | ||
| 169 | }; | 172 | }; |
| 170 | 173 | ||
| 171 | std::pair<s32, Errno> Poll(std::vector<PollFD>& poll_fds, s32 timeout); | 174 | std::pair<s32, Errno> Poll(std::vector<PollFD>& poll_fds, s32 timeout); |