Bug 313390 (MONO52226) - Fix for signal handling wrt NetBSD in libgc
Summary: Fix for signal handling wrt NetBSD in libgc
Status: RESOLVED FIXED
Alias: MONO52226
Product: Mono: Runtime
Classification: Mono
Component: misc (show other bugs)
Version: unspecified
Hardware: Other Other
: P3 - Medium : Major
Target Milestone: ---
Assignee: Mono Bugs
QA Contact: Mono Bugs
URL:
Whiteboard:
Keywords: patch
Depends on:
Blocks:
 
Reported: 2003-12-16 13:05 UTC by Marc Recht
Modified: 2007-09-15 21:24 UTC (History)
0 users

See Also:
Found By: ---
Services Priority:
Business Priority:
Blocker: ---
Marketing QA Status: ---
IT Deployment: ---


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Thomas Wiest 2007-09-15 18:22:09 UTC


---- Reported by recht@netbsd.org 2003-12-16 06:05:20 MST ----

Description of Problem:
The following patch is from another NetBSD developer (Christian Limpach
<chris@pin.lu>). I only additionally turned of pthreads in libgc for NetBSD. 
It fixes an endless loop caused by a longjmp out of the signal handler and
which leaves a wrong signal mask for the thread.

This patch has been integrated by Hans Boehm (in a more generalized way)
and will be in the next alpha of boehm-gc. But since it isn't released yet
it hasn't been tested on NetBSD-current yet. Because of that I recommend
adding this patch first and use Hans Boehm's libgc will be synced with
boehm-gc.

Steps to reproduce the problem:
run mono on NetBSD-current

Actual Results:


Expected Results:


How often does this happen? 
everytime

Additional Information:

diff -ur mono-0.29.orig/configure mono-0.29/configure
--- mono-0.29.orig/configure  2003-11-30 13:29:59.000000000 +0100
+++ mono-0.29/configure 2003-12-16 11:52:23.000000000 +0100
@@ -1989,7 +1989,7 @@
 _ACEOF
 
      libdl=
-     libgc_threads=pthreads
+     libgc_threads=no
      ;;
   *-*-*freebsd*|*-*-*openbsd*)
      platform_win32=no
Only in mono-0.29: configure~
diff -ur mono-0.29.orig/libgc/os_dep.c mono-0.29/libgc/os_dep.c
--- mono-0.29.orig/libgc/os_dep.c   2003-08-27 16:20:46.000000000 +0200
+++ mono-0.29/libgc/os_dep.c  2003-12-16 11:52:01.000000000 +0100
@@ -121,7 +121,7 @@
 # include <fcntl.h>
 #endif
 
-#if defined(SUNOS5SIGS) || defined (HURD) || defined(LINUX)
+#if defined(SUNOS5SIGS) || defined (HURD) || defined(LINUX) || defined(NETBSD)
 # ifdef SUNOS5SIGS
 #  include <sys/siginfo.h>
 # endif
@@ -688,9 +688,11 @@
   typedef void (*handler)();
 #   endif
 
-#   if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) || defined(HURD)
+#   if defined(SUNOS5SIGS) || defined(IRIX5) || defined(OSF1) \
+    || defined(HURD) || defined(NETBSD)
   static struct sigaction old_segv_act;
-# if defined(_sigargs) /* !Irix6.x */ || defined(HPUX) || defined(HURD)
+# if defined(_sigargs) /* !Irix6.x */ || defined(HPUX) \
+  || defined(HURD) || defined(NETBSD)
       static struct sigaction old_bus_act;
 # endif
 #   else
@@ -705,11 +707,11 @@
 #   endif
     {
 # if defined(SUNOS5SIGS) || defined(IRIX5)  \
-        || defined(OSF1) || defined(HURD)
+        || defined(OSF1) || defined(HURD) || defined(NETBSD)
     struct sigaction   act;
 
     act.sa_handler  = h;
-#   ifdef SUNOS5SIGS
+#   if defined(SUNOS5SIGS) || defined(NETBSD)
             act.sa_flags          = SA_RESTART | SA_NODEFER;
 #         else
             act.sa_flags          = SA_RESTART;
@@ -729,7 +731,7 @@
 #   else
           (void) sigaction(SIGSEGV, &act, &old_segv_act);
 #    if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \
-        || defined(HPUX) || defined(HURD)
+        || defined(HPUX) || defined(HURD) || defined(NETBSD)
          /* Under Irix 5.x or HP/UX, we may get SIGBUS. */
          /* Pthreads doesn't exist under Irix 5.x, so we   */
          /* don't have to worry in the threads case.    */
@@ -765,10 +767,10 @@
     void GC_reset_fault_handler()
     {
 #       if defined(SUNOS5SIGS) || defined(IRIX5) \
-     || defined(OSF1) || defined(HURD)
+     || defined(OSF1) || defined(HURD) || defined(NETBSD)
     (void) sigaction(SIGSEGV, &old_segv_act, 0);
 #   if defined(IRIX5) && defined(_sigargs) /* Irix 5.x, not 6.x */ \
-       || defined(HPUX) || defined(HURD)
+       || defined(HPUX) || defined(HURD) || defined(NETBSD)
         (void) sigaction(SIGBUS, &old_bus_act, 0);
 #   endif
 #       else



---- Additional Comments From miguel@ximian.com 2004-05-12 21:24:49 MST ----

This has been integrated into the build now.


Unknown bug field "cf_op_sys_details" encountered while moving bug
   <cf_op_sys_details>NetBSD-current</cf_op_sys_details>
Unknown operating system other. Setting to default OS "Other".
Skipping unknown keyword: portability.