]> git.eshelyaron.com Git - emacs.git/commitdiff
Attempt to fix crashes with threads in GTK builds
authorEli Zaretskii <eliz@gnu.org>
Fri, 30 Dec 2016 09:36:07 +0000 (11:36 +0200)
committerEli Zaretskii <eliz@gnu.org>
Fri, 30 Dec 2016 09:36:07 +0000 (11:36 +0200)
* 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
src/xgselect.c
src/xgselect.h

index c5a46f992d7ef2323af8daae9b5c6bf5f3ba5e44..c0c52c232b93868d6598c0f8fca7ebd63742939b 100644 (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
index a9461a5df5a408781c323b93161d19eb91eaf87e..c73ef7ce5f2cbe9c5a0fdfd4bad4b009fca8363b 100644 (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)
index 4c56633e96606edf1c231cc318e7f37026609127..a56694229e57e5989629e1d5be40ed3d4767e167 100644 (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 */