LOSKIDRV_API int loski_waitevent(loski_EventWatcher *watcher, void *queue, size_t *count, loski_Seconds timeout) { int res; fd_set *sets = (fd_set *)queue; memcpy(&sets[0], &watcher->sets[0], sizeof(fd_set)); memcpy(&sets[1], &watcher->sets[1], sizeof(fd_set)); if (timeout >= 0) { struct timeval tm; seconds2timeval(timeout, &tm); res = select(watcher->maxfd, &sets[0], &sets[1], NULL, &tm); } else { res = select(watcher->maxfd, &sets[0], &sets[1], NULL, NULL); } if (res == -1) return errno; *count = 2*(watcher->maxfd); return 0; }
LOSKIDRV_API int loski_waitevent(loski_EventDriver *drv, loski_EventWatcher *watcher, void *queue, size_t *count, lua_Number timeout) { int res; fd_set *sets = (fd_set *)queue; memcpy(&sets[0], &watcher->sets[0], sizeof(fd_set)); memcpy(&sets[1], &watcher->sets[1], sizeof(fd_set)); if (timeout >= 0) { struct timeval tm; seconds2timeval(timeout, &tm); res = select(0, &sets[0], &sets[1], NULL, &tm); } else { res = select(0, &sets[0], &sets[1], NULL, NULL); } if (res == SOCKET_ERROR) return WSAGetLastError(); *count = (res == 0) ? 0 : 2*(watcher->maxfd); return 0; }