[svn:parrot] r45086 - branches/compact_strings/src/gc

whiteknight at svn.parrot.org whiteknight at svn.parrot.org
Sun Mar 21 12:06:59 UTC 2010


Author: whiteknight
Date: Sun Mar 21 12:06:59 2010
New Revision: 45086
URL: https://trac.parrot.org/parrot/changeset/45086

Log:
apply a patch from chromatic++ for testing

Modified:
   branches/compact_strings/src/gc/gc_ms.c
   branches/compact_strings/src/gc/mark_sweep.c

Modified: branches/compact_strings/src/gc/gc_ms.c
==============================================================================
--- branches/compact_strings/src/gc/gc_ms.c	Sun Mar 21 11:53:44 2010	(r45085)
+++ branches/compact_strings/src/gc/gc_ms.c	Sun Mar 21 12:06:59 2010	(r45086)
@@ -849,18 +849,12 @@
     ARGOUT(Buffer *buffer), size_t size)
 {
     ASSERT_ARGS(gc_ms_allocate_buffer_storage)
-    size_t new_size;
-    char *mem;
+    const size_t  new_size  = aligned_string_size(size);
+    const char   *mem       = (char *)Parrot_gc_allocate_fixed_size_storage(
+                                interp, new_size);
 
-    Buffer_buflen(buffer) = 0;
-    Buffer_bufstart(buffer) = NULL;
-    new_size = aligned_string_size(size);
-    mem = (char *)mem_allocate(interp, interp->mem_pools, new_size,
-        interp->mem_pools->memory_pool);
-    mem = aligned_mem(buffer, mem);
-    Buffer_bufstart(buffer) = mem;
-    new_size -= sizeof (void*);
-    Buffer_buflen(buffer) = new_size;
+    Buffer_bufstart(buffer) = aligned_mem(buffer, mem);
+    Buffer_buflen(buffer)   = new_size - sizeof (void *);
 }
 
 /*
@@ -919,7 +913,7 @@
     else
         pool->possibly_reclaimable   += copysize;
 
-    mem = (char *)mem_allocate(interp, interp->mem_pools, new_size, pool);
+    mem = (char *)Parrot_gc_allocate_fixed_size_storage(interp, new_size);
     mem = aligned_mem(buffer, mem);
 
     /* We shouldn't ever have a 0 from size, but we do. If we can track down
@@ -927,6 +921,9 @@
     if (copysize)
         memcpy(mem, Buffer_bufstart(buffer), copysize);
 
+    Parrot_gc_free_fixed_size_storage(interp,
+        Buffer_buflen(buffer) + sizeof (void *), Buffer_bufstart(buffer));
+
     Buffer_bufstart(buffer) = mem;
 
     new_size -= sizeof (void *);

Modified: branches/compact_strings/src/gc/mark_sweep.c
==============================================================================
--- branches/compact_strings/src/gc/mark_sweep.c	Sun Mar 21 11:53:44 2010	(r45085)
+++ branches/compact_strings/src/gc/mark_sweep.c	Sun Mar 21 12:06:59 2010	(r45086)
@@ -673,6 +673,28 @@
 
 */
 
+static void
+free_string_header(PARROT_INTERP,
+        ARGIN(Memory_Pools *mem_pools),
+        ARGMOD(Fixed_Size_Pool *pool),
+        ARGMOD(PObj *p))
+{
+    /* ASSERT_ARGS(free_buffer) */
+    STRING *s         = (STRING *)p;
+    INTVAL *ref_count = Buffer_bufrefcountptr(s);
+
+    *ref_count--;
+
+    if (*ref_count <= 0)
+    Parrot_gc_free_fixed_size_storage(interp, Buffer_buflen(s),
+        Buffer_bufstart(s));
+
+    Buffer_buflen(s)   = 0;
+    Buffer_bufstart(s) = NULL;
+    Buffer_bufstart(s) = NULL;
+    s->strstart        = NULL;
+}
+
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 static Fixed_Size_Pool *
@@ -681,14 +703,15 @@
         INTVAL constant)
 {
     ASSERT_ARGS(new_string_pool)
-    Fixed_Size_Pool *pool;
+    const size_t     size = sizeof (STRING);
+    Fixed_Size_Pool *pool = new_bufferlike_pool(interp, mem_pools, size);
+
     if (constant) {
-        pool           = new_bufferlike_pool(interp, mem_pools, sizeof (STRING));
         pool->gc_object = NULL;
-        pool->mem_pool = mem_pools->constant_string_pool;
+        pool->mem_pool  = mem_pools->constant_string_pool;
     }
     else
-        pool = get_bufferlike_pool(interp, mem_pools, sizeof (STRING));
+        pool->gc_object = free_string_header;
 
     pool->objects_per_alloc = STRING_HEADERS_PER_ALLOC;
 


More information about the parrot-commits mailing list