block SIGCHLD during write-barrier signal handler

svn: r3913
This commit is contained in:
Matthew Flatt 2006-07-31 22:23:54 +00:00
parent 7225955e3f
commit b603af9095
2 changed files with 8 additions and 9 deletions

View File

@ -34,8 +34,8 @@ void fault_handler(int sn, struct sigcontext sc)
/* x86 */
designate_modified((void *)sc.cr2);
# endif
signal(SIGSEGV, (void (*)(int))fault_handler);
# define NEED_SIGSEGV
# define NEED_SIGACTION
# define USE_SIGACTON_SIGNAL_KIND SIGSEGV
}
# endif
#endif
@ -47,7 +47,8 @@ void fault_handler(int sn, int code, struct sigcontext *sc, char *addr)
{
designate_modified(addr);
}
# define NEED_SIGBUS
# define NEED_SIGACTION
# define USE_SIGACTON_SIGNAL_KIND SIGBUS
#endif
/* ========== Solaris signal handler ========== */
@ -89,12 +90,6 @@ typedef LONG (WINAPI*gcPVECTORED_EXCEPTION_HANDLER)(LPEXCEPTION_POINTERS e);
static void initialize_signal_handler()
{
# ifdef NEED_SIGSEGV
signal(SIGSEGV, (void (*)(int))fault_handler);
# endif
# ifdef NEED_SIGBUS
signal(SIGBUS, (void (*)(int))fault_handler);
# endif
# ifdef NEED_OSX_MACH_HANDLER
macosx_init_exception_handler();
# endif
@ -104,6 +99,8 @@ static void initialize_signal_handler()
memset(&act, sizeof(sigaction), 0);
act.sa_sigaction = fault_handler;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGCHLD); /* needed by MzScheme, since SIGCHLD handling
may trigger a write barrier */
act.sa_flags = SA_SIGINFO;
sigaction(USE_SIGACTON_SIGNAL_KIND, &act, &oact);
}

View File

@ -2519,6 +2519,7 @@ static int mark_comp_info_MARK(void *p) {
gcMARK(i->value_name);
gcMARK(i->certs);
gcMARK(i->observer);
return
gcBYTES_TO_WORDS(sizeof(Scheme_Compile_Info));
@ -2529,6 +2530,7 @@ static int mark_comp_info_FIXUP(void *p) {
gcFIXUP(i->value_name);
gcFIXUP(i->certs);
gcFIXUP(i->observer);
return
gcBYTES_TO_WORDS(sizeof(Scheme_Compile_Info));