0.8.7.21:
authorChristophe Rhodes <csr21@cam.ac.uk>
Fri, 23 Jan 2004 16:52:28 +0000 (16:52 +0000)
committerChristophe Rhodes <csr21@cam.ac.uk>
Fri, 23 Jan 2004 16:52:28 +0000 (16:52 +0000)
Dan's GC fragmentation fix
... & BOXED_REGION
... it builds, builds itself, doesn't break on PFD's tests;
that's good enough for me :-)
... I think I've summarized the "bug fix" right in NEWS, but
do correct if not.

NEWS
src/runtime/gencgc.c
version.lisp-expr

diff --git a/NEWS b/NEWS
index 176d94e..ee020d9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2237,15 +2237,19 @@ changes in sbcl-0.8.8 relative to sbcl-0.8.7:
   * bug fix: DECODE-UNIVERSAL-TIME now accepts timezone arguments with
     second-resolution: integer multiples of 1/3600 between -24 and 24.
     (thanks to Vincent Arkesteijn)
+  * bug fix: functions =, /=, <, <=, >, >= did not check the argument
+    type when called with 1 argument; PEEK-CHAR checked type of
+    PEEK-TYPE only after having read first character from a
+    stream.  (reported by Peter Graves)
+  * bug fix: the garbage collector now has much better locality
+    behaviour, and in particular no longer treats all memory as being
+    exhausted when many small objects point to each other in a deeply
+    recursive manner.
   * optimization: implemented multiplication as a modular
     (UNSIGNED-BYTE 32) operation on the x86 backend.
   * optimization: SEARCH on simple-base-strings can now be open-coded.
     (see also contrib/compiler-extras.lisp for inspiration for
     teaching the compiler about the Boyer-Moore algorithm).
-  * bug fix: functions =, /=, <, <=, >, >= did not check the argument
-    type when called with 1 argument; PEEK-CHAR checked type of
-    PEEK-TYPE only after having read first character from a
-    stream. (reported by Peter Graves)
   * fixed some bugs revealed by Paul Dietz' test suite:
     ** in stack analysis liveness information is propagated from
        non-local entry points.
index e350702..5914f6f 100644 (file)
@@ -966,16 +966,6 @@ gc_find_freeish_pages(int *restart_page_ptr, int nbytes, int unboxed)
                    (unboxed ? UNBOXED_PAGE : BOXED_PAGE)) &&
                   (page_table[first_page].large_object == 0) &&
                   (page_table[first_page].gen == gc_alloc_generation) &&
-                  /* FIXME: Why?  Please tell me why?  Removal of
-                     this test, which restricts opening an allocation
-                     region on a partially-used page to the nursery
-                     generation, causes more or less instant heap
-                     corruption on forms such as 
-                        (loop repeat 2 
-                              do (compile nil '(lambda (x) x)) 
-                              do (gc :full t))
-                     -- CSR, 2003-01-14 */
-                  (gc_alloc_generation == 0) &&
                   (page_table[first_page].bytes_used < (PAGE_BYTES-32)) &&
                   (page_table[first_page].write_protected == 0) &&
                   (page_table[first_page].dont_move == 0)) {
@@ -2763,7 +2753,7 @@ scavenge_newspace_generation_one_scan(int generation)
           generation));
     for (i = 0; i < last_free_page; i++) {
        /* note that this skips over open regions when it encounters them */
-       if ((page_table[i].allocated == BOXED_PAGE)
+       if ((page_table[i].allocated & BOXED_PAGE)
            && (page_table[i].bytes_used != 0)
            && (page_table[i].gen == generation)
            && ((page_table[i].write_protected == 0)
index cfd6bd6..e847bcc 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.8.7.20"
+"0.8.7.21"