summaryrefslogtreecommitdiff
path: root/src/xgselect.c
diff options
context:
space:
mode:
authorDima Kogan <dima@secretsauce.net>2014-11-05 22:02:11 -0500
committerStefan Monnier <monnier@iro.umontreal.ca>2014-11-05 22:02:11 -0500
commit5b9c3a5767c6c988332def4a123f0c343628e330 (patch)
treefbadd90d9645d87bd76ea8c2a0b626ca9cbf623f /src/xgselect.c
parenta2634462b873a00938811c4cbfa350b627124c96 (diff)
downloademacs-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.c18
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))
{