[svn:parrot] r49336 - branches/generational_gc/src/gc

bacek at svn.parrot.org bacek at svn.parrot.org
Sun Sep 26 04:04:15 UTC 2010


Author: bacek
Date: Sun Sep 26 04:04:14 2010
New Revision: 49336
URL: https://trac.parrot.org/parrot/changeset/49336

Log:
Implement write barrier in GC MS2

Modified:
   branches/generational_gc/src/gc/gc_ms2.c

Modified: branches/generational_gc/src/gc/gc_ms2.c
==============================================================================
--- branches/generational_gc/src/gc/gc_ms2.c	Sun Sep 26 03:43:57 2010	(r49335)
+++ branches/generational_gc/src/gc/gc_ms2.c	Sun Sep 26 04:04:14 2010	(r49336)
@@ -294,6 +294,10 @@
 static void gc_ms2_unblock_GC_sweep(PARROT_INTERP)
         __attribute__nonnull__(1);
 
+static void gc_ms2_write_barrier(PARROT_INTERP, ARGIN(PMC *pmc))
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2);
+
 #define ASSERT_ARGS_failed_allocation __attribute__unused__ int _ASSERT_ARGS_CHECK = (0)
 #define ASSERT_ARGS_gc_ms2_allocate_buffer_header __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
@@ -407,6 +411,9 @@
        PARROT_ASSERT_ARG(interp))
 #define ASSERT_ARGS_gc_ms2_unblock_GC_sweep __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp))
+#define ASSERT_ARGS_gc_ms2_write_barrier __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(pmc))
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 /* HEADERIZER END: static */
 
@@ -594,38 +601,38 @@
     /* We have to transfer ownership of memory to parent interp in threaded parrot */
     interp->gc_sys->finalize_gc_system = NULL; /* gc_ms2_finalize; */
 
-    interp->gc_sys->do_gc_mark              = gc_ms2_mark_and_sweep;
-    interp->gc_sys->compact_string_pool     = gc_ms2_compact_memory_pool;
+    interp->gc_sys->do_gc_mark                  = gc_ms2_mark_and_sweep;
+    interp->gc_sys->compact_string_pool         = gc_ms2_compact_memory_pool;
 
     /*
     interp->gc_sys->mark_special                = gc_ms2_mark_special;
     */
     interp->gc_sys->pmc_needs_early_collection  = gc_ms2_pmc_needs_early_collection;
 
-    interp->gc_sys->allocate_pmc_header     = gc_ms2_allocate_pmc_header;
-    interp->gc_sys->free_pmc_header         = gc_ms2_free_pmc_header;
+    interp->gc_sys->allocate_pmc_header         = gc_ms2_allocate_pmc_header;
+    interp->gc_sys->free_pmc_header             = gc_ms2_free_pmc_header;
 
-    interp->gc_sys->allocate_string_header  = gc_ms2_allocate_string_header;
-    interp->gc_sys->free_string_header      = gc_ms2_free_string_header;
+    interp->gc_sys->allocate_string_header      = gc_ms2_allocate_string_header;
+    interp->gc_sys->free_string_header          = gc_ms2_free_string_header;
 
     interp->gc_sys->allocate_bufferlike_header  = gc_ms2_allocate_buffer_header;
     interp->gc_sys->free_bufferlike_header      = gc_ms2_free_buffer_header;
 
-    interp->gc_sys->allocate_pmc_attributes = gc_ms2_allocate_pmc_attributes;
-    interp->gc_sys->free_pmc_attributes     = gc_ms2_free_pmc_attributes;
+    interp->gc_sys->allocate_pmc_attributes     = gc_ms2_allocate_pmc_attributes;
+    interp->gc_sys->free_pmc_attributes         = gc_ms2_free_pmc_attributes;
 
