Ver Fonte

Merge pull request #12858 from liamwhite/non-blocking

internal_network: only poll for accept on blocking sockets
Narr the Reg há 2 anos atrás
pai
commit
12e5293c73
2 ficheiros alterados com 21 adições e 14 exclusões
  1. 18 14
      src/core/internal_network/network.cpp
  2. 3 0
      src/core/internal_network/sockets.h

+ 18 - 14
src/core/internal_network/network.cpp

@@ -693,20 +693,23 @@ std::pair<SocketBase::AcceptResult, Errno> Socket::Accept() {
     sockaddr_in addr;
     socklen_t addrlen = sizeof(addr);
 
-    std::vector<WSAPOLLFD> host_pollfds{
-        WSAPOLLFD{fd, POLLIN, 0},
-        WSAPOLLFD{GetInterruptSocket(), POLLIN, 0},
-    };
-
-    while (true) {
-        const int pollres =
-            WSAPoll(host_pollfds.data(), static_cast<ULONG>(host_pollfds.size()), -1);
-        if (host_pollfds[1].revents != 0) {
-            // Interrupt signaled before a client could be accepted, break
-            return {AcceptResult{}, Errno::AGAIN};
-        }
-        if (pollres > 0) {
-            break;
+    const bool wait_for_accept = !is_non_blocking;
+    if (wait_for_accept) {
+        std::vector<WSAPOLLFD> host_pollfds{
+            WSAPOLLFD{fd, POLLIN, 0},
+            WSAPOLLFD{GetInterruptSocket(), POLLIN, 0},
+        };
+
+        while (true) {
+            const int pollres =
+                WSAPoll(host_pollfds.data(), static_cast<ULONG>(host_pollfds.size()), -1);
+            if (host_pollfds[1].revents != 0) {
+                // Interrupt signaled before a client could be accepted, break
+                return {AcceptResult{}, Errno::AGAIN};
+            }
+            if (pollres > 0) {
+                break;
+            }
         }
     }
 
@@ -913,6 +916,7 @@ Errno Socket::SetRcvTimeo(u32 value) {
 
 Errno Socket::SetNonBlock(bool enable) {
     if (EnableNonBlock(fd, enable)) {
+        is_non_blocking = enable;
         return Errno::SUCCESS;
     }
     return GetAndLogLastError();

+ 3 - 0
src/core/internal_network/sockets.h

@@ -166,6 +166,9 @@ public:
     bool IsOpened() const override;
 
     void HandleProxyPacket(const ProxyPacket& packet) override;
+
+private:
+    bool is_non_blocking = false;
 };
 
 std::pair<s32, Errno> Poll(std::vector<PollFD>& poll_fds, s32 timeout);