5#include <winpr/handle.h>
6#include <winpr/sysinfo.h>
7#include <winpr/assert.h>
10#if defined(__EMSCRIPTEN__)
11#include <emscripten.h>
14#define TAG WINPR_TAG("sync.pollset")
16#ifdef WINPR_HAVE_POLL_H
17static INT16 handle_mode_to_pollevent(ULONG mode)
21 if (mode & WINPR_FD_READ)
24 if (mode & WINPR_FD_WRITE)
31BOOL pollset_init(WINPR_POLL_SET* set,
size_t nhandles)
34#ifdef WINPR_HAVE_POLL_H
35 if (nhandles > MAXIMUM_WAIT_OBJECTS)
37 set->isStatic = FALSE;
38 set->pollset = calloc(nhandles,
sizeof(*set->pollset));
44 set->pollset = set->staticSet;
48 set->fdIndex = calloc(nhandles,
sizeof(*set->fdIndex));
52 FD_ZERO(&set->rset_base);
54 FD_ZERO(&set->wset_base);
57 set->nread = set->nwrite = 0;
65void pollset_uninit(WINPR_POLL_SET* set)
68#ifdef WINPR_HAVE_POLL_H
76void pollset_reset(WINPR_POLL_SET* set)
79#ifndef WINPR_HAVE_POLL_H
80 FD_ZERO(&set->rset_base);
81 FD_ZERO(&set->wset_base);
83 set->nread = set->nwrite = 0;
88BOOL pollset_add(WINPR_POLL_SET* set,
int fd, ULONG mode)
91#ifdef WINPR_HAVE_POLL_H
92 struct pollfd* item = NULL;
93 if (set->fillIndex == set->size)
96 item = &set->pollset[set->fillIndex];
99 item->events = handle_mode_to_pollevent(mode);
101 FdIndex* fdIndex = &set->fdIndex[set->fillIndex];
102 if (mode & WINPR_FD_READ)
104 FD_SET(fd, &set->rset_base);
108 if (mode & WINPR_FD_WRITE)
110 FD_SET(fd, &set->wset_base);
118 fdIndex->mode = mode;
124int pollset_poll(WINPR_POLL_SET* set, DWORD dwMilliseconds)
131 now = GetTickCount64();
132 if (dwMilliseconds == INFINITE)
133 dueTime = 0xFFFFFFFFFFFFFFFF;
135 dueTime = now + dwMilliseconds;
137#ifdef WINPR_HAVE_POLL_H
142 if (dwMilliseconds == INFINITE)
145 timeout = (int)(dueTime - now);
147 ret = poll(set->pollset, set->fillIndex, timeout);
150#if defined(__EMSCRIPTEN__)
155 if (++set->yieldCounter > 10)
158 set->yieldCounter = 0;
162 set->yieldCounter = 0;
170 now = GetTickCount64();
171 }
while (now < dueTime);
176 struct timeval staticTimeout;
177 struct timeval* timeout;
182 if (dwMilliseconds == INFINITE)
188 long waitTime = (long)(dueTime - now);
190 timeout = &staticTimeout;
191 timeout->tv_sec = waitTime / 1000;
192 timeout->tv_usec = (waitTime % 1000) * 1000;
198 memcpy(rset, &set->rset_base,
sizeof(*rset));
204 memcpy(wset, &set->wset_base,
sizeof(*wset));
207 ret = select(set->maxFd + 1, rset, wset, NULL, timeout);
214 now = GetTickCount64();
216 }
while (now < dueTime);
225BOOL pollset_isSignaled(WINPR_POLL_SET* set,
size_t idx)
229 if (idx > set->fillIndex)
231 WLog_ERR(TAG,
"index=%d out of pollset(fillIndex=%" PRIuz
")", idx, set->fillIndex);
235#ifdef WINPR_HAVE_POLL_H
236 return !!(set->pollset[idx].revents & set->pollset[idx].events);
238 FdIndex* fdIndex = &set->fdIndex[idx];
242 if ((fdIndex->mode & WINPR_FD_READ) && FD_ISSET(fdIndex->fd, &set->rset))
245 if ((fdIndex->mode & WINPR_FD_WRITE) && FD_ISSET(fdIndex->fd, &set->wset))
252BOOL pollset_isReadSignaled(WINPR_POLL_SET* set,
size_t idx)
256 if (idx > set->fillIndex)
258 WLog_ERR(TAG,
"index=%d out of pollset(fillIndex=%" PRIuz
")", idx, set->fillIndex);
262#ifdef WINPR_HAVE_POLL_H
263 return !!(set->pollset[idx].revents & POLLIN);
265 FdIndex* fdIndex = &set->fdIndex[idx];
269 return FD_ISSET(fdIndex->fd, &set->rset);
273BOOL pollset_isWriteSignaled(WINPR_POLL_SET* set,
size_t idx)
277 if (idx > set->fillIndex)
279 WLog_ERR(TAG,
"index=%d out of pollset(fillIndex=%" PRIuz
")", idx, set->fillIndex);
283#ifdef WINPR_HAVE_POLL_H
284 return !!(set->pollset[idx].revents & POLLOUT);
286 FdIndex* fdIndex = &set->fdIndex[idx];
290 return FD_ISSET(fdIndex->fd, &set->wset);