summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Narr the Reg2024-01-31 10:24:30 -0600
committerGravatar GitHub2024-01-31 10:24:30 -0600
commit12e5293c73ce9965a6f73a8861d8b84f3f4ed615 (patch)
treeda7e3189fa6e1cc912c48d5caa2bce0c11fc7915
parentMerge pull request #12869 from FernandoS27/smmu-fixes (diff)
parentinternal_network: only poll for accept on blocking sockets (diff)
downloadyuzu-12e5293c73ce9965a6f73a8861d8b84f3f4ed615.tar.gz
yuzu-12e5293c73ce9965a6f73a8861d8b84f3f4ed615.tar.xz
yuzu-12e5293c73ce9965a6f73a8861d8b84f3f4ed615.zip
Merge pull request #12858 from liamwhite/non-blocking
internal_network: only poll for accept on blocking sockets
Diffstat (limited to '')
-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);