From 543532313a1d9570d6a74a7846b4e776a2282964 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 30 Dec 2016 11:36:07 +0200 Subject: [PATCH] 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. --- src/process.c | 15 ++++++++++----- src/xgselect.c | 11 ++++++----- src/xgselect.h | 3 +-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/process.c b/src/process.c index c5a46f992d7..c0c52c232b9 100644 --- a/src/process.c +++ b/src/process.c @@ -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 diff --git a/src/xgselect.c b/src/xgselect.c index a9461a5df5a..c73ef7ce5f2 100644 --- a/src/xgselect.c +++ b/src/xgselect.c @@ -25,6 +25,7 @@ along with GNU Emacs. If not, see . */ #include #include +#include "lisp.h" #include "blockinput.h" #include "systime.h" @@ -41,11 +42,11 @@ along with GNU Emacs. If not, see . */ 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) diff --git a/src/xgselect.h b/src/xgselect.h index 4c56633e966..a56694229e5 100644 --- a/src/xgselect.h +++ b/src/xgselect.h @@ -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 */ -- 2.11.4.GIT