Emulate POSIX_SIGNALS on MS-Windows.

s/ms-w32.h (POSIX_SIGNALS, struct sigaction, SIG_BLOCK)
 (SIG_SETMASK, SIG_UNBLOCK): Define.
 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.
 w32.c (sigemptyset, sigaddset, sigfillset, sigprocmask): New stubs.
This commit is contained in:
Eli Zaretskii 2010-05-01 21:38:33 +03:00
commit 197daef4ab
4 changed files with 58 additions and 7 deletions

View file

@ -1,9 +1,20 @@
2010-05-01 Eli Zaretskii <eliz@gnu.org>
Emulate POSIX_SIGNALS on MS-Windows.
* s/ms-w32.h (POSIX_SIGNALS, struct sigaction, SIG_BLOCK)
(SIG_SETMASK, SIG_UNBLOCK): Define.
* 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.
* w32.c (sigemptyset, sigaddset, sigfillset, sigprocmask): New
stubs.
Miscellaneous fixes of bidi display.
* xdisp.c (find_row_end): New function, refactored from
display_line.
* 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
if the row is R2L and not continued.

View file

@ -123,6 +123,18 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#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 <sys/types.h>
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:"

View file

@ -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. */

View file

@ -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)
{