[svn:parrot] r49346 - branches/gc_ms2_tuning/src/gc

nwellnhof at svn.parrot.org nwellnhof at svn.parrot.org
Sun Sep 26 17:19:13 UTC 2010


Author: nwellnhof
Date: Sun Sep 26 17:19:13 2010
New Revision: 49346
URL: https://trac.parrot.org/parrot/changeset/49346

Log:
[gc] Only use a single pass over string headers

Modified:
   branches/gc_ms2_tuning/src/gc/gc_ms.c
   branches/gc_ms2_tuning/src/gc/gc_ms2.c
   branches/gc_ms2_tuning/src/gc/string_gc.c

Modified: branches/gc_ms2_tuning/src/gc/gc_ms.c
==============================================================================
--- branches/gc_ms2_tuning/src/gc/gc_ms.c	Sun Sep 26 17:18:51 2010	(r49345)
+++ branches/gc_ms2_tuning/src/gc/gc_ms.c	Sun Sep 26 17:19:13 2010	(r49346)
@@ -615,7 +615,7 @@
     }
 
     /* compact STRING pools to collect free headers and allocated buffers */
-    Parrot_gc_compact_memory_pool(interp);
+    Parrot_gc_str_compact_pool(interp, &mem_pools->string_gc);
 
     pt_gc_stop_mark(interp);
 
@@ -644,7 +644,19 @@
 gc_ms_compact_memory_pool(PARROT_INTERP)
 {
     ASSERT_ARGS(gc_ms_compact_memory_pool)
-    Parrot_gc_str_compact_pool(interp, &interp->mem_pools->string_gc);
+    Memory_Pools * const mem_pools = interp->mem_pools;
+
+    if (mem_pools->gc_sweep_block_level)
+        return;
+
+    if (mem_pools->gc_mark_block_level) {
+        /* We currently don't compact without marking, so we simply fake a
+           collect run. */
+        ++interp->gc_sys->stats.gc_collect_runs;
+        return;
+    }
+
+    gc_ms_mark_and_sweep(interp, GC_trace_stack_FLAG);
 }
 
 /*

Modified: branches/gc_ms2_tuning/src/gc/gc_ms2.c
==============================================================================
--- branches/gc_ms2_tuning/src/gc/gc_ms2.c	Sun Sep 26 17:18:51 2010	(r49345)
+++ branches/gc_ms2_tuning/src/gc/gc_ms2.c	Sun Sep 26 17:19:13 2010	(r49346)
@@ -221,10 +221,6 @@
         __attribute__nonnull__(2)
         __attribute__nonnull__(3);
 
-static void gc_ms2_sweep_string_cb(PARROT_INTERP, ARGIN(PObj *obj))
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(2);
-
 static void gc_ms2_unblock_GC_mark(PARROT_INTERP)
         __attribute__nonnull__(1);
 
@@ -323,9 +319,6 @@
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(pool) \
     , PARROT_ASSERT_ARG(callback))
-#define ASSERT_ARGS_gc_ms2_sweep_string_cb __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
-       PARROT_ASSERT_ARG(interp) \
-    , PARROT_ASSERT_ARG(obj))
 #define ASSERT_ARGS_gc_ms2_unblock_GC_mark __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
 #define ASSERT_ARGS_gc_ms2_unblock_GC_sweep __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
@@ -370,7 +363,18 @@
 {
     ASSERT_ARGS(gc_ms2_compact_memory_pool)
     MarkSweep_GC *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
-    Parrot_gc_str_compact_pool(interp, &self->string_gc);
+
+    if (self->gc_sweep_block_level)
+        return;
+
+    if (self->gc_mark_block_level) {
+        /* We currently don't compact without marking, so we simply fake a
+           collect run. */
+        ++interp->gc_sys->stats.gc_collect_runs;
+        return;
+    }
+
+    gc_ms2_mark_and_sweep(interp, GC_trace_stack_FLAG);
 }
 
 /*
@@ -890,29 +894,6 @@
 
 /*
 
-=item C<static void gc_ms2_sweep_string_cb(PARROT_INTERP, PObj *obj)>
-
-destroy string *obj
-
-=cut
-
-*/
-
-static void
-gc_ms2_sweep_string_cb(PARROT_INTERP, ARGIN(PObj *obj))
-{
-    ASSERT_ARGS(gc_ms2_sweep_string_cb)
-    MarkSweep_GC *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
-    Buffer       *str  = (Buffer *)obj;
-    /* Compact string pool here. Or get rid of "shared buffers" and just free storage */
-    if (Buffer_bufstart(str) && !PObj_external_TEST(str) && !PObj_sysmem_TEST(str))
-        Parrot_gc_str_free_buffer_storage(interp, &self->string_gc, str);
-    interp->gc_sys->stats.memory_used -= sizeof (STRING);
-}
-
-
-/*
-
 =item C<static void gc_ms2_iterate_live_strings(PARROT_INTERP,
 string_iterator_callback callback, void *data)>
 
@@ -938,8 +919,22 @@
         for (i = 0; i < pool->objects_per_alloc; ++i) {
             Buffer *str = (Buffer *)ptr;
 
-            if (str->flags && !PObj_on_free_list_TEST(str))
-                callback(interp, str, data);
+            if (PObj_live_TEST(str)) {
+                /* Paint live objects white */
+                PObj_live_CLEAR(str);
+
+                if (!PObj_constant_TEST(str))
+                    callback(interp, str, data);
+            }
+            else if (str->flags
+                  && !PObj_constant_TEST(str)
+                  && !PObj_on_free_list_TEST(str)) {
+                PObj_on_free_list_SET(str);
+
+                Parrot_gc_pool_free(interp, pool, (PObj *)str);
+
+                interp->gc_sys->stats.memory_used -= sizeof (STRING);
+            }
 
             ptr += pool->object_size;
         }
