diff --git a/src/core/hle/service/server_manager.cpp b/src/core/hle/service/server_manager.cpp index ee0dc83ee8..9e97cd3378 100644 --- a/src/core/hle/service/server_manager.cpp +++ b/src/core/hle/service/server_manager.cpp @@ -245,14 +245,6 @@ Result ServerManager::ManageDeferral(Kernel::KEvent** out_event) { R_SUCCEED(); } -void ServerManager::StartAdditionalHostThreads(const char* name, size_t num_threads) { - for (size_t i = 0; i < num_threads; i++) { - auto thread_name = fmt::format("{}:{}", name, i + 1); - m_threads.emplace_back(m_system.Kernel().RunOnHostCoreThread( - std::move(thread_name), [&] { this->LoopProcessImpl(); })); - } -} - Result ServerManager::LoopProcess() { SCOPE_EXIT { m_stopped.Set(); diff --git a/src/core/hle/service/server_manager.h b/src/core/hle/service/server_manager.h index 5173ce46e1..49c9af82a8 100644 --- a/src/core/hle/service/server_manager.h +++ b/src/core/hle/service/server_manager.h @@ -48,7 +48,6 @@ public: Result ManageDeferral(Kernel::KEvent** out_event); Result LoopProcess(); - void StartAdditionalHostThreads(const char* name, size_t num_threads); static void RunServer(std::unique_ptr&& server); diff --git a/src/core/hle/service/sockets/bsd.cpp b/src/core/hle/service/sockets/bsd.cpp index 2fc35ccf4b..348d70127d 100644 --- a/src/core/hle/service/sockets/bsd.cpp +++ b/src/core/hle/service/sockets/bsd.cpp @@ -543,8 +543,9 @@ std::pair BSD::PollImpl(std::vector& write_buffer, std: return {-1, Network::Errno::INVAL}; } - std::vector fds(nfds); - std::memcpy(fds.data(), read_buffer.data(), nfds * sizeof(Network::PollFD)); + std::span in_fds(reinterpret_cast(read_buffer.data()), nfds); + std::span out_fds(reinterpret_cast(write_buffer.data()), nfds); + std::copy(in_fds.begin(), in_fds.end(), out_fds.begin()); if (timeout >= 0) { const s64 seconds = timeout / 1000; @@ -559,34 +560,28 @@ std::pair BSD::PollImpl(std::vector& write_buffer, std: return {-1, Network::Errno::INVAL}; } - bool has_invalid = false; - for (auto& pollfd : fds) { - ASSERT(False(pollfd.revents)); - if (!IsFileDescriptorValid(pollfd.fd)) { - pollfd.revents = {}; - if (!file_descriptors[pollfd.fd]) - pollfd.revents = Network::PollEvents::NVAL; - has_invalid = true; + for (size_t i = 0; i < in_fds.size(); ++i) { + ASSERT(out_fds[i].fd == in_fds[i].fd && False(in_fds[i].revents)); + if (!IsFileDescriptorValid(in_fds[i].fd)) { + out_fds[i].revents = {}; + if (!file_descriptors[in_fds[i].fd]) + out_fds[i].revents = Network::PollEvents::NVAL; + return {0, Network::Errno::SUCCESS}; } } - if (has_invalid) { - return {0, Network::Errno::SUCCESS}; - } - std::vector host_pollfds(fds.size()); - std::transform(fds.begin(), fds.end(), host_pollfds.begin(), [](auto const e) { + std::vector host_pollfds(in_fds.size()); + std::transform(in_fds.begin(), in_fds.end(), host_pollfds.begin(), [](auto const e) { Network::HostPollFD result{}; result.socket = file_descriptors[e.fd]->socket.get(); result.events = e.events; - result.revents = e.revents; + result.revents = {}; return result; }); - - const auto result = Network::Poll(host_pollfds, timeout); - for (size_t i = 0; i < host_pollfds.size(); ++i) - fds[i].revents = host_pollfds[i].revents; - std::memcpy(write_buffer.data(), fds.data(), nfds * sizeof(Network::PollFD)); - return result; + auto const res = Network::Poll(host_pollfds, timeout); + for (size_t i = 0; i < in_fds.size(); ++i) + out_fds[i].revents = host_pollfds[i].revents; + return res; } std::pair BSD::AcceptImpl(s32 fd, std::vector& write_buffer) { diff --git a/src/core/hle/service/sockets/sockets.cpp b/src/core/hle/service/sockets/sockets.cpp index 676d24e036..eedcabb284 100644 --- a/src/core/hle/service/sockets/sockets.cpp +++ b/src/core/hle/service/sockets/sockets.cpp @@ -18,7 +18,6 @@ void LoopProcess(Core::System& system) { server_manager->RegisterNamedService("nsd:a", std::make_shared(system, "nsd:a")); server_manager->RegisterNamedService("nsd:u", std::make_shared(system, "nsd:u")); server_manager->RegisterNamedService("sfdnsres", std::make_shared(system)); - server_manager->StartAdditionalHostThreads("bsdsocket", 2); ServerManager::RunServer(std::move(server_manager)); } diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp index b15d583f6a..d12debd120 100644 --- a/src/core/internal_network/network.cpp +++ b/src/core/internal_network/network.cpp @@ -285,7 +285,9 @@ Errno TranslateNativeError(int e, CallType call_type = CallType::Other) { NETWORK_ERROR_ELEM(NOTSUP) \ NETWORK_ERROR_ELEM(ADDRINUSE) \ NETWORK_ERROR_ELEM(ADDRNOTAVAIL) \ - NETWORK_ERROR_ELEM(NOTSOCK) + NETWORK_ERROR_ELEM(NOTSOCK) \ + NETWORK_ERROR_ELEM(ALREADY) \ + NETWORK_ERROR_ELEM(STALE) #define NETWORK_ERROR_ELEM(name) case E##name: return Errno::name; NETWORK_ERROR_LIST #undef NETWORK_ERROR_ELEM @@ -888,7 +890,6 @@ std::variant, GetAddrInfoError> GetAddressInfo(const std:: std::pair Poll(std::span pollfds, s32 timeout) { LOG_DEBUG(Network, "pollfds={},timeout={}", pollfds.size(), timeout); - const size_t num = pollfds.size(); std::vector host_pollfds(pollfds.size()); std::transform(pollfds.begin(), pollfds.end(), host_pollfds.begin(), [](auto const e) { @@ -913,16 +914,14 @@ std::pair Poll(std::span pollfds, s32 timeout) { return {0, Errno::SUCCESS}; } - for (size_t i = 0; i < num; ++i) + for (size_t i = 0; i < pollfds.size(); ++i) pollfds[i].revents = TranslatePollRevents(host_pollfds[i].revents); - if (result > 0) { - return {result, Errno::SUCCESS}; + if (result <= 0) { + ASSERT(result == SOCKET_ERROR); + return {-1, GetAndLogLastError()}; } - - ASSERT(result == SOCKET_ERROR); - - return {-1, GetAndLogLastError()}; + return {result, Errno::SUCCESS}; } Socket::~Socket() { diff --git a/src/core/internal_network/socket_types.h b/src/core/internal_network/socket_types.h index 1d43a2c643..e54c94a849 100644 --- a/src/core/internal_network/socket_types.h +++ b/src/core/internal_network/socket_types.h @@ -43,7 +43,9 @@ enum class Errno : u32 { TIMEDOUT = 110, CONNREFUSED = 111, HOSTUNREACH = 113, + ALREADY = 114, INPROGRESS = 115, + STALE = 116, /* made up error? */ OTHER = 196, };