From d6dae14b946a4bda5ba4dda7a625ec04511b16f4 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 1 May 2010 21:28:00 +0300 Subject: [PATCH] Emulate POSIX_SIGNALS on MS-Windows. w32.c (sigemptyset, sigaddset, sigfillset, sigprocmask): New stubs. sysdep.c (sys_signal) [WINDOWSNT]: #ifdef away. (wait_for_termination) [WINDOWSNT]: Move MS-Windows specific code from non-POSIX_SIGNALS section to POSIX_SIGNALS section. s/ms-w32.h (POSIX_SIGNALS, struct sigaction, SIG_BLOCK) (SIG_SETMASK, SIG_UNBLOCK): Define. --- src/ChangeLog | 10 ++++++++++ src/s/ms-w32.h | 12 ++++++++++++ src/sysdep.c | 14 +++++++++----- src/w32.c | 24 ++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 5 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 4de1618f4d6..98a2ae33339 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,15 @@ 2010-05-01 Eli Zaretskii + * w32.c (sigemptyset, sigaddset, sigfillset, sigprocmask): New + stubs. + + * sysdep.c (sys_signal) [WINDOWSNT]: #ifdef away. + (wait_for_termination) [WINDOWSNT]: Move MS-Windows specific code + from non-POSIX_SIGNALS section to POSIX_SIGNALS section. + + * s/ms-w32.h (POSIX_SIGNALS, struct sigaction, SIG_BLOCK) + (SIG_SETMASK, SIG_UNBLOCK): Define. + * xdisp.c (find_row_end): New function, refactored from display_line. (display_line): Use it. (extend_face_to_end_of_line): In almost-filled rows, extend only diff --git a/src/s/ms-w32.h b/src/s/ms-w32.h index 66aae334b3f..74e91c1e816 100644 --- a/src/s/ms-w32.h +++ b/src/s/ms-w32.h @@ -123,6 +123,18 @@ along with GNU Emacs. If not, see . */ #define IS_DIRECTORY_SEP(_c_) ((_c_) == '/' || (_c_) == '\\') #define IS_ANY_SEP(_c_) (IS_DIRECTORY_SEP (_c_) || IS_DEVICE_SEP (_c_)) +/* Do we have POSIX signals? (We don't, but we don't care, either.) */ +#define POSIX_SIGNALS 1 +#include +struct sigaction { + int sa_flags; + void (*sa_handler)(int); + sigset_t sa_mask; +}; +#define SIG_BLOCK 1 +#define SIG_SETMASK 2 +#define SIG_UNBLOCK 3 + /* The null device on Windows NT. */ #define NULL_DEVICE "NUL:" diff --git a/src/sysdep.c b/src/sysdep.c index aebf6e7a2d1..08c2bd48e59 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -420,6 +420,10 @@ wait_for_termination (pid) sigpause (SIGEMPTYMASK); #else /* not BSD_SYSTEM, and not HPUX version >= 6 */ #ifdef POSIX_SIGNALS /* would this work for GNU/Linux as well? */ +#ifdef WINDOWSNT + wait (0); + break; +#else /* not WINDOWSNT */ sigblock (sigmask (SIGCHLD)); errno = 0; if (kill (pid, 0) == -1 && errno == ESRCH) @@ -429,6 +433,7 @@ wait_for_termination (pid) } sigsuspend (&empty_mask); +#endif /* not WINDOWSNT */ #else /* not POSIX_SIGNALS */ #ifdef HAVE_SYSV_SIGPAUSE sighold (SIGCHLD); @@ -439,17 +444,12 @@ wait_for_termination (pid) } sigpause (SIGCHLD); #else /* not HAVE_SYSV_SIGPAUSE */ -#ifdef WINDOWSNT - wait (0); - break; -#else /* not WINDOWSNT */ if (0 > kill (pid, 0)) break; /* Using sleep instead of pause avoids timing error. If the inferior dies just before the sleep, we lose just one second. */ sleep (1); -#endif /* not WINDOWSNT */ #endif /* not HAVE_SYSV_SIGPAUSE */ #endif /* not POSIX_SIGNALS */ #endif /* not BSD_SYSTEM, and not HPUX version >= 6 */ @@ -2105,6 +2105,8 @@ read_input_waiting () sigset_t empty_mask, full_mask; +#ifndef WINDOWSNT + signal_handler_t sys_signal (int signal_number, signal_handler_t action) { @@ -2133,6 +2135,8 @@ sys_signal (int signal_number, signal_handler_t action) return (old_action.sa_handler); } +#endif /* WINDOWSNT */ + #ifndef __GNUC__ /* If we're compiling with GCC, we don't need this function, since it can be written as a macro. */ diff --git a/src/w32.c b/src/w32.c index 2ff344abd65..0f2d8b54e6b 100644 --- a/src/w32.c +++ b/src/w32.c @@ -1481,6 +1481,30 @@ sigunblock (int sig) return 0; } +int +sigemptyset (sigset_t *set) +{ + return 0; +} + +int +sigaddset (sigset_t *set, int signo) +{ + return 0; +} + +int +sigfillset (sigset_t *set) +{ + return 0; +} + +int +sigprocmask (int how, const sigset_t *set, sigset_t *oset) +{ + return 0; +} + int setpgrp (int pid, int gid) { -- 2.39.2