]> git.eshelyaron.com Git - emacs.git/commitdiff
Emulate POSIX_SIGNALS on MS-Windows.
authorEli Zaretskii <eliz@gnu.org>
Sat, 1 May 2010 18:28:00 +0000 (21:28 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 1 May 2010 18:28:00 +0000 (21:28 +0300)
 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
src/s/ms-w32.h
src/sysdep.c
src/w32.c

index 4de1618f4d660473239c4d0b96a5a1af7e43b297..98a2ae333399ba4d03f76f0d7ddc42c59ba25db6 100644 (file)
@@ -1,5 +1,15 @@
 2010-05-01  Eli Zaretskii  <eliz@gnu.org>
 
+       * 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
index 66aae334b3f1a5e64261cd2c52fca4cb222193c8..74e91c1e8161101c41c7657dc5d35147998d451a 100644 (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:"
 
index aebf6e7a2d117acda05c4df23f9aaee74faf1dcd..08c2bd48e59fa0901caad3b2e93b7f759d7fb2a8 100644 (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.  */
index 2ff344abd654e9de998fa3fe10f9aff08a223d40..0f2d8b54e6b458fa90029392ced6a7730737c38a 100644 (file)
--- 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)
 {