event/MultiSocketMonitor: add method ReplaceSocketList()
Move code from AlsaMixerPlugin.
This commit is contained in:
parent
e29c22e662
commit
7b540f0226
|
@ -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()
|
||||||
// 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 @@
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef WIN32
|
||||||
|
struct pollfd;
|
||||||
|
#endif
|
||||||
|
|
||||||
class EventLoop;
|
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:
|
protected:
|
||||||
/**
|
/**
|
||||||
* @return timeout [ms] or -1 for no timeout
|
* @return timeout [ms] or -1 for no timeout
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue