add extra polling types

This commit is contained in:
lizzie
2026-07-01 23:33:13 +00:00
parent 5a678a389f
commit e2c3d339f6
3 changed files with 40 additions and 35 deletions
+2 -5
View File
@@ -596,7 +596,7 @@ std::pair<s32, Network::Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std:
if (!IsFileDescriptorValid(pollfd.fd)) { if (!IsFileDescriptorValid(pollfd.fd)) {
pollfd.revents = {}; pollfd.revents = {};
if (!file_descriptors[pollfd.fd]) if (!file_descriptors[pollfd.fd])
pollfd.revents = Network::PollEvents::Nval; pollfd.revents = Network::PollEvents::NVAL;
has_invalid = true; has_invalid = true;
} }
} }
@@ -614,11 +614,8 @@ std::pair<s32, Network::Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std:
}); });
const auto result = Network::Poll(host_pollfds, timeout); const auto result = Network::Poll(host_pollfds, timeout);
for (size_t i = 0; i < host_pollfds.size(); ++i) { for (size_t i = 0; i < host_pollfds.size(); ++i)
fds[i].socket = host_pollfds[i].socket->fd;
fds[i].events = host_pollfds[i].events;
fds[i].revents = host_pollfds[i].revents; fds[i].revents = host_pollfds[i].revents;
}
std::memcpy(write_buffer.data(), fds.data(), nfds * sizeof(Network::PollFD)); std::memcpy(write_buffer.data(), fds.data(), nfds * sizeof(Network::PollFD));
return result; return result;
} }
+24 -19
View File
@@ -743,15 +743,18 @@ static s16 TranslatePollEvents(Network::PollEvents events) noexcept {
result |= host; result |= host;
} }
}; };
translate(Network::PollEvents::In, POLLIN); translate(Network::PollEvents::IN_, POLLIN);
translate(Network::PollEvents::Pri, POLLPRI); translate(Network::PollEvents::PRI_, POLLPRI);
translate(Network::PollEvents::Out, POLLOUT); translate(Network::PollEvents::OUT_, POLLOUT);
translate(Network::PollEvents::Err, POLLERR); translate(Network::PollEvents::ERR_, POLLERR);
translate(Network::PollEvents::Hup, POLLHUP); translate(Network::PollEvents::HUP_, POLLHUP);
translate(Network::PollEvents::Nval, POLLNVAL); translate(Network::PollEvents::NVAL, POLLNVAL);
translate(Network::PollEvents::RdNorm, POLLRDNORM); translate(Network::PollEvents::RDNORM, POLLRDNORM);
translate(Network::PollEvents::RdBand, POLLRDBAND); translate(Network::PollEvents::RDBAND, POLLRDBAND);
translate(Network::PollEvents::WrBand, POLLWRBAND); translate(Network::PollEvents::WRBAND, POLLWRBAND);
#ifdef POLLIGNEOF
translate(Network::PollEvents::IGNEOF, POLLIGNEOF);
#endif
#ifdef _WIN32 #ifdef _WIN32
s16 allowed_events = POLLRDBAND | POLLRDNORM | POLLWRNORM; s16 allowed_events = POLLRDBAND | POLLRDNORM | POLLWRNORM;
// Unlike poll on other OSes, WSAPoll will complain if any other flags are set on input. // Unlike poll on other OSes, WSAPoll will complain if any other flags are set on input.
@@ -772,16 +775,18 @@ static Network::PollEvents TranslatePollRevents(s16 revents) {
result |= guest; result |= guest;
} }
}; };
translate(POLLIN, Network::PollEvents::In); translate(POLLIN, Network::PollEvents::IN_);
translate(POLLPRI, Network::PollEvents::Pri); translate(POLLPRI, Network::PollEvents::PRI_);
translate(POLLOUT, Network::PollEvents::Out); translate(POLLOUT, Network::PollEvents::OUT_);
translate(POLLERR, Network::PollEvents::Err); translate(POLLERR, Network::PollEvents::ERR_);
translate(POLLHUP, Network::PollEvents::Hup); translate(POLLHUP, Network::PollEvents::HUP_);
translate(POLLNVAL, Network::PollEvents::Nval); translate(POLLNVAL, Network::PollEvents::NVAL);
translate(POLLRDNORM, Network::PollEvents::RdNorm); translate(POLLRDNORM, Network::PollEvents::RDNORM);
translate(POLLRDBAND, Network::PollEvents::RdBand); translate(POLLRDBAND, Network::PollEvents::RDBAND);
translate(POLLWRBAND, Network::PollEvents::WrBand); translate(POLLWRBAND, Network::PollEvents::WRBAND);
#ifdef POLLIGNEOF
translate(POLLIGNEOF, Network::PollEvents::IGNEOF);
#endif
UNIMPLEMENTED_IF_MSG(revents != 0, "Unhandled host revents={:#x}", revents); UNIMPLEMENTED_IF_MSG(revents != 0, "Unhandled host revents={:#x}", revents);
return result; return result;
} }
+14 -11
View File
@@ -305,15 +305,16 @@ static_assert(sizeof(SockAddrIn) == 0x100);
enum class PollEvents : u16 { enum class PollEvents : u16 {
// Using Pascal case because IN is a macro on Windows. // Using Pascal case because IN is a macro on Windows.
In = 1 << 0, IN_ = 0x0001,
Pri = 1 << 1, PRI_ = 0x0002,
Out = 1 << 2, OUT_ = 0x0004,
Err = 1 << 3, ERR_ = 0x0008,
Hup = 1 << 4, HUP_ = 0x0010,
Nval = 1 << 5, NVAL = 0x0020,
RdNorm = 1 << 6, RDNORM = 0x0040,
RdBand = 1 << 7, RDBAND = 0x0080,
WrBand = 1 << 8, WRBAND = 0x0100,
IGNEOF = 0x2000,
}; };
DECLARE_ENUM_FLAG_OPERATORS(PollEvents); DECLARE_ENUM_FLAG_OPERATORS(PollEvents);
@@ -322,11 +323,13 @@ struct PollFD {
Network::PollEvents events; Network::PollEvents events;
Network::PollEvents revents; Network::PollEvents revents;
}; };
static_assert(sizeof(PollFD) == 8);
struct Linger { struct Linger {
u32 onoff; s32 onoff;
u32 linger; s32 linger;
}; };
static_assert(sizeof(Linger) == 8);
constexpr u32 FLAG_MSG_PEEK = 0x2; constexpr u32 FLAG_MSG_PEEK = 0x2;
constexpr u32 FLAG_MSG_DONTWAIT = 0x80; constexpr u32 FLAG_MSG_DONTWAIT = 0x80;