From: Paul Eggert Date: Sat, 25 Aug 2012 20:31:04 +0000 (-0700) Subject: * xgselect.c (xg_select): Use auto storage for the GPollFD buffer X-Git-Tag: emacs-24.2.90~516 X-Git-Url: https://code.delx.au/gnu-emacs/commitdiff_plain/0f46bc7515ccc835e5752b47f8752ab7aaf7ed27 * xgselect.c (xg_select): Use auto storage for the GPollFD buffer as that's faster and simpler than static storage. Don't bother with the g_main_context_query overhead if g_main_context_pending says no events are pending. (gfds, gfds_size): Remove these static vars. (xgselect_initialize): Remove; no longer needed. All uses and decls removed. --- diff --git a/src/ChangeLog b/src/ChangeLog index eacb82d981..5654a191ec 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,13 @@ 2012-08-25 Paul Eggert + * xgselect.c (xg_select): Use auto storage for the GPollFD buffer + as that's faster and simpler than static storage. Don't bother + with the g_main_context_query overhead if g_main_context_pending + says no events are pending. + (gfds, gfds_size): Remove these static vars. + (xgselect_initialize): Remove; no longer needed. + All uses and decls removed. + * emacs.c (fatal_error_signal_hook): Remove. All uses removed. This leftover from old code was always 0. diff --git a/src/xgselect.c b/src/xgselect.c index 04ca00274e..0c00d81582 100644 --- a/src/xgselect.c +++ b/src/xgselect.c @@ -29,9 +29,6 @@ along with GNU Emacs. If not, see . */ #include #include "xterm.h" -static GPollFD *gfds; -static ptrdiff_t gfds_size; - int xg_select (int fds_lim, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds, EMACS_TIME *timeout, sigset_t *sigmask) @@ -41,35 +38,31 @@ xg_select (int fds_lim, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds, GMainContext *context; int have_wfds = wfds != NULL; - int n_gfds = 0, retval = 0, our_fds = 0, max_fds = fds_lim - 1; + GPollFD gfds_buf[128]; + GPollFD *gfds = gfds_buf; + int gfds_size = sizeof gfds_buf / sizeof *gfds_buf; + int n_gfds, retval = 0, our_fds = 0, max_fds = fds_lim - 1; int i, nfds, tmo_in_millisec; + USE_SAFE_ALLOCA; - if (!x_in_use) - return pselect (fds_lim, rfds, wfds, efds, tmop, sigmask); + if (! (x_in_use + && g_main_context_pending (context = g_main_context_default ()))) + return pselect (fds_lim, rfds, wfds, efds, timeout, sigmask); if (rfds) memcpy (&all_rfds, rfds, sizeof (all_rfds)); else FD_ZERO (&all_rfds); if (wfds) memcpy (&all_wfds, wfds, sizeof (all_rfds)); else FD_ZERO (&all_wfds); - /* Update event sources in GLib. */ - context = g_main_context_default (); - g_main_context_pending (context); - - do { - if (n_gfds > gfds_size) - { - xfree (gfds); - gfds = xpalloc (0, &gfds_size, n_gfds - gfds_size, INT_MAX, - sizeof *gfds); - } - - n_gfds = g_main_context_query (context, - G_PRIORITY_LOW, - &tmo_in_millisec, - gfds, - gfds_size); - } while (n_gfds > gfds_size); + n_gfds = g_main_context_query (context, G_PRIORITY_LOW, &tmo_in_millisec, + gfds, gfds_size); + if (gfds_size < n_gfds) + { + SAFE_NALLOCA (gfds, sizeof *gfds, n_gfds); + gfds_size = n_gfds; + n_gfds = g_main_context_query (context, G_PRIORITY_LOW, &tmo_in_millisec, + gfds, gfds_size); + } for (i = 0; i < n_gfds; ++i) { @@ -86,6 +79,8 @@ xg_select (int fds_lim, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds, } } + SAFE_FREE (); + if (tmo_in_millisec >= 0) { tmo = make_emacs_time (tmo_in_millisec / 1000, @@ -147,12 +142,3 @@ xg_select (int fds_lim, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds, return retval; } #endif /* USE_GTK || HAVE_GCONF || HAVE_GSETTINGS */ - -void -xgselect_initialize (void) -{ -#if defined (USE_GTK) || defined (HAVE_GCONF) || defined (HAVE_GSETTINGS) - gfds_size = 128; - gfds = xmalloc (gfds_size * sizeof *gfds); -#endif -} diff --git a/src/xgselect.h b/src/xgselect.h index 8e5614ea97..5509e23c5c 100644 --- a/src/xgselect.h +++ b/src/xgselect.h @@ -31,6 +31,4 @@ extern int xg_select (int max_fds, EMACS_TIME *timeout, sigset_t *sigmask); -extern void xgselect_initialize (void); - #endif /* XGSELECT_H */ diff --git a/src/xterm.c b/src/xterm.c index 118c8767c2..7e61cc4d8e 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -10815,8 +10815,6 @@ x_initialize (void) XSetIOErrorHandler (x_io_error_quitter); signal (SIGPIPE, x_connection_signal); - - xgselect_initialize (); }