On Saturday 28 April 2007 16:43:06 Mehmet Yavuz Selim Soyturk wrote: > Next program makes a slurpy tailcall, and it causes a memory leak for me.
Confirmed. Interestingly, the problem looks like a Key PMC somewhere gets garbage collected inappropriately. I tried various tricks to mark the call_state's PMC as live, but nothing fixed anything except for this patch, which hides the problem. Now I know that storing a PMC in a data structure that the GC doesn't check during mark and sweep is a problem, but liberal use of parrot_register_pmc() didn't fix things either. -- c
=== src/inter_call.c ================================================================== --- src/inter_call.c (revision 3820) +++ src/inter_call.c (local) @@ -1016,6 +1016,7 @@ dest_ctx->results_signature = NULL; } + Parrot_block_DOD(interp); Parrot_init_arg_indexes_and_sig_pmc(interp, src_ctx, src_indexes, src_signature, &st.src); Parrot_init_arg_indexes_and_sig_pmc(interp, dest_ctx, dest_indexes, dest_signature, &st.dest); Parrot_process_args(interp, &st, param_or_result); @@ -1023,6 +1024,7 @@ /* If we created a slurpy, we had to DOD register it so it did not get * collected during arg processing; we'll now unregister it. */ dod_unregister_pmc(interp, st.dest.slurp); + Parrot_unblock_DOD(interp); } /*