X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Finterrupt.c;h=3e308b164d587affcd1c4e6ca09d07bddb9b859f;hb=db0691b05cc99ce010ecae78bb532b594aea1859;hp=159a9aeb81626dc2236399e0d692fb0f35c340ae;hpb=68fd2d2dd6f265669a8957accd8a33e62786a97e;p=sbcl.git diff --git a/src/runtime/interrupt.c b/src/runtime/interrupt.c index 159a9ae..3e308b1 100644 --- a/src/runtime/interrupt.c +++ b/src/runtime/interrupt.c @@ -15,7 +15,7 @@ #include #include - +#include #include #include "runtime.h" @@ -32,6 +32,7 @@ #include "dynbind.h" #include "interr.h" + void sigaddset_blockable(sigset_t *s) { sigaddset(s, SIGHUP); @@ -40,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); @@ -290,7 +292,6 @@ interrupt_handle_pending(os_context_t *context) { undo_fake_foreign_function_call(context); } - fprintf(stderr,"interrupt-handle-pending: back from MAYBE_GC\n"); } /* FIXME: This isn't very clear. It would be good to reverse @@ -550,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;