]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix network streams.
authorEli Zaretskii <eliz@gnu.org>
Wed, 7 Dec 2016 19:01:40 +0000 (21:01 +0200)
committerEli Zaretskii <eliz@gnu.org>
Wed, 7 Dec 2016 19:01:40 +0000 (21:01 +0200)
The original code messed up flags in fd_callback_data[], and also
didn't call add_process_read_fd for process-related file descriptors.

src/process.c
src/w32.c
src/w32proc.c

index e800bf278bc5cf9185632550ae940b12b45ed229..7d3cf19d57f72837b36deb7eab4f119618753beb 100644 (file)
@@ -454,6 +454,8 @@ add_non_keyboard_read_fd (int fd)
 {
   eassert (fd >= 0 && fd < FD_SETSIZE);
   eassert (fd_callback_info[fd].func == NULL);
+
+  fd_callback_info[fd].flags &= ~KEYBOARD_FD;
   fd_callback_info[fd].flags |= FOR_READ;
   if (fd > max_desc)
     max_desc = fd;
@@ -486,12 +488,13 @@ delete_read_fd (int fd)
 void
 add_write_fd (int fd, fd_callback func, void *data)
 {
-  if (fd > max_desc)
-    max_desc = fd;
+  eassert (fd >= 0 && fd < FD_SETSIZE);
 
   fd_callback_info[fd].func = func;
   fd_callback_info[fd].data = data;
   fd_callback_info[fd].flags |= FOR_WRITE;
+  if (fd > max_desc)
+    max_desc = fd;
 }
 
 static void
@@ -915,7 +918,7 @@ update_processes_for_thread_death (Lisp_Object dying_thread)
        {
          struct Lisp_Process *proc = XPROCESS (process);
 
-         proc->thread = Qnil;
+         pset_thread (proc, Qnil);
          if (proc->infd >= 0)
            fd_callback_info[proc->infd].thread = NULL;
          if (proc->outfd >= 0)
@@ -1230,7 +1233,7 @@ set_process_filter_masks (struct Lisp_Process *p)
   else if (EQ (p->filter, Qt)
           /* Network or serial process not stopped:  */
           && !EQ (p->command, Qt))
-    add_non_keyboard_read_fd (p->infd);
+    add_process_read_fd (p->infd);
 }
 
 DEFUN ("set-process-filter", Fset_process_filter, Sset_process_filter,
@@ -1336,7 +1339,7 @@ If THREAD is nil, the process is unlocked.  */)
     }
 
   proc = XPROCESS (process);
-  proc->thread = thread;
+  pset_thread (proc, thread);
   if (proc->infd >= 0)
     fd_callback_info[proc->infd].thread = tstate;
   if (proc->outfd >= 0)
@@ -2031,7 +2034,8 @@ create_process (Lisp_Object process, char **new_argv, Lisp_Object current_dir)
   p->pty_flag = pty_flag;
   pset_status (p, Qrun);
 
-  add_process_read_fd (inchannel);
+  if (!EQ (p->command, Qt))
+    add_process_read_fd (inchannel);
 
   /* This may signal an error.  */
   setup_process_coding_systems (process);
@@ -2265,7 +2269,7 @@ create_pty (Lisp_Object process)
       pset_status (p, Qrun);
       setup_process_coding_systems (process);
 
-      add_non_keyboard_read_fd (pty_fd);
+      add_process_read_fd (pty_fd);
 
       pset_tty_name (p, build_string (pty_name));
     }
@@ -2371,7 +2375,7 @@ usage:  (make-pipe-process &rest ARGS)  */)
   eassert (! p->pty_flag);
 
   if (!EQ (p->command, Qt))
-    add_non_keyboard_read_fd (inchannel);
+    add_process_read_fd (inchannel);
   p->adaptive_read_buffering
     = (NILP (Vprocess_adaptive_read_buffering) ? 0
        : EQ (Vprocess_adaptive_read_buffering, Qt) ? 1 : 2);
@@ -3107,7 +3111,7 @@ usage:  (make-serial-process &rest ARGS)  */)
   eassert (! p->pty_flag);
 
   if (!EQ (p->command, Qt))
