Clinton The following patch seems to fix both these problems. It makes some slight changes to the logic, so should be considered a temporary fix until Dan has time to take a look at the code.
-- Peter Gibbs EmKel Systems Index: resources.c =================================================================== RCS file: /home/perlcvs/parrot/resources.c,v retrieving revision 1.35 diff -c -r1.35 resources.c *** resources.c 26 Mar 2002 16:33:01 -0000 1.35 --- resources.c 28 Mar 2002 13:40:37 -0000 *************** *** 338,344 **** /* If the PMC we've been handed has already been marked as live (ie we put it on the list already) we just return. Otherwise we could get in some nasty loops */ ! if (used_pmc->next_for_GC) { return current_end_of_list; } --- 338,344 ---- /* If the PMC we've been handed has already been marked as live (ie we put it on the list already) we just return. Otherwise we could get in some nasty loops */ ! if (used_pmc->next_for_GC || used_pmc == current_end_of_list) { return current_end_of_list; } *************** *** 346,352 **** used_pmc->flags |= PMC_live_FLAG; /* Now put it on the end of the list */ ! current_end_of_list->next_for_GC = used_pmc; /* return the PMC we were passed as the new end of the list */ return used_pmc; --- 346,354 ---- used_pmc->flags |= PMC_live_FLAG; /* Now put it on the end of the list */ ! if (current_end_of_list) { ! current_end_of_list->next_for_GC = used_pmc; ! } /* return the PMC we were passed as the new end of the list */ return used_pmc; *************** *** 362,373 **** struct PRegChunk *cur_chunk; /* We have to start somewhere, and the global stash is a good place */ ! last = current = interpreter->perl_stash->stash_hash; /* mark it as used and get an updated end of list */ last = mark_used(current, last); /* Wipe out the next for gc bit, otherwise we'll never get anywhere */ ! last->next_for_GC = NULL; /* Now, go run through the PMC registers and mark them as live */ /* First mark the current set. */ --- 364,376 ---- struct PRegChunk *cur_chunk; /* We have to start somewhere, and the global stash is a good place */ ! current = interpreter->perl_stash->stash_hash; ! last = NULL; /* mark it as used and get an updated end of list */ last = mark_used(current, last); /* Wipe out the next for gc bit, otherwise we'll never get anywhere */ ! /* last->next_for_GC = NULL; */ /* Now, go run through the PMC registers and mark them as live */ /* First mark the current set. */