diff options
author | Dima Kogan <dima@secretsauce.net> | 2014-11-05 22:02:11 -0500 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2014-11-05 22:02:11 -0500 |
commit | 5b9c3a5767c6c988332def4a123f0c343628e330 (patch) | |
tree | fbadd90d9645d87bd76ea8c2a0b626ca9cbf623f /src/xgselect.c | |
parent | a2634462b873a00938811c4cbfa350b627124c96 (diff) | |
download | emacs-5b9c3a5767c6c988332def4a123f0c343628e330.tar.gz |
* src/xgselect.c (xg_select): Use g_main_context_acquire.
Fixes: debbugs:18861
Diffstat (limited to 'src/xgselect.c')
-rw-r--r-- | src/xgselect.c | 18 |
1 files changed, 15 insertions, 3 deletions
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)) { |