STATIC void GC_suspend_handler(int sig) #endif { int old_errno = errno; if (sig != GC_sig_suspend) { # if defined(GC_FREEBSD_THREADS) /* Workaround "deferred signal handling" bug in FreeBSD 9.2. */ if (0 == sig) return; # endif ABORT("Bad signal in suspend_handler"); } # if defined(IA64) || defined(HP_PA) || defined(M68K) GC_with_callee_saves_pushed(GC_suspend_handler_inner, NULL); # else /* We believe that in all other cases the full context is already */ /* in the signal handler frame. */ { # ifdef NO_SA_SIGACTION void *context = 0; # endif GC_suspend_handler_inner(NULL, context); } # endif errno = old_errno; }
STATIC void GC_push_regs_and_stack(ptr_t cold_gc_frame) { GC_with_callee_saves_pushed(GC_push_current_stack, cold_gc_frame); }