[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