diff options
Diffstat (limited to 'src/event/MultiSocketMonitor.cxx')
-rw-r--r-- | src/event/MultiSocketMonitor.cxx | 30 |
1 files changed, 30 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() { |