0.9.4.12:
[sbcl.git] / src / runtime / gencgc.c
index a5904df..ea715e3 100644 (file)
@@ -2135,6 +2135,7 @@ possibly_valid_dynamic_space_pointer(lispobj *pointer)
         }
         switch (widetag_of(start_addr[0])) {
         case UNBOUND_MARKER_WIDETAG:
+        case NO_TLS_VALUE_MARKER_WIDETAG:
         case CHARACTER_WIDETAG:
 #if N_WORD_BITS == 64
         case SINGLE_FLOAT_WIDETAG:
@@ -3623,26 +3624,30 @@ garbage_collect_generation(int generation, int raise)
      * care to avoid SIG_DFL and SIG_IGN. */
     for_each_thread(th) {
         struct interrupt_data *data=th->interrupt_data;
-    for (i = 0; i < NSIG; i++) {
+        for (i = 0; i < NSIG; i++) {
             union interrupt_handler handler = data->interrupt_handlers[i];
-        if (!ARE_SAME_HANDLER(handler.c, SIG_IGN) &&
-            !ARE_SAME_HANDLER(handler.c, SIG_DFL)) {
+            if (!ARE_SAME_HANDLER(handler.c, SIG_IGN) &&
+                !ARE_SAME_HANDLER(handler.c, SIG_DFL)) {
                 scavenge((lispobj *)(data->interrupt_handlers + i), 1);
             }
         }
     }
+    /* Scavenge the function list for INTERRUPT-THREAD. */
+    for_each_thread(th) {
+        scavenge(&th->interrupt_fun,1);
+    }
     /* Scavenge the binding stacks. */
- {
-     struct thread *th;
-     for_each_thread(th) {
-         long len= (lispobj *)SymbolValue(BINDING_STACK_POINTER,th) -
-             th->binding_stack_start;
-         scavenge((lispobj *) th->binding_stack_start,len);
+    {
+        struct thread *th;
+        for_each_thread(th) {
+            long len= (lispobj *)SymbolValue(BINDING_STACK_POINTER,th) -
+                th->binding_stack_start;
+            scavenge((lispobj *) th->binding_stack_start,len);
 #ifdef LISP_FEATURE_SB_THREAD
-         /* do the tls as well */
-         len=fixnum_value(SymbolValue(FREE_TLS_INDEX,0)) -
-             (sizeof (struct thread))/(sizeof (lispobj));
-         scavenge((lispobj *) (th+1),len);
+            /* do the tls as well */
+            len=fixnum_value(SymbolValue(FREE_TLS_INDEX,0)) -
+                (sizeof (struct thread))/(sizeof (lispobj));
+            scavenge((lispobj *) (th+1),len);
 #endif
         }
     }