PatchSet 6931 
Date: 2005/09/24 19:00:43
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Kaffe-GC fix for heap growing.

        * kaffe/kaffevm/kaffe-gc/gc-mem.c
        (gc_block_alloc): Handle heap growing backward. Fixed initialization
        of the block array.
        (gc_heap_grow): If blocks are prepended update gc_first_block and not
        gc_last_block.
        (gc_first_block): New pointer to hold the first block in the primitive 
block
        list.

Members: 
        ChangeLog:1.4453->1.4454 
        kaffe/kaffevm/kaffe-gc/gc-mem.c:1.33->1.34 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4453 kaffe/ChangeLog:1.4454
--- kaffe/ChangeLog:1.4453      Fri Sep 23 16:31:52 2005
+++ kaffe/ChangeLog     Sat Sep 24 19:00:43 2005
@@ -1,3 +1,13 @@
+2005-09-24  Guilhem Lavaux  <[EMAIL PROTECTED]>
+
+       * kaffe/kaffevm/kaffe-gc/gc-mem.c
+       (gc_block_alloc): Handle heap growing backward. Fixed initialization
+       of the block array.
+       (gc_heap_grow): If blocks are prepended update gc_first_block and not
+       gc_last_block.
+       (gc_first_block): New pointer to hold the first block in the primitive 
block
+       list.
+
 2005-09-23  Gwenole Beauchesne  <[EMAIL PROTECTED]>
 
        * libraries/clib/fdlibm/: Such an ancient code assumed "long" as a
Index: kaffe/kaffe/kaffevm/kaffe-gc/gc-mem.c
diff -u kaffe/kaffe/kaffevm/kaffe-gc/gc-mem.c:1.33 
kaffe/kaffe/kaffevm/kaffe-gc/gc-mem.c:1.34
--- kaffe/kaffe/kaffevm/kaffe-gc/gc-mem.c:1.33  Sat Aug 20 22:59:43 2005
+++ kaffe/kaffe/kaffevm/kaffe-gc/gc-mem.c       Sat Sep 24 19:00:45 2005
@@ -40,6 +40,7 @@
 #endif
 
 static gc_block *gc_last_block;
+static gc_block *gc_first_block;
 static gc_block *gc_reserve_pages;
 static iStaticLock     gc_heap_lock;
 
@@ -1181,8 +1182,22 @@
                        memcpy(gc_block_base, old_blocks, onb * 
sizeof(gc_block));
                        free(old_blocks);
                }
-
                DBG(GCSYSALLOC, dprintf("old block_base = %p, new block_base = 
%p\n", old_blocks, gc_block_base));
+               if (heap_addr < gc_heap_base) {
+                 int32 i, j, oldBase;
+                 gc_block *b = (gc_block *) gc_block_base;
+
+                 oldBase = (gc_heap_base - heap_addr) >> gc_pgbits;
+
+                 for (i=(onb-1),j=(oldBase+onb-1); i >= 0; i--,j--)
+                       memcpy(&b[j], &b[i], sizeof(gc_block));
+
+                 memset((gc_block *)gc_block_base, 0,
+                        (gc_num_blocks - onb) * sizeof(gc_block));
+               } else {
+                 memset(((gc_block *)gc_block_base) + onb, 0,
+                        (gc_num_blocks - onb) * sizeof(gc_block));
+               }
                /* If the array's address has changed, we have to fix
                   up the pointers in the gc_blocks, as well as all
                   external pointers to the gc_blocks.  We can only
@@ -1206,9 +1221,6 @@
                                R(gc_freeobj, b[i].free);
                          }
 
-                       memset(b + onb, 0,
-                              (gc_num_blocks - onb) * sizeof(gc_block));
-
                        for (i = 0; i<=KGC_PRIM_LIST_COUNT; i++)
                                R(gc_block, gc_prim_freelist[i]);
 
@@ -1217,6 +1229,7 @@
 
                        R(gc_block, gc_reserve_pages);
                        R(gc_block, gc_last_block);
+                       R(gc_block, gc_first_block);
 #undef R
                }
                KTHREAD(spinoff)(NULL);
@@ -1225,6 +1238,9 @@
        gc_num_live_pages += size_pg;
        last_addr = MAX(last_addr, heap_addr + size);
        gc_heap_range = last_addr - gc_heap_base;
+       if (gc_heap_base > heap_addr)
+         gc_heap_base = heap_addr;
+
        DBG(GCSYSALLOC, dprintf("%ld unused bytes in heap addr range\n",
                                (long) (gc_heap_range - gc_heap_total)));
 #if defined(KAFFE_VMDEBUG)
@@ -1291,8 +1307,15 @@
 
        /* maintain list of primitive blocks */
        if (gc_last_block) {
-               gc_last_block->pnext = blk;
-               blk->pprev = gc_last_block;
+               if (gc_last_block < blk) {
+                       gc_last_block->pnext = blk;
+                       blk->pprev = gc_last_block;
+               } else {
+                       assert(gc_first_block->pprev == NULL);
+                       gc_first_block->pprev = blk;
+                       blk->pnext = gc_first_block;
+                       gc_first_block = blk;
+               }
        }
        
        gc_last_block = blk;

_______________________________________________
kaffe mailing list
[email protected]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to