[svn:parrot] r45801 - branches/compact_pool_revamp/src/gc

bacek at svn.parrot.org bacek at svn.parrot.org
Mon Apr 19 13:43:16 UTC 2010


Author: bacek
Date: Mon Apr 19 13:43:16 2010
New Revision: 45801
URL: https://trac.parrot.org/parrot/changeset/45801

Log:
Start calculating actually freed space in Memory_Blocks

Modified:
   branches/compact_pool_revamp/src/gc/gc_private.h
   branches/compact_pool_revamp/src/gc/mark_sweep.c

Modified: branches/compact_pool_revamp/src/gc/gc_private.h
==============================================================================
--- branches/compact_pool_revamp/src/gc/gc_private.h	Mon Apr 19 13:15:18 2010	(r45800)
+++ branches/compact_pool_revamp/src/gc/gc_private.h	Mon Apr 19 13:43:16 2010	(r45801)
@@ -174,6 +174,7 @@
 
     /* Actually used size. Used in compact_pool */
     size_t used;
+    size_t freed;
 } Memory_Block;
 
 typedef struct Variable_Size_Pool {

Modified: branches/compact_pool_revamp/src/gc/mark_sweep.c
==============================================================================
--- branches/compact_pool_revamp/src/gc/mark_sweep.c	Mon Apr 19 13:15:18 2010	(r45800)
+++ branches/compact_pool_revamp/src/gc/mark_sweep.c	Mon Apr 19 13:43:16 2010	(r45801)
@@ -704,13 +704,49 @@
     ASSERT_ARGS(free_buffer)
     Variable_Size_Pool * const mem_pool = (Variable_Size_Pool *)pool->mem_pool;
 
+    /* If this is header for external buffer - bail out */
+    if (PObj_external_TEST(b))
+        return;
+
     /* XXX Jarkko reported that on irix pool->mem_pool was NULL, which really
      * shouldn't happen */
     if (mem_pool) {
-        if (!PObj_COW_TEST(b))
+        /* Update Memory_Block usage */
+        Memory_Block * block = mem_pool->top_block;
+        INTVAL *ref_count = NULL;
+
+        if (PObj_is_COWable_TEST(b)) {
+            ref_count = Buffer_bufrefcountptr(b);
+        }
+
+
+        if (!PObj_COW_TEST(b)) {
             mem_pool->guaranteed_reclaimable += Buffer_buflen(b);
-        else
+        }
+        else {
             mem_pool->possibly_reclaimable   += Buffer_buflen(b);
+
+            /* If block was already moved - skip it */
+            if (ref_count && *ref_count & Buffer_counted_FLAG)
+                return;
+
+            /* Set counted flag */
+            if (ref_count)
+                *ref_count |= Buffer_counted_FLAG;
+        }
+
+        /* Find our block */
+        while (block) {
+            if (block->start <= (char*)Buffer_bufstart(b)
+                && (char*)Buffer_bufstart(b) < block->top) {
+                /* ... and update usage */
+                block->freed += aligned_string_size(Buffer_buflen(b));
+                break;
+            }
+
+            block = block->prev;
+        }
+
     }
 
     Buffer_buflen(b) = 0;


More information about the parrot-commits mailing list