-    interp->gc_sys->is_pmc_ptr              = gc_ms2_is_pmc_ptr;
-    interp->gc_sys->is_string_ptr           = gc_ms2_is_string_ptr;
-    interp->gc_sys->mark_pmc_header         = gc_ms2_mark_pmc_header;
-    interp->gc_sys->mark_pobj_header        = gc_ms2_mark_pobj_header;
-
-    interp->gc_sys->block_mark      = gc_ms2_block_GC_mark;
-    interp->gc_sys->unblock_mark    = gc_ms2_unblock_GC_mark;
-    interp->gc_sys->is_blocked_mark = gc_ms2_is_blocked_GC_mark;
-
-    interp->gc_sys->block_sweep      = gc_ms2_block_GC_sweep;
-    interp->gc_sys->unblock_sweep    = gc_ms2_unblock_GC_sweep;
-    interp->gc_sys->is_blocked_sweep = gc_ms2_is_blocked_GC_sweep;
+    interp->gc_sys->is_pmc_ptr                  = gc_ms2_is_pmc_ptr;
+    interp->gc_sys->is_string_ptr               = gc_ms2_is_string_ptr;
+    interp->gc_sys->mark_pmc_header             = gc_ms2_mark_pmc_header;
+    interp->gc_sys->mark_pobj_header            = gc_ms2_mark_pobj_header;
+
+    interp->gc_sys->block_mark                  = gc_ms2_block_GC_mark;
+    interp->gc_sys->unblock_mark                = gc_ms2_unblock_GC_mark;
+    interp->gc_sys->is_blocked_mark             = gc_ms2_is_blocked_GC_mark;
+
+    interp->gc_sys->block_sweep                 = gc_ms2_block_GC_sweep;
+    interp->gc_sys->unblock_sweep               = gc_ms2_unblock_GC_sweep;
+    interp->gc_sys->is_blocked_sweep            = gc_ms2_is_blocked_GC_sweep;
 
     interp->gc_sys->allocate_string_storage     = gc_ms2_allocate_string_storage;
     interp->gc_sys->reallocate_string_storage   = gc_ms2_reallocate_string_storage;
@@ -637,17 +644,18 @@
     interp->gc_sys->free_fixed_size_storage     = gc_ms2_free_fixed_size_storage;
 
     /* We don't distinguish between chunk and chunk_with_pointers */
-    interp->gc_sys->allocate_memory_chunk   = gc_ms2_allocate_memory_chunk;
-    interp->gc_sys->reallocate_memory_chunk = gc_ms2_reallocate_memory_chunk;
+    interp->gc_sys->allocate_memory_chunk       = gc_ms2_allocate_memory_chunk;
+    interp->gc_sys->reallocate_memory_chunk     = gc_ms2_reallocate_memory_chunk;
     interp->gc_sys->allocate_memory_chunk_with_interior_pointers
                 = gc_ms2_allocate_memory_chunk_zeroed;
     interp->gc_sys->reallocate_memory_chunk_with_interior_pointers
                 = gc_ms2_reallocate_memory_chunk_zeroed;
-    interp->gc_sys->free_memory_chunk       = gc_ms2_free_memory_chunk;
+    interp->gc_sys->free_memory_chunk           = gc_ms2_free_memory_chunk;
 
-    interp->gc_sys->iterate_live_strings = gc_ms2_iterate_live_strings;
+    interp->gc_sys->iterate_live_strings        = gc_ms2_iterate_live_strings;
+    interp->gc_sys->write_barrier               = gc_ms2_write_barrier;
 
-    interp->gc_sys->get_gc_info      = gc_ms2_get_gc_info;
+    interp->gc_sys->get_gc_info                 = gc_ms2_get_gc_info;
 
     if (interp->parent_interpreter && interp->parent_interpreter->gc_sys) {
         /* This is a "child" interpreter. Just reuse parent one */
@@ -1465,6 +1473,23 @@
 }
 
 /*
+=item C<static void gc_ms2_write_barrier(PARROT_INTERP, PMC *pmc)>
+
+WriteBarrier for PMC. Add to root_objects list for mandatory next collecting.
+
+=cut
+*/
+static void
+gc_ms2_write_barrier(PARROT_INTERP, ARGIN(PMC *pmc))
+{
+    ASSERT_ARGS(gc_ms2_write_barrier)
+    MarkSweep_GC     *self = (MarkSweep_GC *)interp->gc_sys->gc_private;
+    List_Item_Header *item = Obj2LLH(pmc);
+    LIST_REMOVE(self->objects[PObj_to_generation(pmc)], item);
+    LIST_APPEND(self->root_objects, item);
+}
+
+/*
 
 =item C<static size_t gc_ms2_count_used_string_memory(PARROT_INTERP, Linked_List
 *list)>


More information about the parrot-commits mailing list