--- qemu/vl.c 2005-05-11 17:10:02.000000000 -0400 +++ qemu-select/vl.c 2005-05-11 17:13:24.000000000 -0400 @@ -2598,51 +2598,85 @@ void main_loop_wait(int timeout) { #ifndef _WIN32 - struct pollfd ufds[MAX_IO_HANDLERS + 1], *pf; IOHandlerRecord *ioh, *ioh_next; uint8_t buf[4096]; int n, max_size; #endif int ret; +#if defined(CONFIG_SLIRP) || !defined(_WIN32) + fd_set rfds, wfds, xfds; + int nfds; + struct timeval tv; +#endif +#if defined(CONFIG_SLIRP) + int slirp_nfds; +#endif #ifdef _WIN32 if (timeout > 0) Sleep(timeout); + +#if defined(CONFIG_SLIRP) + /* XXX: merge with poll() */ + if (slirp_inited) { + + nfds = -1; + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&xfds); + slirp_select_fill(&nfds, &rfds, &wfds, &xfds); + tv.tv_sec = 0; + tv.tv_usec = 0; + ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv); + if (ret >= 0) { + slirp_select_poll(&rfds, &wfds, &xfds); + } + } +#endif #else /* poll any events */ /* XXX: separate device handlers from system ones */ - pf = ufds; + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&xfds); + nfds = -1; for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next) { if (!ioh->fd_can_read) { + FD_SET(ioh->fd, &rfds); max_size = 0; - pf->fd = ioh->fd; - pf->events = POLLIN; - ioh->ufd = pf; - pf++; + if (ioh->fd > nfds) + nfds = ioh->fd; } else { max_size = ioh->fd_can_read(ioh->opaque); if (max_size > 0) { if (max_size > sizeof(buf)) max_size = sizeof(buf); - pf->fd = ioh->fd; - pf->events = POLLIN; - ioh->ufd = pf; - pf++; - } else { - ioh->ufd = NULL; + FD_SET(ioh->fd, &rfds); + if (ioh->fd > nfds) + nfds = ioh->fd; } } ioh->max_size = max_size; } + +#if defined(CONFIG_SLIRP) + if (slirp_inited) { + slirp_nfds = -1; + slirp_select_fill(&slirp_nfds, &rfds, &wfds, &xfds); + if (slirp_nfds > nfds) + nfds = slirp_nfds; + } +#endif /* CONFIG_SLIRP */ + + tv.tv_sec = 0; + tv.tv_usec = timeout * 1000; + ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv); - ret = poll(ufds, pf - ufds, timeout); if (ret > 0) { /* XXX: better handling of removal */ for(ioh = first_io_handler; ioh != NULL; ioh = ioh_next) { ioh_next = ioh->next; - pf = ioh->ufd; - if (pf) { - if (pf->revents & POLLIN) { + if (FD_ISSET(ioh->fd, &rfds)) { if (ioh->max_size == 0) { /* just a read event */ ioh->fd_read(ioh->opaque, NULL, 0); @@ -2654,31 +2688,16 @@ ioh->fd_read(ioh->opaque, NULL, -errno); } } - } - } + } } - } -#endif /* !defined(_WIN32) */ -#if defined(CONFIG_SLIRP) - /* XXX: merge with poll() */ - if (slirp_inited) { - fd_set rfds, wfds, xfds; - int nfds; - struct timeval tv; - nfds = -1; - FD_ZERO(&rfds); - FD_ZERO(&wfds); - FD_ZERO(&xfds); - slirp_select_fill(&nfds, &rfds, &wfds, &xfds); - tv.tv_sec = 0; - tv.tv_usec = 0; - ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv); - if (ret >= 0) { +#if defined(CONFIG_SLIRP) + if (slirp_inited) slirp_select_poll(&rfds, &wfds, &xfds); - } } -#endif +#endif /* defined(CONFIG_SLIRP) */ + +#endif /* !defined(_WIN32) */ if (vm_running) { qemu_run_timers(&active_timers[QEMU_TIMER_VIRTUAL],