Skip to content

Commit e1e434f

Browse files
author
whiteknight
committed
apply a patch from chromatic++ for testing
git-svn-id: https://svn.parrot.org/parrot/branches/compact_strings@45086 d31e2699-5ff4-0310-a27c-f18f2fbe73fe
1 parent bdfa722 commit e1e434f

File tree

2 files changed

+36
-16
lines changed

2 files changed

+36
-16
lines changed

src/gc/gc_ms.c

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -849,18 +849,12 @@ gc_ms_allocate_buffer_storage(PARROT_INTERP,
849849
ARGOUT(Buffer *buffer), size_t size)
850850
{
851851
ASSERT_ARGS(gc_ms_allocate_buffer_storage)
852-
size_t new_size;
853-
char *mem;
852+
const size_t new_size = aligned_string_size(size);
853+
const char *mem = (char *)Parrot_gc_allocate_fixed_size_storage(
854+
interp, new_size);
854855

855-
Buffer_buflen(buffer) = 0;
856-
Buffer_bufstart(buffer) = NULL;
857-
new_size = aligned_string_size(size);
858-
mem = (char *)mem_allocate(interp, interp->mem_pools, new_size,
859-
interp->mem_pools->memory_pool);
860-
mem = aligned_mem(buffer, mem);
861-
Buffer_bufstart(buffer) = mem;
862-
new_size -= sizeof (void*);
863-
Buffer_buflen(buffer) = new_size;
856+
Buffer_bufstart(buffer) = aligned_mem(buffer, mem);
857+
Buffer_buflen(buffer) = new_size - sizeof (void *);
864858
}
865859

866860
/*
@@ -919,14 +913,17 @@ gc_ms_reallocate_buffer_storage(PARROT_INTERP, ARGMOD(Buffer *buffer),
919913
else
920914
pool->possibly_reclaimable += copysize;
921915

922-
mem = (char *)mem_allocate(interp, interp->mem_pools, new_size, pool);
916+
mem = (char *)Parrot_gc_allocate_fixed_size_storage(interp, new_size);
923917
mem = aligned_mem(buffer, mem);
924918

925919
/* We shouldn't ever have a 0 from size, but we do. If we can track down
926920
* those bugs, this can be removed which would make things cheaper */
927921
if (copysize)
928922
memcpy(mem, Buffer_bufstart(buffer), copysize);
929923

924+
Parrot_gc_free_fixed_size_storage(interp,
925+
Buffer_buflen(buffer) + sizeof (void *), Buffer_bufstart(buffer));
926+
930927
Buffer_bufstart(buffer) = mem;
931928

932929
new_size -= sizeof (void *);

src/gc/mark_sweep.c

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,28 @@ C<get_bufferlike_pool> internally, which in turn calls C<new_bufferlike_pool>.
673673
674674
*/
675675

676+
static void
677+
free_string_header(PARROT_INTERP,
678+
ARGIN(Memory_Pools *mem_pools),
679+
ARGMOD(Fixed_Size_Pool *pool),
680+
ARGMOD(PObj *p))
681+
{
682+
/* ASSERT_ARGS(free_buffer) */
683+
STRING *s = (STRING *)p;
684+
INTVAL *ref_count = Buffer_bufrefcountptr(s);
685+
686+
*ref_count--;
687+
688+
if (*ref_count <= 0)
689+
Parrot_gc_free_fixed_size_storage(interp, Buffer_buflen(s),
690+
Buffer_bufstart(s));
691+
692+
Buffer_buflen(s) = 0;
693+
Buffer_bufstart(s) = NULL;
694+
Buffer_bufstart(s) = NULL;
695+
s->strstart = NULL;
696+
}
697+
676698
PARROT_WARN_UNUSED_RESULT
677699
PARROT_CANNOT_RETURN_NULL
678700
static Fixed_Size_Pool *
@@ -681,14 +703,15 @@ new_string_pool(PARROT_INTERP,
681703
INTVAL constant)
682704
{
683705
ASSERT_ARGS(new_string_pool)
684-
Fixed_Size_Pool *pool;
706+
const size_t size = sizeof (STRING);
707+
Fixed_Size_Pool *pool = new_bufferlike_pool(interp, mem_pools, size);
708+
685709
if (constant) {
686-
pool = new_bufferlike_pool(interp, mem_pools, sizeof (STRING));
687710
pool->gc_object = NULL;
688-
pool->mem_pool = mem_pools->constant_string_pool;
711+
pool->mem_pool = mem_pools->constant_string_pool;
689712
}
690713
else
691-
pool = get_bufferlike_pool(interp, mem_pools, sizeof (STRING));
714+
pool->gc_object = free_string_header;
692715

693716
pool->objects_per_alloc = STRING_HEADERS_PER_ALLOC;
694717

0 commit comments

Comments
 (0)