diff options
Diffstat (limited to 'src/event')
-rw-r--r-- | src/event/MultiSocketMonitor.cxx | 30 | ||||
-rw-r--r-- | src/event/MultiSocketMonitor.hxx | 12 |
2 files changed, 42 insertions, 0 deletions
diff --git a/src/event/MultiSocketMonitor.cxx b/src/event/MultiSocketMonitor.cxx index 39b6f3e0d..b5114cfb3 100644 --- a/src/event/MultiSocketMonitor.cxx +++ b/src/event/MultiSocketMonitor.cxx @@ -20,6 +20,10 @@ #include "config.h" #include "MultiSocketMonitor.hxx" +#ifndef WIN32 +#include <poll.h> +#endif + MultiSocketMonitor::MultiSocketMonitor(EventLoop &_loop) :IdleMonitor(_loop), TimeoutMonitor(_loop), ready(false) { } @@ -29,6 +33,32 @@ MultiSocketMonitor::~MultiSocketMonitor() // TODO } +#ifndef WIN32 + +void +MultiSocketMonitor::ReplaceSocketList(pollfd *pfds, unsigned n) +{ + pollfd *const end = pfds + n; + + UpdateSocketList([pfds, end](int fd) -> unsigned { + auto i = std::find_if(pfds, end, [fd](const struct pollfd &pfd){ + return pfd.fd == fd; + }); + if (i == end) + return 0; + + auto events = i->events; + i->events = 0; + return events; + }); + + for (auto i = pfds; i != end; ++i) + if (i->events != 0) + AddSocket(i->fd, i->events); +} + +#endif + void MultiSocketMonitor::Prepare() { diff --git a/src/event/MultiSocketMonitor.hxx b/src/event/MultiSocketMonitor.hxx index d1cac880a..6c76d667f 100644 --- a/src/event/MultiSocketMonitor.hxx +++ b/src/event/MultiSocketMonitor.hxx @@ -39,6 +39,10 @@ #endif #endif +#ifndef WIN32 +struct pollfd; +#endif + class EventLoop; /** @@ -135,6 +139,14 @@ public: } } +#ifndef WIN32 + /** + * Replace the socket list with the given file descriptors. + * The given pollfd array will be modified by this method. + */ + void ReplaceSocketList(pollfd *pfds, unsigned n); +#endif + protected: /** * @return timeout [ms] or -1 for no timeout |