Browse Source

add extra polling types

lizzie/refactor-networking-12
lizzie 1 month ago
parent
commit
7e07aeb741
  1. 7
      src/core/hle/service/sockets/bsd.cpp
  2. 42
      src/core/internal_network/network.cpp
  3. 25
      src/core/internal_network/socket_types.h

7
src/core/hle/service/sockets/bsd.cpp

@ -565,7 +565,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;
}
}
@ -583,11 +583,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;
}

42
src/core/internal_network/network.cpp

@ -742,15 +742,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.
@ -771,15 +774,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=0x{:x}", revents);
return result;
}

25
src/core/internal_network/socket_types.h

@ -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;

Loading…
Cancel
Save