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:
parent
d9b126890d
commit
543532313a
3 changed files with 17 additions and 12 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue