1.0.6.9: micro-optimize portions of the reader
[sbcl.git] / src / runtime / gencgc.c
index 75ee8bb..3b2f2f0 100644 (file)
@@ -145,11 +145,8 @@ boolean gencgc_partial_pickup = 0;
 
 /* the total bytes allocated. These are seen by Lisp DYNAMIC-USAGE. */
 unsigned long bytes_allocated = 0;
-extern unsigned long bytes_consed_between_gcs; /* gc-common.c */
 unsigned long auto_gc_trigger = 0;
 
-size_t dynamic_space_size = DEFAULT_DYNAMIC_SPACE_SIZE;
-
 /* the source and destination generations. These are set before a GC starts
  * scavenging. */
 generation_index_t from_space;
@@ -3825,6 +3822,22 @@ preserve_context_registers (os_context_t *c)
     preserve_pointer((void*)*os_context_register_addr(c,reg_ESI));
     preserve_pointer((void*)*os_context_register_addr(c,reg_EDI));
     preserve_pointer((void*)*os_context_pc_addr(c));
+#elif defined LISP_FEATURE_X86_64
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RAX));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RCX));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RDX));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RBX));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RSI));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_RDI));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R8));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R9));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R10));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R11));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R12));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R13));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R14));
+    preserve_pointer((void*)*os_context_register_addr(c,reg_R15));
+    preserve_pointer((void*)*os_context_pc_addr(c));
 #else
     #error "preserve_context_registers needs to be tweaked for non-x86 Darwin"
 #endif
@@ -4410,7 +4423,7 @@ gc_init(void)
     /* Compute the number of pages needed for the dynamic space.
      * Dynamic space size should be aligned on page size. */
     page_table_pages = dynamic_space_size/PAGE_BYTES;
-    gc_assert(dynamic_space_size == page_table_pages*PAGE_BYTES);
+    gc_assert(dynamic_space_size == (size_t) page_table_pages*PAGE_BYTES);
 
     page_table = calloc(page_table_pages, sizeof(struct page));
     gc_assert(page_table);
@@ -4546,8 +4559,12 @@ alloc(long nbytes)
 #else
         &boxed_region;
 #endif
+#ifndef LISP_FEATURE_WIN32
+    lispobj alloc_signal;
+#endif
     void *new_obj;
     void *new_free_pointer;
+
     gc_assert(nbytes>0);
 
     /* Check for alignment allocation problems. */
@@ -4599,6 +4616,24 @@ alloc(long nbytes)
         }
     }
     new_obj = gc_alloc_with_region(nbytes,0,region,0);
+
+#ifndef LISP_FEATURE_WIN32
+    alloc_signal = SymbolValue(ALLOC_SIGNAL,thread);
+    if ((alloc_signal & FIXNUM_TAG_MASK) == 0) {
+        if ((signed long) alloc_signal <= 0) {
+#ifdef LISP_FEATURE_SB_THREAD
+            kill_thread_safely(thread->os_thread, SIGPROF);
+#else
+            raise(SIGPROF);
+#endif
+        } else {
+            SetSymbolValue(ALLOC_SIGNAL,
+                           alloc_signal - (1 << N_FIXNUM_TAG_BITS),
+                           thread);
+        }
+    }
+#endif
+
     return (new_obj);
 }
 \f