From: Kouhei S. <ko...@co...> - 2007-11-12 14:52:15
|
須藤です。 ふと思いついたんですが、rbglib_poll()をこうするというのはど うでしょうか? これだとWindowsでもidleを使わずにすむかもしれません。 手元のDebianではgtk-demoとかRabbitが以前と同じように動きまし た。 Index: src/rbglib_mainloop.c =================================================================== --- src/rbglib_mainloop.c (リビジョン 2692) +++ src/rbglib_mainloop.c (作業コピー) @@ -46,48 +46,16 @@ rbglib_poll (GPollFD *fds, guint nfds, gint timeout) { + gint half_timeout; struct timeval tv; - fd_set rset, wset, xset; - GPollFD *f; - int ready; - int maxfd = 0; - - FD_ZERO (&rset); - FD_ZERO (&wset); - FD_ZERO (&xset); - - for (f = fds; f < &fds[nfds]; ++f) { - if (f->fd >= 0) { - if (f->events & G_IO_IN) - FD_SET (f->fd, &rset); - if (f->events & G_IO_OUT) - FD_SET (f->fd, &wset); - if (f->events & G_IO_PRI) - FD_SET (f->fd, &xset); - if (f->fd > maxfd && (f->events & (G_IO_IN|G_IO_OUT|G_IO_PRI))) - maxfd = f->fd; - } - } - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - ready = rb_thread_select (maxfd + 1, &rset, &wset, &xset, - timeout == -1 ? NULL : &tv); - if (ready > 0) { - for (f = fds; f < &fds[nfds]; ++f) { - f->revents = 0; - if (f->fd >= 0) { - if (FD_ISSET (f->fd, &rset)) - f->revents |= G_IO_IN; - if (FD_ISSET (f->fd, &wset)) - f->revents |= G_IO_OUT; - if (FD_ISSET (f->fd, &xset)) - f->revents |= G_IO_PRI; - } - } - } + half_timeout = timeout / 2; + + tv.tv_sec = half_timeout / 1000; + tv.tv_usec = (half_timeout % 1000) * 1000; - return ready; + rb_thread_select(0, NULL, NULL, NULL, &tv); + return default_poll_func(fds, nfds, half_timeout); } static void |