[svn:parrot] r47371 - branches/gc_massacre/src/gc

bacek at svn.parrot.org bacek at svn.parrot.org
Sat Jun 5 00:49:42 UTC 2010


Author: bacek
Date: Sat Jun  5 00:49:42 2010
New Revision: 47371
URL: https://trac.parrot.org/parrot/changeset/47371

Log:
Sligtly optimize allocation strategy.

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

Modified: branches/gc_massacre/src/gc/gc_ms2.c
==============================================================================
--- branches/gc_massacre/src/gc/gc_ms2.c	Sat Jun  5 00:22:20 2010	(r47370)
+++ branches/gc_massacre/src/gc/gc_ms2.c	Sat Jun  5 00:49:42 2010	(r47371)
@@ -30,6 +30,9 @@
     struct Pool_Allocator *string_allocator;
     struct Linked_List    *strings;
 
+    /* Number of allocated objects before trigger gc */
+    size_t gc_theshold;
+
     /** statistics for GC **/
     size_t  gc_mark_runs;       /* Number of times we've done a mark run */
     size_t  gc_lazy_mark_runs;  /* Number of successful lazy mark runs */
@@ -600,6 +603,8 @@
             sizeof (List_Item_Header) + sizeof (STRING));
         self->strings = Parrot_gc_allocate_linked_list(interp);
 
+        /* Arbitary number */
+        self->gc_theshold = 4096 * 10;
     }
     interp->gc_sys->gc_private = self;
 }
@@ -615,7 +620,8 @@
     PMC              *ret;
 
     /* Invoke M&S early. Freshly allocated "header" isn't header yet */
-    if (++self->header_allocs_since_last_collect > 1024) {
+    if ((++self->header_allocs_since_last_collect > self->gc_theshold)
+        && self->pmc_allocator->num_free_objects <= 1) {
         gc_ms2_mark_and_sweep(interp, 0);
     }
 
@@ -716,7 +722,8 @@
     List_Item_Header *ptr;
     STRING           *ret;
 
-    if (++self->header_allocs_since_last_collect > 1024) {
+    if ((++self->header_allocs_since_last_collect > self->gc_theshold)
+        && self->string_allocator->num_free_objects <= 1) {
         gc_ms2_mark_and_sweep(interp, 0);
     }
 
@@ -820,6 +827,9 @@
     gc_ms2_sweep_pool(interp, self->pmc_allocator, self->objects, gc_ms2_sweep_pmc_cb);
     gc_ms2_sweep_pool(interp, self->string_allocator, self->strings, gc_ms2_sweep_string_cb);
 
+    /* Wait more next time */
+    self->gc_theshold *= UNITS_PER_ALLOC_GROWTH_FACTOR;
+
     self->header_allocs_since_last_collect = 0;
     self->gc_mark_block_level--;
     self->gc_mark_runs++;


More information about the parrot-commits mailing list