mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-08-21 23:39:55 +00:00
add extra polling types
This commit is contained in:
@@ -596,7 +596,7 @@ std::pair<s32, Network::Errno> BSD::PollImpl(std::vector<u8>& write_buffer, std:
|
||||
if (!IsFileDescriptorValid(pollfd.fd)) {
|
||||
pollfd.revents = {};
|
||||
if (!file_descriptors[pollfd.fd])
|
||||
pollfd.revents = Network::PollEvents::Nval;
|
||||
pollfd.revents = Network::PollEvents::NVAL;
|
||||
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);
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -743,15 +743,18 @@ static s16 TranslatePollEvents(Network::PollEvents events) noexcept {
|
||||
result |= host;
|
||||
}
|
||||
};
|
||||
translate(Network::PollEvents::In, POLLIN);
|
||||
translate(Network::PollEvents::Pri, POLLPRI);
|
||||
translate(Network::PollEvents::Out, POLLOUT);
|
||||
translate(Network::PollEvents::Err, POLLERR);
|
||||
translate(Network::PollEvents::Hup, POLLHUP);
|
||||
translate(Network::PollEvents::Nval, POLLNVAL);
|
||||
translate(Network::PollEvents::RdNorm, POLLRDNORM);
|
||||
translate(Network::PollEvents::RdBand, POLLRDBAND);
|
||||
translate(Network::PollEvents::WrBand, POLLWRBAND);
|
||||
translate(Network::PollEvents::IN_, POLLIN);
|
||||
translate(Network::PollEvents::PRI_, POLLPRI);
|
||||
translate(Network::PollEvents::OUT_, POLLOUT);
|
||||
translate(Network::PollEvents::ERR_, POLLERR);
|
||||
translate(Network::PollEvents::HUP_, POLLHUP);
|
||||
translate(Network::PollEvents::NVAL, POLLNVAL);
|
||||
translate(Network::PollEvents::RDNORM, POLLRDNORM);
|
||||
translate(Network::PollEvents::RDBAND, POLLRDBAND);
|
||||
translate(Network::PollEvents::WRBAND, POLLWRBAND);
|
||||
#ifdef POLLIGNEOF
|
||||
translate(Network::PollEvents::IGNEOF, POLLIGNEOF);
|
||||
#endif
|
||||
#ifdef _WIN32
|
||||
s16 allowed_events = POLLRDBAND | POLLRDNORM | POLLWRNORM;
|
||||
// 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;
|
||||
}
|
||||
};
|
||||
translate(POLLIN, Network::PollEvents::In);
|
||||
translate(POLLPRI, Network::PollEvents::Pri);
|
||||
translate(POLLOUT, Network::PollEvents::Out);
|
||||
translate(POLLERR, Network::PollEvents::Err);
|
||||
translate(POLLHUP, Network::PollEvents::Hup);
|
||||
translate(POLLNVAL, Network::PollEvents::Nval);
|
||||
translate(POLLRDNORM, Network::PollEvents::RdNorm);
|
||||
translate(POLLRDBAND, Network::PollEvents::RdBand);
|
||||
translate(POLLWRBAND, Network::PollEvents::WrBand);
|
||||
|
||||
translate(POLLIN, Network::PollEvents::IN_);
|
||||
translate(POLLPRI, Network::PollEvents::PRI_);
|
||||
translate(POLLOUT, Network::PollEvents::OUT_);
|
||||
translate(POLLERR, Network::PollEvents::ERR_);
|
||||
translate(POLLHUP, Network::PollEvents::HUP_);
|
||||
translate(POLLNVAL, Network::PollEvents::NVAL);
|
||||
translate(POLLRDNORM, Network::PollEvents::RDNORM);
|
||||
translate(POLLRDBAND, Network::PollEvents::RDBAND);
|
||||
translate(POLLWRBAND, Network::PollEvents::WRBAND);
|
||||
#ifdef POLLIGNEOF
|
||||
translate(POLLIGNEOF, Network::PollEvents::IGNEOF);
|
||||
#endif
|
||||
UNIMPLEMENTED_IF_MSG(revents != 0, "Unhandled host revents={:#x}", revents);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -305,15 +305,16 @@ static_assert(sizeof(SockAddrIn) == 0x100);
|
||||
|
||||
enum class PollEvents : u16 {
|
||||
// Using Pascal case because IN is a macro on Windows.
|
||||
In = 1 << 0,
|
||||
Pri = 1 << 1,
|
||||
Out = 1 << 2,
|
||||
Err = 1 << 3,
|
||||
Hup = 1 << 4,
|
||||
Nval = 1 << 5,
|
||||
RdNorm = 1 << 6,
|
||||
RdBand = 1 << 7,
|
||||
WrBand = 1 << 8,
|
||||
IN_ = 0x0001,
|
||||
PRI_ = 0x0002,
|
||||
OUT_ = 0x0004,
|
||||
ERR_ = 0x0008,
|
||||
HUP_ = 0x0010,
|
||||
NVAL = 0x0020,
|
||||
RDNORM = 0x0040,
|
||||
RDBAND = 0x0080,
|
||||
WRBAND = 0x0100,
|
||||
IGNEOF = 0x2000,
|
||||
};
|
||||
DECLARE_ENUM_FLAG_OPERATORS(PollEvents);
|
||||
|
||||
@@ -322,11 +323,13 @@ struct PollFD {
|
||||
Network::PollEvents events;
|
||||
Network::PollEvents revents;
|
||||
};
|
||||
static_assert(sizeof(PollFD) == 8);
|
||||
|
||||
struct Linger {
|
||||
u32 onoff;
|
||||
u32 linger;
|
||||
s32 onoff;
|
||||
s32 linger;
|
||||
};
|
||||
static_assert(sizeof(Linger) == 8);
|
||||
|
||||
constexpr u32 FLAG_MSG_PEEK = 0x2;
|
||||
constexpr u32 FLAG_MSG_DONTWAIT = 0x80;
|
||||
|
||||
Reference in New Issue
Block a user