summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/internal_network/network.cpp32
-rw-r--r--src/core/internal_network/sockets.h3
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
914Errno Socket::SetNonBlock(bool enable) { 917Errno 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
170private:
171 bool is_non_blocking = false;
169}; 172};
170 173
171std::pair<s32, Errno> Poll(std::vector<PollFD>& poll_fds, s32 timeout); 174std::pair<s32, Errno> Poll(std::vector<PollFD>& poll_fds, s32 timeout);