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

Reply via email to