-    add_non_keyboard_read_fd (fd);
+    add_process_read_fd (fd);
 
   if (BUFFERP (buffer))
     {
@@ -3597,7 +3601,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
        still listen for incoming connects unless it is stopped.  */
     if ((!EQ (p->filter, Qt) && !EQ (p->command, Qt))
        || (EQ (p->status, Qlisten) && NILP (p->command)))
-      add_non_keyboard_read_fd (inch);
+      add_process_read_fd (inch);
 
   if (inch > max_desc)
     max_desc = inch;
@@ -4793,7 +4797,9 @@ server_accept_connection (Lisp_Object server, int channel)
 
   /* Client processes for accepted connections are not stopped initially.  */
   if (!EQ (p->filter, Qt))
-    add_non_keyboard_read_fd (s);
+    add_process_read_fd (s);
+  if (s > max_desc)
+    max_desc = s;
 
   /* Setup coding system for new process based on server process.
      This seems to be the proper thing to do, as the coding system
@@ -5542,7 +5548,7 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
           if (d->func
              && ((d->flags & FOR_READ
                   && FD_ISSET (channel, &Available))
-                 || (d->flags & FOR_WRITE
+                 || ((d->flags & FOR_WRITE)
                      && FD_ISSET (channel, &Writeok))))
             d->func (channel, d->data);
        }
@@ -5728,7 +5734,7 @@ wait_reading_process_output (intmax_t time_limit, int nsecs, int read_kbd,
 
                  if (0 <= p->infd && !EQ (p->filter, Qt)
                      && !EQ (p->command, Qt))
-                   add_non_keyboard_read_fd (p->infd);
+                   add_process_read_fd (p->infd);
                }
            }
        }                       /* End for each file descriptor.  */
@@ -6728,7 +6734,7 @@ traffic.  */)
          && p->infd >= 0
          && (!EQ (p->filter, Qt) || EQ (p->status, Qlisten)))
        {
-         add_non_keyboard_read_fd (p->infd);
+         add_process_read_fd (p->infd);
 #ifdef WINDOWSNT
          if (fd_info[ p->infd ].flags & FILE_SERIAL)
            PurgeComm (fd_info[ p->infd ].hnd, PURGE_RXABORT | PURGE_RXCLEAR);
@@ -7397,7 +7403,8 @@ keyboard_bit_set (fd_set *mask)
 
   for (fd = 0; fd <= max_desc; fd++)
     if (FD_ISSET (fd, mask)
-       && ((fd_callback_info[fd].flags & KEYBOARD_FD) != 0))
+       && ((fd_callback_info[fd].flags & (FOR_READ | KEYBOARD_FD))
+           == (FOR_READ | KEYBOARD_FD)))
       return 1;
 
   return 0;
@@ -7635,8 +7642,7 @@ void
 add_timer_wait_descriptor (int fd)
 {
   add_read_fd (fd, timerfd_callback, NULL);
-  if (fd > max_desc)
-    max_desc = fd;
+  fd_callback_info[fd].flags &= ~KEYBOARD_FD;
 }
 
 #endif /* HAVE_TIMERFD */
@@ -7661,6 +7667,7 @@ add_keyboard_wait_descriptor (int desc)
 {
 #ifdef subprocesses /* Actually means "not MSDOS".  */
   eassert (desc >= 0 && desc < FD_SETSIZE);
+  fd_callback_info[desc].flags &= ~PROCESS_FD;
   fd_callback_info[desc].flags |= (FOR_READ | KEYBOARD_FD);
   if (desc > max_desc)
     max_desc = desc;
index 086c1acfb38e20e5b592424b9fc7f498f018dc43..7a80275a7c8514916c387cc065320c5bbe95302f 100644 (file)
--- a/src/w32.c
+++ b/src/w32.c
@@ -272,7 +272,7 @@ static BOOL WINAPI revert_to_self (void);
 static int sys_access (const char *, int);
 extern void *e_malloc (size_t);
 extern int sys_select (int, SELECT_TYPE *, SELECT_TYPE *, SELECT_TYPE *,
-                      struct timespec *, void *);
+                      struct timespec *, sigset_t *);
 extern int sys_dup (int);
 
 \f
index c9bc28510f7e8bb9ed444c3287def5db49775d2c..3ff52c37fbda977b010f94d0bcac7066baf05b8c 100644 (file)
@@ -72,7 +72,7 @@ extern BOOL g_b_init_compare_string_w;
 extern BOOL g_b_init_debug_break_process;
 
 int sys_select (int, SELECT_TYPE *, SELECT_TYPE *, SELECT_TYPE *,
-               struct timespec *, void *);
+               struct timespec *, sigset_t *);
 
 /* Signal handlers...SIG_DFL == 0 so this is initialized correctly.  */
 static signal_handler sig_handlers[NSIG];
@@ -2096,7 +2096,7 @@ extern int proc_buffered_char[];
 
 int
 sys_select (int nfds, SELECT_TYPE *rfds, SELECT_TYPE *wfds, SELECT_TYPE *efds,
-           struct timespec *timeout, void *ignored)
+           struct timespec *timeout, sigset_t *ignored)
 {
   SELECT_TYPE orfds, owfds;
   DWORD timeout_ms, start_time;