Weldon, I'll try to answer some of your questions. Ivan and Salikh will
correct me.

On 10/16/06, Weldon Washburn < [EMAIL PROTECTED]> wrote:

1)
Mikhail Fursov said, "With this fix JIT precaches all offsets for
mananaged
pointers in a method before reporting".  Is there a problem if a given
live
reference appears in several different stack frames of the same thread?


You can't have one reference in several stack frames. You can have one
object with multiple references from different stack
frames. While enumerating each method in a stack GC set ups "forwarding bit"
to the old object location and knows how to update all subsequent
references that point to the old object
location.
The problem was with managed pointers with unknown offsets
only. To calculate the offset during an enumeration JIT subtracts
the object address (obtained from the references from the current stack
frame) from the mptr address. If the object is moved during the
enumeration, the reference is updated and you can't no longer use it to
find  the offset. With the patch applied JIT calculates offsets before any
references in a frame are updated.
Since mptrs live range does not cross the method boundaries, the problem was
frame local only.

2)
Does this patch include Jitrino.JET, Jitrino.OPT  and the
interpreter?  Have
all three been tested?


AFAIK Jitrino.JET and  interpreter never report MPTRs. So the fix is needed
for Jitrino.OPT only.

3)
Does this patch comprehend "parallel GC" running on a SMP box?  For
example,
4 CPUs simultaneously enumerating 4 java thread stacks that happen to
contain live reference pointers to the exact same objects.  Is there a
test
that demonstrates this behavoir?


Since the problem is frame local it is  thread-local too.  I see no problems
with it.

4)
On Oct 6, Mikhail Fursov said, "I'm agree that GC should not move objects
during the enumeration".    But then provided a patch on October 9.  Was
the
decision to allow objects to move during enumeration documented somewhere?


I do not remember such a discussion. The patch makes JIT more flexible. With
this patch JIT does not need to care if objects are moved or not during the
enumeration.


5)
Is there any impact of the above on GCV5?


IMHO No.

6)
Does GCV4 work with jit_gc.diff?


Yes. The rootset reported by JIT is the same. The only change is that
instead of the method 'enumerate(mptr, base)' JIT uses the method
'enumerate(mptr, offset)' that was used before only for mptrs with static
offsets (offsets known during compilation of a method)

7)
Instead of applying jit_gc.diff what about applying
retrieve_root_set.diff?
If it is now too hard to rollback SVN, how about reopening JIRA1862 and
also
applying retrieve_root_set.diff also?  The rationale is that there has not
been adequate discussion on modifying the semantics of JIT/GC interface.


I vote not to rollback JIT patch. JIT is more flexible with this patch
without any additional cost. The  code is slightly increased (4-6 lines) but
it makes debugging simpler :)

8)
Note that retrieve_root_set.diff does not impact JIT/VM/GC interfaces.  It
is only local to gcv4.1.  Also note retrieve_root_set.diff patch line
count
is 13 and jit_gc.diff line count is 179.


In the JIT patch I cleaned unused enumeration methods from JIT interface,
added comments and replaced the one large loop with two of smaller
size(precaching, reporting). The real number of new lines is less than 10.

So IMO the correct fix for this problem is in the trunk. GC has cmd-line
option to disable object moving during the enumeration and it's enough.



--
Mikhail Fursov

Reply via email to