mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-08-20 14:57:55 +00:00
nuke extra threads, extra error support; use span instead of vector for poll fds
This commit is contained in:
@@ -543,8 +543,9 @@ std::pair<s32, Network::Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std:
|
||||
return {-1, Network::Errno::INVAL};
|
||||
}
|
||||
|
||||
std::vector<Network::PollFD> fds(nfds);
|
||||
std::memcpy(fds.data(), read_buffer.data(), nfds * sizeof(Network::PollFD));
|
||||
std::span<const Network::PollFD> in_fds(reinterpret_cast<const Network::PollFD*>(read_buffer.data()), nfds);
|
||||
std::span<Network::PollFD> out_fds(reinterpret_cast<Network::PollFD*>(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<s32, Network::Errno> BSD::PollImpl(std::vector<u8>& 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<Network::HostPollFD> host_pollfds(fds.size());
|
||||
std::transform(fds.begin(), fds.end(), host_pollfds.begin(), [](auto const e) {
|
||||
std::vector<Network::HostPollFD> 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<s32, Network::Errno> BSD::AcceptImpl(s32 fd, std::vector<u8>& write_buffer) {
|
||||
|
||||
Reference in New Issue
Block a user