diff options
-rw-r--r-- | src/process.c | 41 | ||||
-rw-r--r-- | src/w32.c | 2 | ||||
-rw-r--r-- | src/w32proc.c | 4 |
3 files changed, 27 insertions, 20 deletions
diff --git a/src/process.c b/src/process.c index e800bf278bc..7d3cf19d57f 100644 --- a/src/process.c +++ b/src/process.c @@ -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; diff --git a/src/w32.c b/src/w32.c index 086c1acfb38..7a80275a7c8 100644 --- 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); diff --git a/src/w32proc.c b/src/w32proc.c index c9bc28510f7..3ff52c37fbd 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -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; |