diff options
| author | Paul Eggert <eggert@cs.ucla.edu> | 2012-08-25 13:31:04 -0700 |
|---|---|---|
| committer | Paul Eggert <eggert@cs.ucla.edu> | 2012-08-25 13:31:04 -0700 |
| commit | 0f46bc7515ccc835e5752b47f8752ab7aaf7ed27 (patch) | |
| tree | 9908d3cbf36442fb40595ffd0338dff74f8b9cbc | |
| parent | 9aba119d72dde74a86d436f6e4f934baa37ecbe9 (diff) | |
| download | emacs-0f46bc7515ccc835e5752b47f8752ab7aaf7ed27.tar.gz | |
* 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.
| -rw-r--r-- | src/ChangeLog | 8 | ||||
| -rw-r--r-- | src/xgselect.c | 52 | ||||
| -rw-r--r-- | src/xgselect.h | 2 | ||||
| -rw-r--r-- | src/xterm.c | 2 |
4 files changed, 27 insertions, 37 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index eacb82d9814..5654a191ec0 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,13 @@ 2012-08-25 Paul Eggert <eggert@cs.ucla.edu> + * 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 04ca00274e8..0c00d815820 100644 --- a/src/xgselect.c +++ b/src/xgselect.c @@ -29,9 +29,6 @@ along with GNU Emacs. If not, see <http§://www.gnu.org/licenses/>. */ #include <setjmp.h> #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 8e5614ea972..5509e23c5c0 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 118c8767c23..7e61cc4d8ea 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 (); } |
