0.7.4.40:
[sbcl.git] / src / runtime / interrupt.c
index 159a9ae..3e308b1 100644 (file)
@@ -15,7 +15,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
-
+#include <string.h>
 #include <signal.h>
 
 #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;