void nsbeos_gui_poll(void) { fd_set read_fd_set, write_fd_set, exc_fd_set; int max_fd; struct timeval timeout; unsigned int fd_count = 0; bigtime_t next_schedule = 0; /* get any active fetcher fd */ fetch_fdset(&read_fd_set, &write_fd_set, &exc_fd_set, &max_fd); /* run the scheduler */ schedule_run(); // our own event pipe FD_SET(sEventPipe[0], &read_fd_set); // max of all the fds in the set, plus one for select() max_fd = MAX(max_fd, sEventPipe[0]) + 1; // compute schedule timeout if (earliest_callback_timeout != B_INFINITE_TIMEOUT) { next_schedule = earliest_callback_timeout - system_time(); } else { next_schedule = earliest_callback_timeout; } // we're quite late already... if (next_schedule < 0) next_schedule = 0; timeout.tv_sec = (long)(next_schedule / 1000000LL); timeout.tv_usec = (long)(next_schedule % 1000000LL); //LOG("gui_poll: select(%d, ..., %Ldus", max_fd, next_schedule); fd_count = select(max_fd, &read_fd_set, &write_fd_set, &exc_fd_set, &timeout); //LOG("select: %d\n", fd_count); if (fd_count > 0 && FD_ISSET(sEventPipe[0], &read_fd_set)) { BMessage *message; int len = read(sEventPipe[0], &message, sizeof(void *)); //LOG("gui_poll: BMessage ? %d read", len); if (len == sizeof(void *)) { //LOG("gui_poll: BMessage.what %-4.4s\n", &(message->what)); nsbeos_dispatch_event(message); } } }
static void gui_poll(bool active) { CURLMcode code; fd_set read_fd_set, write_fd_set, exc_fd_set; int max_fd = 0; struct timeval timeout; unsigned int fd_count = 0; bool block = true; bigtime_t next_schedule = 0; // handle early deadlines schedule_run(); FD_ZERO(&read_fd_set); FD_ZERO(&write_fd_set); FD_ZERO(&exc_fd_set); if (active) { code = curl_multi_fdset(fetch_curl_multi, &read_fd_set, &write_fd_set, &exc_fd_set, &max_fd); assert(code == CURLM_OK); } // our own event pipe FD_SET(sEventPipe[0], &read_fd_set); max_fd = MAX(max_fd, sEventPipe[0] + 1); // If there are pending events elsewhere, we should not be blocking if (!browser_reformat_pending) { if (earliest_callback_timeout != B_INFINITE_TIMEOUT) { next_schedule = earliest_callback_timeout - system_time(); block = false; } // we're quite late already... if (next_schedule < 0) next_schedule = 0; } else //we're not allowed to sleep, there is other activity going on. block = false; /* LOG(("gui_poll: browser_reformat_pending:%d earliest_callback_timeout:%Ld" " next_schedule:%Ld block:%d ", browser_reformat_pending, earliest_callback_timeout, next_schedule, block)); */ timeout.tv_sec = (long)(next_schedule / 1000000LL); timeout.tv_usec = (long)(next_schedule % 1000000LL); //LOG(("gui_poll: select(%d, ..., %Ldus", max_fd, next_schedule)); fd_count = select(max_fd, &read_fd_set, &write_fd_set, &exc_fd_set, block ? NULL : &timeout); //LOG(("select: %d\n", fd_count)); if (fd_count > 0 && FD_ISSET(sEventPipe[0], &read_fd_set)) { BMessage *message; int len = read(sEventPipe[0], &message, sizeof(void *)); //LOG(("gui_poll: BMessage ? %d read", len)); if (len == sizeof(void *)) { //LOG(("gui_poll: BMessage.what %-4.4s\n", &(message->what))); nsbeos_dispatch_event(message); } } schedule_run(); if (browser_reformat_pending) nsbeos_window_process_reformats(); }