From: Dima Kogan Date: Thu, 6 Nov 2014 03:02:11 +0000 (-0500) Subject: * src/xgselect.c (xg_select): Use g_main_context_acquire. X-Git-Tag: emacs-24.4.90~263 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=5b9c3a5767c6c988332def4a123f0c343628e330;p=emacs.git * src/xgselect.c (xg_select): Use g_main_context_acquire. Fixes: debbugs:18861 --- diff --git a/src/ChangeLog b/src/ChangeLog index f7088fce563..0b2f511d61f 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2014-11-06 Dima Kogan + + * xgselect.c (xg_select): Use g_main_context_acquire (bug#18861). + 2014-11-05 Michael Albinus * dired.c (Ffile_attributes): Return Qnil, if Fexpand_file_name diff --git a/src/xgselect.c b/src/xgselect.c index 42fdfed0d34..6b22f3d1376 100644 --- a/src/xgselect.c +++ b/src/xgselect.c @@ -55,19 +55,28 @@ xg_select (int fds_lim, fd_set *rfds, fd_set *wfds, fd_set *efds, 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; + bool context_acquired = false; + int i, nfds, tmo_in_millisec = -1; bool need_to_dispatch; USE_SAFE_ALLOCA; context = g_main_context_default (); + context_acquired = g_main_context_acquire (context); + /* FIXME: If we couldn't acquire the context, we just silently proceed + because this function handles more than just glib file descriptors. + Note that, as implemented, this failure is completely silent: there is + no feedback to the caller. */ if (rfds) all_rfds = *rfds; else FD_ZERO (&all_rfds); if (wfds) all_wfds = *wfds; else FD_ZERO (&all_wfds); - n_gfds = g_main_context_query (context, G_PRIORITY_LOW, &tmo_in_millisec, - gfds, gfds_size); + n_gfds = (context_acquired + ? g_main_context_query (context, G_PRIORITY_LOW, &tmo_in_millisec, + gfds, gfds_size) + : -1); + if (gfds_size < n_gfds) { SAFE_NALLOCA (gfds, sizeof *gfds, n_gfds); @@ -152,6 +161,9 @@ xg_select (int fds_lim, fd_set *rfds, fd_set *wfds, fd_set *efds, errno = pselect_errno; } + if (context_acquired) + g_main_context_release (context); + /* To not have to recalculate timeout, return like this. */ if ((our_fds > 0 || (nfds == 0 && tmop == &tmo)) && (retval == 0)) {