X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/1e757eb0a5bab2bdd26de8a6553ee5c2b2e2a381..2bfa3d3e1fb347ba76bddf77f3e288049635821d:/src/sysdep.c diff --git a/src/sysdep.c b/src/sysdep.c index b33900062a..e8b0057cbb 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -128,7 +128,7 @@ static const int baud_convert[] = /* Return the current working directory. Returns NULL on errors. Any other returned value must be freed with free. This is used only when get_current_dir_name is not defined on the system. */ -char* +char * get_current_dir_name (void) { char *buf; @@ -222,7 +222,9 @@ discard_tty_input (void) void stuff_char (char c) { - if (! FRAME_TERMCAP_P (SELECTED_FRAME ())) + if (! (FRAMEP (selected_frame) + && FRAME_LIVE_P (XFRAME (selected_frame)) + && FRAME_TERMCAP_P (XFRAME (selected_frame)))) return; /* Should perhaps error if in batch mode */ @@ -255,7 +257,7 @@ init_baud_rate (int fd) #endif /* not DOS_NT */ } - baud_rate = (emacs_ospeed < sizeof baud_convert / sizeof baud_convert[0] + baud_rate = (emacs_ospeed < ARRAYELTS (baud_convert) ? baud_convert[emacs_ospeed] : 9600); if (baud_rate == 0) baud_rate = 1200; @@ -659,7 +661,29 @@ ignore_sigio (void) signal (SIGIO, SIG_IGN); #endif } + +#ifndef MSDOS +/* Block SIGCHLD. */ +void +block_child_signal (sigset_t *oldset) +{ + sigset_t blocked; + sigemptyset (&blocked); + sigaddset (&blocked, SIGCHLD); + sigaddset (&blocked, SIGINT); + pthread_sigmask (SIG_BLOCK, &blocked, oldset); +} + +/* Unblock SIGCHLD. */ + +void +unblock_child_signal (sigset_t const *oldset) +{ + pthread_sigmask (SIG_SETMASK, oldset, 0); +} + +#endif /* !MSDOS */ /* Saving and restoring the process group of Emacs's terminal. */ @@ -1248,7 +1272,7 @@ reset_sys_modes (struct tty_display_info *tty_out) int i; tty_turn_off_insert (tty_out); - for (i = curX (tty_out); i < FrameCols (tty_out) - 1; i++) + for (i = cursorX (tty_out); i < FrameCols (tty_out) - 1; i++) { fputc (' ', tty_out->output); } @@ -1509,7 +1533,9 @@ emacs_sigaction_init (struct sigaction *action, signal_handler_t handler) /* When handling a signal, block nonfatal system signals that are caught by Emacs. This makes race conditions less likely. */ sigaddset (&action->sa_mask, SIGALRM); +#ifdef SIGCHLD sigaddset (&action->sa_mask, SIGCHLD); +#endif #ifdef SIGDANGER sigaddset (&action->sa_mask, SIGDANGER); #endif @@ -1643,10 +1669,7 @@ deliver_fatal_thread_signal (int sig) static _Noreturn void handle_arith_signal (int sig) { - sigset_t blocked; - sigemptyset (&blocked); - sigaddset (&blocked, sig); - pthread_sigmask (SIG_UNBLOCK, &blocked, 0); + pthread_sigmask (SIG_SETMASK, &empty_mask, 0); xsignal0 (Qarith_error); } @@ -1714,7 +1737,9 @@ init_signals (bool dumping) # ifdef SIGBUS sys_siglist[SIGBUS] = "Bus error"; # endif +# ifdef SIGCHLD sys_siglist[SIGCHLD] = "Child status changed"; +# endif # ifdef SIGCONT sys_siglist[SIGCONT] = "Continued"; # endif @@ -1925,9 +1950,6 @@ init_signals (bool dumping) #ifdef SIGVTALRM sigaction (SIGVTALRM, &process_fatal_action, 0); #endif -#ifdef SIGXCPU - sigaction (SIGXCPU, &process_fatal_action, 0); -#endif #ifdef SIGXFSZ sigaction (SIGXFSZ, &process_fatal_action, 0); #endif @@ -2185,6 +2207,9 @@ emacs_fopen (char const *file, char const *mode) int emacs_pipe (int fd[2]) { +#ifdef MSDOS + return pipe (fd); +#else /* !MSDOS */ int result = pipe2 (fd, O_CLOEXEC); if (! O_CLOEXEC && result == 0) { @@ -2192,6 +2217,7 @@ emacs_pipe (int fd[2]) fcntl (fd[1], F_SETFD, FD_CLOEXEC); } return result; +#endif /* !MSDOS */ } /* Approximate posix_close and POSIX_CLOSE_RESTART well enough for Emacs. @@ -2924,7 +2950,7 @@ system_process_attributes (Lisp_Object pid) if (gr) attrs = Fcons (Fcons (Qgroup, build_string (gr->gr_name)), attrs); - count = SPECPDL_INDEX (); + dynwind_begin (); strcpy (fn, procfn); procfn_end = fn + strlen (fn); strcpy (procfn_end, "/stat"); @@ -3035,7 +3061,7 @@ system_process_attributes (Lisp_Object pid) attrs = Fcons (Fcons (Qpmem, make_float (pmem)), attrs); } } - unbind_to (count, Qnil); + dynwind_end (); /* args */ strcpy (procfn_end, "/cmdline"); @@ -3043,14 +3069,13 @@ system_process_attributes (Lisp_Object pid) if (fd >= 0) { ptrdiff_t readsize, nread_incr; + dynwind_begin (); record_unwind_protect_int (close_file_unwind, fd); - record_unwind_protect_nothing (); nread = cmdline_size = 0; do { cmdline = xpalloc (cmdline, &cmdline_size, 2, STRING_BYTES_BOUND, 1); - set_unwind_protect_ptr (count + 1, xfree, cmdline); /* Leave room even if every byte needs escaping below. */ readsize = (cmdline_size >> 1) - nread; @@ -3084,14 +3109,13 @@ system_process_attributes (Lisp_Object pid) nread = cmdsize + 2; cmdline_size = nread + 1; q = cmdline = xrealloc (cmdline, cmdline_size); - set_unwind_protect_ptr (count + 1, xfree, cmdline); sprintf (cmdline, "[%.*s]", cmdsize, cmd); } /* Command line is encoded in locale-coding-system; decode it. */ cmd_str = make_unibyte_string (q, nread); decoded_cmd = code_convert_string_norecord (cmd_str, Vlocale_coding_system, 0); - unbind_to (count, Qnil); + dynwind_end (); attrs = Fcons (Fcons (Qargs, decoded_cmd), attrs); } @@ -3162,7 +3186,7 @@ system_process_attributes (Lisp_Object pid) if (gr) attrs = Fcons (Fcons (Qgroup, build_string (gr->gr_name)), attrs); - count = SPECPDL_INDEX (); + dynwind_begin (); strcpy (fn, procfn); procfn_end = fn + strlen (fn); strcpy (procfn_end, "/psinfo"); @@ -3236,7 +3260,7 @@ system_process_attributes (Lisp_Object pid) Vlocale_coding_system, 0)); attrs = Fcons (Fcons (Qargs, decoded_cmd), attrs); } - unbind_to (count, Qnil); + dynwind_end (); UNGCPRO; return attrs; }