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

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


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

Log:
Use Memory_Block->freed for calculating skip list

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

Modified: branches/compact_pool_revamp/src/gc/alloc_resources.c
==============================================================================
--- branches/compact_pool_revamp/src/gc/alloc_resources.c	Mon Apr 19 13:43:16 2010	(r45801)
+++ branches/compact_pool_revamp/src/gc/alloc_resources.c	Mon Apr 19 13:43:28 2010	(r45802)
@@ -56,14 +56,6 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
-static void calculate_blocks_usage(PARROT_INTERP,
-    ARGIN(Memory_Block *top_block),
-    ARGMOD(Buffer *buf))
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(2)
-        __attribute__nonnull__(3)
-        FUNC_MODIFIES(*buf);
-
 static void check_fixed_size_obj_pool(ARGIN(const Fixed_Size_Pool *pool))
         __attribute__nonnull__(1);
 
@@ -168,10 +160,6 @@
 #define ASSERT_ARGS_buffer_location __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(b))
-#define ASSERT_ARGS_calculate_blocks_usage __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(interp) \
-    , PARROT_ASSERT_ARG(top_block) \
-    , PARROT_ASSERT_ARG(buf))
 #define ASSERT_ARGS_check_fixed_size_obj_pool __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(pool))
 #define ASSERT_ARGS_check_memory_system __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
@@ -488,8 +476,8 @@
     mem_pools->gc_collect_runs++;
 
     /* Calculate how many blocks do we have and reset used_amount */
+    // TODO Keep this number and don't recalculate it! */
     for (tmp = pool->top_block; tmp; tmp = tmp->prev) {
-        tmp->used = 0;
         ++total_blocks;
     }
 
@@ -497,30 +485,6 @@
     skip_blocks = (Memory_Block**)Parrot_gc_allocate_fixed_size_storage(interp,
                         sizeof (Memory_Block**) * total_blocks);
 
-    /* Calculate blocks used amount */
-    for (j = (INTVAL)mem_pools->num_sized - 1; j >= 0; --j) {
-        Fixed_Size_Pool * const header_pool = mem_pools->sized_header_pools[j];
-        UINTVAL       object_size;
-
-        if (!header_pool)
-            continue;
-
-        object_size = header_pool->object_size;
-
-        for (cur_buffer_arena = header_pool->last_Arena;
-                cur_buffer_arena;
-                cur_buffer_arena = cur_buffer_arena->prev) {
-            Buffer *b = (Buffer *) cur_buffer_arena->start_objects;
-            UINTVAL i;
-            const size_t objects_end = cur_buffer_arena->used;
-
-            for (i = objects_end; i; --i) {
-                calculate_blocks_usage(interp, pool->top_block, b);
-                b = (Buffer *)((char *)b + object_size);
-            }
-        }
-    }
-
     /* Snag a block big enough for everything */
     total_size = pad_pool_size(pool, skip_blocks, &skip_blocks_count);
 
@@ -588,8 +552,9 @@
 
     free_old_mem_blocks(mem_pools, pool, new_block, total_size, skip_blocks, skip_blocks_count);
 
-    Parrot_gc_free_fixed_size_storage(interp,
-            sizeof (Memory_Block**) * total_blocks, skip_blocks);
+    if (total_blocks)
+        Parrot_gc_free_fixed_size_storage(interp,
+                sizeof (Memory_Block**) * total_blocks, skip_blocks);
 
     --mem_pools->gc_sweep_block_level;
 }
@@ -635,14 +600,14 @@
     size_t skip_pos    = 0;
 
     while (cur_block) {
-        if (cur_block->size * 0.4 > (cur_block->size - cur_block->used)) {
+        if (cur_block->size * 0.2 > cur_block->freed) {
             /* Don't reclaim almost filled blocks */
             /* TODO Keep blocks ordered by block->start to use binary search */
             skip_blocks[skip_pos++] = cur_block;
         }
         else {
             //total_size += cur_block->size - cur_block->free;
-            total_size += cur_block->used;
+            total_size += cur_block->size - cur_block->freed;
         }
         cur_block   = cur_block->prev;
     }
@@ -771,58 +736,6 @@
 
 /*
 
-=item C<static void calculate_blocks_usage(PARROT_INTERP, Memory_Block
-*top_block, Buffer *buf)>
-
-To detect which Memory_Blocks should be skipped during compacting we do need
-to calculate real usage.
-
-=cut
-
-*/
-
-static void
-calculate_blocks_usage(PARROT_INTERP, ARGIN(Memory_Block *top_block), ARGMOD(Buffer *buf))
-{
-    ASSERT_ARGS(calculate_blocks_usage)
-    /* ! (on_free_list | constant | external | sysmem) */
-    if (Buffer_buflen(buf) && PObj_is_movable_TESTALL(buf)) {
-        INTVAL *ref_count = NULL;
-
-        if (PObj_is_COWable_TEST(buf)) {
-            ref_count = Buffer_bufrefcountptr(buf);
-        }
-
-        if (PObj_COW_TEST(buf)
-            && (ref_count && *ref_count & Buffer_counted_FLAG)) {
-            /* Skip counting of COWed buffers */
-            return;
-        }
-        else {
-            /* Find our block */
-            while (top_block) {
-                if (top_block->start <= (char*)Buffer_bufstart(buf)
-                    && (char*)Buffer_bufstart(buf) < top_block->top) {
-                    /* ... and update usage */
-                    top_block->used += aligned_string_size(Buffer_buflen(buf));
-                    break;
-                }
-
-                top_block = top_block->prev;
-            }
-            /* If we're COW */
-            if (PObj_COW_TEST(buf)) {
-                /* Set counted flag so we will not add it again to usage */
-                if (ref_count)
-                    *ref_count = Buffer_counted_FLAG;
-            }
-        }
-    }
-
-}
-
-/*
-
 =item C<static void free_old_mem_blocks( Memory_Pools *mem_pools,
 Variable_Size_Pool *pool, Memory_Block *new_block, UINTVAL total_size,
 Memory_Block **skip_blocks, size_t skip_blocks_count)>

Modified: branches/compact_pool_revamp/src/gc/gc_private.h
==============================================================================
--- branches/compact_pool_revamp/src/gc/gc_private.h	Mon Apr 19 13:43:16 2010	(r45801)
+++ branches/compact_pool_revamp/src/gc/gc_private.h	Mon Apr 19 13:43:28 2010	(r45802)
@@ -172,8 +172,7 @@
     char *start;
     char *top;
 
-    /* Actually used size. Used in compact_pool */
-    size_t used;
+    /* Amount of freed memory. Used in compact_pool */
     size_t freed;
 } Memory_Block;
 


More information about the parrot-commits mailing list