Commit 7b540f02 authored by Max Kellermann's avatar Max Kellermann

event/MultiSocketMonitor: add method ReplaceSocketList()

Move code from AlsaMixerPlugin.
parent e29c22e6
...@@ -20,6 +20,10 @@ ...@@ -20,6 +20,10 @@
#include "config.h" #include "config.h"
#include "MultiSocketMonitor.hxx" #include "MultiSocketMonitor.hxx"
#ifndef WIN32
#include <poll.h>
#endif
MultiSocketMonitor::MultiSocketMonitor(EventLoop &_loop) MultiSocketMonitor::MultiSocketMonitor(EventLoop &_loop)
:IdleMonitor(_loop), TimeoutMonitor(_loop), ready(false) { :IdleMonitor(_loop), TimeoutMonitor(_loop), ready(false) {
} }
...@@ -29,6 +33,32 @@ MultiSocketMonitor::~MultiSocketMonitor() ...@@ -29,6 +33,32 @@ MultiSocketMonitor::~MultiSocketMonitor()
// TODO // 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 void
MultiSocketMonitor::Prepare() MultiSocketMonitor::Prepare()
{ {
......
...@@ -39,6 +39,10 @@ ...@@ -39,6 +39,10 @@
#endif #endif
#endif #endif
#ifndef WIN32
struct pollfd;
#endif
class EventLoop; class EventLoop;
/** /**
...@@ -135,6 +139,14 @@ public: ...@@ -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: protected:
/** /**
* @return timeout [ms] or -1 for no timeout * @return timeout [ms] or -1 for no timeout
......
...@@ -104,24 +104,7 @@ AlsaMixerMonitor::PrepareSockets() ...@@ -104,24 +104,7 @@ AlsaMixerMonitor::PrepareSockets()
if (count < 0) if (count < 0)
count = 0; count = 0;
struct pollfd *end = pfds + count; ReplaceSocketList(pfds, count);
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);
return -1; return -1;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment