Merge pull request #4611 from EagleBearerYS/fix/libscenet-epoll-out
fix(libSceNet): sceNetEpollWait takes 2 as the OUT event
This commit is contained in:
commit
9d0a41d5a1
|
|
@ -1160,14 +1160,14 @@ int APS5_VABI sceNetEpollWait(int eid, NetEpollEvent* events, int maxevents, int
|
|||
for (std::size_t index = 0; index < descriptors.size(); ++index) {
|
||||
descriptors[index].fd = native_sockets[index]->value;
|
||||
if (registered_events[index].events & 1) descriptors[index].events |= POLLRDNORM;
|
||||
if (registered_events[index].events & 4) descriptors[index].events |= POLLWRNORM;
|
||||
if (registered_events[index].events & 2) descriptors[index].events |= POLLWRNORM;
|
||||
}
|
||||
#else
|
||||
std::vector<pollfd> descriptors(registered_events.size());
|
||||
for (std::size_t index = 0; index < descriptors.size(); ++index) {
|
||||
descriptors[index].fd = native_sockets[index]->value;
|
||||
if (registered_events[index].events & 1) descriptors[index].events |= POLLIN;
|
||||
if (registered_events[index].events & 4) descriptors[index].events |= POLLOUT;
|
||||
if (registered_events[index].events & 2) descriptors[index].events |= POLLOUT;
|
||||
}
|
||||
#endif
|
||||
const auto now = std::chrono::steady_clock::now();
|
||||
|
|
@ -1197,10 +1197,10 @@ int APS5_VABI sceNetEpollWait(int eid, NetEpollEvent* events, int maxevents, int
|
|||
std::uint32_t guest_events = 0;
|
||||
#ifdef _WIN32
|
||||
if (native_events & (POLLRDNORM | POLLPRI)) guest_events |= 1;
|
||||
if (native_events & POLLWRNORM) guest_events |= 4;
|
||||
if (native_events & POLLWRNORM) guest_events |= 2;
|
||||
#else
|
||||
if (native_events & (POLLIN | POLLPRI)) guest_events |= 1;
|
||||
if (native_events & POLLOUT) guest_events |= 4;
|
||||
if (native_events & POLLOUT) guest_events |= 2;
|
||||
#endif
|
||||
if (native_events & POLLERR) guest_events |= 8;
|
||||
if (native_events & POLLHUP) guest_events |= 16;
|
||||
|
|
|
|||
|
|
@ -326,6 +326,38 @@ static void CheckMessages(int receiver, int sender, const std::array<std::uint8_
|
|||
Require(threw);
|
||||
}
|
||||
|
||||
static void CheckEpollWritable() {
|
||||
std::array<std::uint8_t, 16> address{16, 2, 0, 0, 127, 0, 0, 1};
|
||||
const int receiver = sceNetSocket("epoll-receiver", 2, 2, 17);
|
||||
const int sender = sceNetSocket("epoll-sender", 2, 2, 17);
|
||||
Require(receiver >= 0 && sender >= 0);
|
||||
Require(sceNetBind_nid_postfix(receiver, address.data(), address.size()) == 0);
|
||||
std::uint32_t size = address.size();
|
||||
Require(sceNetGetsockname(receiver, address.data(), &size) == 0 && size == address.size());
|
||||
const int epoll = sceNetEpollCreate("epoll-writable", 0);
|
||||
Require(epoll >= 0);
|
||||
NetEpollEvent registration{};
|
||||
registration.events = 2;
|
||||
registration.ident = static_cast<std::uint64_t>(sender);
|
||||
registration.data.u32 = 41;
|
||||
Require(sceNetEpollControl(epoll, 1, sender, ®istration) == 0);
|
||||
NetEpollEvent ready{};
|
||||
Require(sceNetEpollWait(epoll, &ready, 1, 1000000) == 1);
|
||||
Require(ready.events == 2 && ready.ident == static_cast<std::uint64_t>(sender) && ready.data.u32 == 41);
|
||||
Require(sceNetEpollControl(epoll, 3, sender, nullptr) == 0);
|
||||
const char payload[] = "epoll";
|
||||
char peeked[sizeof(payload)]{};
|
||||
Require(sceNetSendto(sender, payload, sizeof(payload), 0, address.data(), address.size()) == sizeof(payload));
|
||||
Require(sceNetRecv(receiver, peeked, sizeof(peeked), 2) == sizeof(payload));
|
||||
registration.events = 3;
|
||||
registration.ident = static_cast<std::uint64_t>(receiver);
|
||||
Require(sceNetEpollControl(epoll, 1, receiver, ®istration) == 0);
|
||||
Require(sceNetEpollWait(epoll, &ready, 1, 1000000) == 1);
|
||||
Require(ready.events == 3 && ready.ident == static_cast<std::uint64_t>(receiver) && ready.data.u32 == 41);
|
||||
Require(sceNetEpollDestroy(epoll) == 0);
|
||||
Require(sceNetSocketClose(sender) == 0 && sceNetSocketClose(receiver) == 0);
|
||||
}
|
||||
|
||||
static void RequireTimeout(int socket, int option, int expected) {
|
||||
int microseconds = -1;
|
||||
std::uint32_t size = sizeof(microseconds);
|
||||
|
|
@ -614,6 +646,7 @@ int main() {
|
|||
Require(in6addr_loopback_nid_postfix[i] == (i == 15 ? 1 : 0));
|
||||
}
|
||||
Require(sceNetInit_nid_postfix() == 0);
|
||||
CheckEpollWritable();
|
||||
CheckPoolStats();
|
||||
CheckEmptyEpoll();
|
||||
CheckAddressText(2, "127.0.0.1");
|
||||
|
|
|
|||
Loading…
Reference in New Issue