Attempt to fix crashes with threads in GTK builds

* src/xgselect.c (xg_select): Call pselect via thread_select, not
directly, to avoid running Lisp (via unblock_input) when more than
one thread could be running.  (Bug#25247)
* src/process.c (wait_reading_process_output) [HAVE_GLIB]: Call
xg_select directly instead of through thread_select.
* src/xgselect.h (xg_select): Last 2 arguments are no longer
'const', for consistency with thread_select.
This commit is contained in:
Eli Zaretskii 2016-12-30 11:36:07 +02:00
parent d9b126890d
commit 543532313a
3 changed files with 17 additions and 12 deletions

View file

@ -5341,18 +5341,23 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
}
#endif
/* HAVE_GLIB builds call thread_select in xgselect.c. */
#ifdef HAVE_GLIB
nfds = xg_select (max_desc + 1,
&Available, (check_write ? &Writeok : 0),
NULL, &timeout, NULL);
#else /* !HAVE_GLIB */
nfds = thread_select (
#if defined (HAVE_NS)
# ifdef HAVE_NS
ns_select
#elif defined (HAVE_GLIB)
xg_select
#else
# else
pselect
#endif
# endif
, max_desc + 1,
&Available,
(check_write ? &Writeok : 0),
NULL, &timeout, NULL);
#endif /* !HAVE_GLIB */
#ifdef HAVE_GNUTLS
/* GnuTLS buffers data internally. In lowat mode it leaves

View file

@ -25,6 +25,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include <glib.h>
#include <errno.h>
#include "lisp.h"
#include "blockinput.h"
#include "systime.h"
@ -41,11 +42,11 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
int
xg_select (int fds_lim, fd_set *rfds, fd_set *wfds, fd_set *efds,
struct timespec const *timeout, sigset_t const *sigmask)
struct timespec *timeout, sigset_t *sigmask)
{
fd_set all_rfds, all_wfds;
struct timespec tmo;
struct timespec const *tmop = timeout;
struct timespec *tmop = timeout;
GMainContext *context;
bool have_wfds = wfds != NULL;
@ -113,9 +114,9 @@ xg_select (int fds_lim, fd_set *rfds, fd_set *wfds, fd_set *efds,
}
fds_lim = max_fds + 1;
nfds = pselect (fds_lim, &all_rfds, have_wfds ? &all_wfds : NULL,
efds, tmop, sigmask);
nfds = thread_select (pselect, fds_lim,
&all_rfds, have_wfds ? &all_wfds : NULL, efds,
tmop, sigmask);
if (nfds < 0)
retval = nfds;
else if (nfds > 0)

View file

@ -27,7 +27,6 @@ struct timespec;
extern int xg_select (int max_fds,
fd_set *rfds, fd_set *wfds, fd_set *efds,
struct timespec const *timeout,
sigset_t const *sigmask);
struct timespec *timeout, sigset_t *sigmask);
#endif /* XGSELECT_H */