diff --git a/src/xgselect.c b/src/xgselect.c index 9982a1f0e9..9ffeb6c66c 100644 --- a/src/xgselect.c +++ b/src/xgselect.c @@ -58,8 +58,16 @@ xg_select (int fds_lim, fd_set *rfds, fd_set *wfds, fd_set *efds, int i, nfds, tmo_in_millisec, must_free = 0; bool need_to_dispatch; + ptrdiff_t count = SPECPDL_INDEX (); context = g_main_context_default (); - context_acquired = g_main_context_acquire (context); + context_acquired = true; + + auto void release_g_main_context (void) + { + } + + if (context_acquired) + record_unwind_protect_void (release_g_main_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 @@ -164,9 +172,6 @@ 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)) { @@ -174,6 +179,6 @@ xg_select (int fds_lim, fd_set *rfds, fd_set *wfds, fd_set *efds, errno = EINTR; } - return retval; + return unbind_to (count, Qnil), retval; } #endif /* HAVE_GLIB */