Bugzilla – Bug 313390
Fix for signal handling wrt NetBSD in libgc
Last modified: 2007-09-15 21:24:46 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.