fdManager: filter poll flags for Window's sake
This commit is contained in:
@ -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
|
||||
|
Reference in New Issue
Block a user