summaryrefslogtreecommitdiff
path: root/src/xgselect.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2016-12-30 11:36:07 +0200
committerEli Zaretskii <eliz@gnu.org>2016-12-30 11:36:07 +0200
commit543532313a1d9570d6a74a7846b4e776a2282964 (patch)
tree72b0fc8e8fb161f04af620ef14a02836ad672791 /src/xgselect.c
parentd9b126890dd729e18cb5522c38f33fc70daadd79 (diff)
downloademacs-543532313a1d9570d6a74a7846b4e776a2282964.tar.gz
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.
Diffstat (limited to 'src/xgselect.c')
-rw-r--r--src/xgselect.c11
1 files changed, 6 insertions, 5 deletions
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 <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)