On 4/23/07, chromatic <[EMAIL PROTECTED]> wrote:
On Thursday 05 April 2007 16:56, Mehmet Yavuz Selim Soyturk wrote:
> The next program causes a memory leak for me.
>
> .sub main :main
> loop:
> $P0 = new .String
> goto loop
> .end
>
>
> Interestingly, no memory leak with:
>
> .sub main :main
> loop:
> $S0 = "foo"
> $P0 = new .String
> goto loop
> .end
I can't explain that, but here's some suspicious code in
Parrot_allocate_string() in src/resources.c:
new_size = aligned_string_size(str, size);
mem = (char *)mem_allocate(interp, new_size, pool);
mem += sizeof (void*);
PObj_bufstart(str) = str->strstart = mem;
PObj_buflen(str) = new_size - sizeof (void*);
If I identify and read the related freeing code correctly (Parrot_dod_sweep()
in src/gc/dod.c):
else if (PObj_sysmem_TEST(b) && PObj_bufstart(b)) {
/* has sysmem allocated, e.g. string_pin */
mem_sys_free(PObj_bufstart(b));
PObj_bufstart(b) = NULL;
PObj_buflen(b) = 0;
}
... then there's a leak the sizeof (void *).
I don't guarantee that I've identified the appropriate code clearly though;
digging through this is tricky.
Does this sound familiar or interesting or fun to anyone else?
sounds to me like it could be a reason for the pge garbage collection
problems that andy and i have experienced.
~jerry