diff --git a/modules/libcom/src/fdmgr/fdManager.cpp b/modules/libcom/src/fdmgr/fdManager.cpp index 8e218deb5..1056925d7 100644 --- a/modules/libcom/src/fdmgr/fdManager.cpp +++ b/modules/libcom/src/fdmgr/fdManager.cpp @@ -35,9 +35,7 @@ #ifdef FDMGR_USE_POLL #include -#if defined(_WIN32) -#define poll WSAPoll -#else +#if !defined(_WIN32) #include #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((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