event/MultiSocketMonitor: add method ReplaceSocketList()
Move code from AlsaMixerPlugin.
This commit is contained in:
		| @@ -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() | ||||
| { | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
| @@ -104,24 +104,7 @@ AlsaMixerMonitor::PrepareSockets() | ||||
| 	if (count < 0) | ||||
| 		count = 0; | ||||
|  | ||||
| 	struct pollfd *end = 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); | ||||
|  | ||||
| 	ReplaceSocketList(pfds, count); | ||||
| 	return -1; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann