]> granicus.if.org Git - gc/commitdiff
2011-02-10 Ivan Maidanski <ivmai@mail.ru> (with input from Dimitry Andric)
authorivmai <ivmai>
Sat, 12 Feb 2011 18:28:44 +0000 (18:28 +0000)
committerIvan Maidanski <ivmai@mail.ru>
Tue, 26 Jul 2011 17:06:56 +0000 (21:06 +0400)
* os_dep.c: Don't include signal.h for GC_write_fault_handler on
Win32.
* os_dep.c (SIG_OK): Don't return true unless SIGSEGV or SIGBUS on
FreeBSD.
* os_dep.c (CODE_OK): Use SEGV_ACCERR on FreeBSD (define
SEGV_ACCERR for older FreeBSD releases).
* os_dep.c (SIG_OK, CODE_OK, GC_write_fault_handler): Reformat the
code.

ChangeLog
os_dep.c

index f306a2991f0bdd2d45c3cfb10010cc20d5a47848..f9570ac94d17e6da8da01f9aa0bb177c6acf6f76 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2011-02-10  Ivan Maidanski  <ivmai@mail.ru> (with input from Dimitry Andric)
+
+       * os_dep.c: Don't include signal.h for GC_write_fault_handler on
+       Win32.
+       * os_dep.c (SIG_OK): Don't return true unless SIGSEGV or SIGBUS on
+       FreeBSD.
+       * os_dep.c (CODE_OK): Use SEGV_ACCERR on FreeBSD (define
+       SEGV_ACCERR for older FreeBSD releases).
+       * os_dep.c (SIG_OK, CODE_OK, GC_write_fault_handler): Reformat the
+       code.
+
 2011-02-10  Ivan Maidanski  <ivmai@mail.ru>
 
        * dyn_load.c (GC_register_map_entries,
index 1e27a421f2a903f94c2e35fdebee863b31419d08..b939d5b1fc424ee20673e167c3c62df433df98b1 100644 (file)
--- a/os_dep.c
+++ b/os_dep.c
@@ -3050,53 +3050,53 @@ STATIC void GC_default_push_other_roots(void)
   void GC_record_fault(struct hblk * h); /* from checksums.c */
 #endif
 
-#if !defined(DARWIN)
+#ifndef DARWIN
+
+# if !defined(MSWIN32) && !defined(MSWINCE)
 #   include <errno.h>
+#   if defined(FREEBSD) || defined(HURD) || defined(HPUX)
+#     define SIG_OK (sig == SIGBUS || sig == SIGSEGV)
+#   else
+#     define SIG_OK (sig == SIGSEGV)
+#   endif
 #   if defined(FREEBSD)
-#     define SIG_OK TRUE /* sig == SIGSEGV */
+#     ifndef SEGV_ACCERR
+#       define SEGV_ACCERR 2
+#     endif
 #     define CODE_OK (si -> si_code == BUS_PAGE_FAULT \
-          || si -> si_code == 2 /* experimentally determined (SEGV_ACCERR) */)
+          || si -> si_code == SEGV_ACCERR)
 #   elif defined(OSF1)
-#     define SIG_OK (sig == SIGSEGV)
 #     define CODE_OK (si -> si_code == 2 /* experimentally determined */)
 #   elif defined(IRIX5)
-#     define SIG_OK (sig == SIGSEGV)
 #     define CODE_OK (si -> si_code == EACCES)
 #   elif defined(HURD)
-#     define SIG_OK (sig == SIGBUS || sig == SIGSEGV)
-#     define CODE_OK  TRUE
+#     define CODE_OK TRUE
 #   elif defined(LINUX)
-#     define SIG_OK (sig == SIGSEGV)
 #     define CODE_OK TRUE
-        /* Empirically c.trapno == 14, on IA32, but is that useful?     */
-        /* Should probably consider alignment issues on other           */
-        /* architectures.                                               */
+      /* Empirically c.trapno == 14, on IA32, but is that useful?       */
+      /* Should probably consider alignment issues on other             */
+      /* architectures.                                                 */
 #   elif defined(HPUX)
-#     define SIG_OK (sig == SIGSEGV || sig == SIGBUS)
 #     define CODE_OK (si -> si_code == SEGV_ACCERR \
                       || si -> si_code == BUS_ADRERR \
                       || si -> si_code == BUS_UNKNOWN \
                       || si -> si_code == SEGV_UNKNOWN \
                       || si -> si_code == BUS_OBJERR)
 #   elif defined(SUNOS5SIGS)
-#     define SIG_OK (sig == SIGSEGV)
 #     define CODE_OK (si -> si_code == SEGV_ACCERR)
-#   elif defined(MSWIN32) || defined(MSWINCE)
-#     define SIG_OK (exc_info -> ExceptionRecord -> ExceptionCode \
-                     == STATUS_ACCESS_VIOLATION)
-#     define CODE_OK (exc_info -> ExceptionRecord -> ExceptionInformation[0] \
-                      == 1) /* Write fault */
 #   endif
-
-# if defined(MSWIN32) || defined(MSWINCE)
-    GC_INNER LONG WINAPI GC_write_fault_handler(
-                                struct _EXCEPTION_POINTERS *exc_info)
-# else
 #   include <ucontext.h>
     /*ARGSUSED*/
     STATIC void GC_write_fault_handler(int sig, siginfo_t *si, void *raw_sc)
+# else
+#   define SIG_OK (exc_info -> ExceptionRecord -> ExceptionCode \
+                     == STATUS_ACCESS_VIOLATION)
+#   define CODE_OK (exc_info -> ExceptionRecord -> ExceptionInformation[0] \
+                      == 1) /* Write fault */
+    GC_INNER LONG WINAPI GC_write_fault_handler(
+                                struct _EXCEPTION_POINTERS *exc_info)
 # endif /* MSWIN32 || MSWINCE */
-{
+  {
 #   if !defined(MSWIN32) && !defined(MSWINCE)
         char *addr = si -> si_addr;
 #   else
@@ -3197,14 +3197,14 @@ STATIC void GC_default_push_other_roots(void)
             return;
 #       endif
     }
-#if defined(MSWIN32) || defined(MSWINCE)
-    return EXCEPTION_CONTINUE_SEARCH;
-#else
-    if (GC_print_stats)
+#   if defined(MSWIN32) || defined(MSWINCE)
+      return EXCEPTION_CONTINUE_SEARCH;
+#   else
+      if (GC_print_stats)
         GC_printf("Unexpected segfault at %p\n", addr);
-    ABORT("Unexpected bus error or segmentation fault");
-#endif
-}
+      ABORT("Unexpected bus error or segmentation fault");
+#   endif
+  }
 #endif /* !DARWIN */
 
 /*