X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Finterrupt.c;h=3e308b164d587affcd1c4e6ca09d07bddb9b859f;hb=94ac5b7c3ff37850210b6fc9a7593cf1c5752993;hp=590050a86190227ca9e0e34d041cc8351eacbf72;hpb=f143939b1dbaf38ebd4f92c851fbc4ecddf37af1;p=sbcl.git diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 590050a..3e308b1 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -15,13 +15,8 @@ #include #include - +#include #include -#ifdef mach /* KLUDGE: #ifdef on lowercase symbols? Ick. -- WHN 19990904 */ -#ifdef mips -#include -#endif -#endif #include "runtime.h" #include "arch.h" @@ -37,6 +32,7 @@ #include "dynbind.h" #include "interr.h" + void sigaddset_blockable(sigset_t *s) { sigaddset(s, SIGHUP); @@ -45,6 +41,7 @@ void sigaddset_blockable(sigset_t *s) sigaddset(s, SIGPIPE); sigaddset(s, SIGALRM); sigaddset(s, SIGURG); + sigaddset(s, SIGFPE); sigaddset(s, SIGTSTP); sigaddset(s, SIGCHLD); sigaddset(s, SIGIO); @@ -140,8 +137,8 @@ fake_foreign_function_call(os_context_t *context) == current_control_frame_pointer) { /* There is a small window during call where the callee's * frame isn't built yet. */ - if (LowtagOf(*os_context_register_addr(context, reg_CODE)) - == type_FunPointer) { + if (lowtag_of(*os_context_register_addr(context, reg_CODE)) + == FUN_POINTER_LOWTAG) { /* We have called, but not built the new frame, so * build it for them. */ current_control_frame_pointer[0] = @@ -321,7 +318,10 @@ interrupt_handle_pending(os_context_t *context) * anyway. Why we still need to copy the pending_mask into the * context given that we're now done with the context anyway, I * couldn't say. */ - memcpy(os_context_sigmask_addr(context), &pending_mask, sizeof(sigset_t)); +#if 0 + memcpy(os_context_sigmask_addr(context), &pending_mask, + 4 /* sizeof(sigset_t) */ ); +#endif sigemptyset(&pending_mask); if (pending_signal) { int signal = pending_signal; @@ -369,7 +369,7 @@ interrupt_handle_now(int signal, siginfo_t *info, void *void_context) if (ARE_SAME_HANDLER(handler.c, SIG_IGN)) { return; } - + #ifndef __i386__ were_in_lisp = !foreign_function_call_active; if (were_in_lisp) @@ -391,7 +391,7 @@ interrupt_handle_now(int signal, siginfo_t *info, void *void_context) * support decides to pass on it. */ lose("no handler for signal %d in interrupt_handle_now(..)", signal); - } else if (LowtagOf(handler.lisp) == type_FunPointer) { + } else if (lowtag_of(handler.lisp) == FUN_POINTER_LOWTAG) { /* Allocate the SAPs while the interrupts are still disabled. * (FIXME: Why? This is the way it was done in CMU CL, and it @@ -551,11 +551,20 @@ interrupt_maybe_gc(int signal, siginfo_t *info, void *void_context) arch_set_pseudo_atomic_interrupted(context); } else { + lispobj *old_free_space=current_dynamic_space; fake_foreign_function_call(context); funcall0(SymbolFunction(MAYBE_GC)); undo_fake_foreign_function_call(context); - } - + if(current_dynamic_space==old_free_space) + /* MAYBE-GC (as the name suggest) might not. If it + * doesn't, it won't reset the GC trigger either, so we + * have to do it ourselves. Add small amount of space + * to tide us over while GC is inhibited + */ + set_auto_gc_trigger((u32)dynamic_space_free_pointer + -(u32)current_dynamic_space + +(u32)os_vm_page_size); + } return 1; } else { return 0;