fdManager: filter poll flags for Window's sake

This commit is contained in:
2025-01-30 16:25:29 +01:00
parent c3f57ee818
commit c9183b5241

View File

@ -35,9 +35,7 @@
#ifdef FDMGR_USE_POLL
#include <vector>
#if defined(_WIN32)
#define poll WSAPoll
#else
#if !defined(_WIN32)
#include <poll.h>
#endif
@ -45,6 +43,15 @@ static const short PollEvents[] = { // must match fdRegType
POLLRDNORM | POLLRDBAND | POLLIN | POLLHUP | POLLERR,
POLLWRBAND | POLLWRNORM | POLLOUT | POLLERR,
POLLPRI};
#if defined(_WIN32)
#define poll WSAPoll
// Filter out PollEvents that Windows does not accept in events (only returns in revents)
#define WIN_POLLEVENT_FILTER(ev) static_cast<short>((ev) & (POLLIN | POLLOUT))
#else
// Linux, MacOS and RTEMS don't care
#define WIN_POLLEVENT_FILTER(ev) (ev)
#endif
#endif
#ifdef FDMGR_USE_SELECT
@ -101,7 +108,9 @@ epicsTimer & fdManager::createTimer()
fdManager fileDescriptorManager;
static const unsigned mSecPerSec = 1000u;
#ifdef FDMGR_USE_SELECT
static const unsigned uSecPerSec = 1000u * mSecPerSec;
#endif
//
// fdManager::fdManager()
@ -179,11 +188,14 @@ LIBCOM_API void fdManager::process (double delay)
#ifdef FDMGR_USE_POLL
#if __cplusplus >= 201100L
priv->pollfds.emplace_back(pollfd{.fd = iter->getFD(), .events = PollEvents[iter->getType()]});
priv->pollfds.emplace_back(pollfd{
.fd = iter->getFD(),
.events = WIN_POLLEVENT_FILTER(PollEvents[iter->getType()])
});
#else
struct pollfd pollfd;
pollfd.fd = iter->getFD();
pollfd.events = PollEvents[iter->getType()];
pollfd.events = WIN_POLLEVENT_FILTER(PollEvents[iter->getType()]);
pollfd.revents = 0;
priv->pollfds.push_back(pollfd);
#endif
@ -234,7 +246,7 @@ LIBCOM_API void fdManager::process (double delay)
// But just in case...
int isave = i;
while (priv->pollfds[i].fd != iter->getFD() ||
priv->pollfds[i].events != PollEvents[iter->getType()])
priv->pollfds[i].events != WIN_POLLEVENT_FILTER(PollEvents[iter->getType()]))
{
errlogPrintf("fdManager: skipping (removed?) pollfd %d (expected %d)\n", priv->pollfds[i].fd, iter->getFD());
i++; // skip pollfd of removed items