@@ -993,9 +988,8 @@
     /* Now, all live objects are marked. Walk through the pools, sweep all
        dead objects and clear the live flag of live objects. */
     gc_ms2_sweep_pool(interp, self->pmc_allocator, gc_ms2_sweep_pmc_cb);
-    gc_ms2_sweep_pool(interp, self->string_allocator, gc_ms2_sweep_string_cb);
 
-    gc_ms2_compact_memory_pool(interp);
+    Parrot_gc_str_compact_pool(interp, &self->string_gc);
 
     stats = &interp->gc_sys->stats;
     stats->mem_used_last_collect = stats->memory_used;

Modified: branches/gc_ms2_tuning/src/gc/string_gc.c
==============================================================================
--- branches/gc_ms2_tuning/src/gc/string_gc.c	Sun Sep 26 17:18:51 2010	(r49345)
+++ branches/gc_ms2_tuning/src/gc/string_gc.c	Sun Sep 26 17:19:13 2010	(r49346)
@@ -761,24 +761,12 @@
 
     Fixed_Size_Arena *cur_buffer_arena;
 
-    /* Bail if we're blocked */
-    if (Parrot_is_blocked_GC_sweep(interp))
-        return;
-
-    Parrot_block_GC_sweep(interp);
-
     /* We're collecting */
     ++stats->gc_collect_runs;
 
     /* Snag a block big enough for everything */
     total_size = pad_pool_size(pool);
 
-    if (total_size == 0) {
-        free_old_mem_blocks(stats, pool, pool->top_block, total_size);
-        Parrot_unblock_GC_sweep(interp);
-        return;
-    }
-
     alloc_new_block(stats, total_size, pool, "inside compact");
     new_block = pool->top_block;
 
@@ -796,8 +784,6 @@
     stats->memory_used      += new_size;
 
     free_old_mem_blocks(stats, pool, new_block, total_size);
-
-    Parrot_unblock_GC_sweep(interp);
 }
 
 /*


More information about the parrot-commits mailing list