From: Leopold Toetsch <[EMAIL PROTECTED]> Date: Mon, 18 Jul 2005 17:08:53 +0200
Circular or not isn't really the problem. With generational GC you'll always have the chance of tenured garbage . . . Now due to some other pointer store the object C becomes dead. But as long as we don't scan up to generation j, we don't realize this and object A stays alive. That's true, but not my point. I don't understand how the IGP mechanism permits cycles to be collected at all. . . . gen n | gen j [ A ] -> [ B ] -|-----> [ C ] ^ | +----------------------+ A circular data structure doesn't really change the picture, except, when again scanning up to generation j, and we find object C being alive, we'd have to restart scanning at object A, by following the backreference. If non of A, B, or C is referenced from elsewhere, we would still delete the whole reference loop. So that means you do not use the IGP pointer to A when collecting any generation <= j, correct? Otherwise, I imagine you'd always decide that A is alive, and hence B and C. But what if A, B, and C are all in the same generation? You'd still need an IGP entry, even though it's not inter-generational, in order to handle the backpointer, but how would you then decide that it's invalid? > ... Is one-pass mark-sweep really a suitable GC algorithm for Parrot? I still think it's suitable yes. It's only in the above case that we can't immediately cleanup A, because of the invalidation of the IGP entry. leo I am willing to believe that there could be an IGP mechanism that would perform as described, but I haven't yet heard enough to understand it myself. Perhaps you should save your (metaphorical) breath, and I'll wait for a more detailed design. -- Bob Rogers