event/MultiSocketMonitor: add method ReplaceSocketList()
Move code from AlsaMixerPlugin.
This commit is contained in:
		| @@ -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; | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann