Request for review (S) 6512830: Error: assert(tag_at(which).is_unresolved_klass(), "Corrupted constant,pool")

Daniel D. Daugherty daniel.daugherty at oracle.com
Thu Mar 3 08:52:27 PST 2011


On 3/3/2011 9:28 AM, Coleen Phillimore wrote:
> On 3/2/2011 2:50 PM, Daniel D. Daugherty wrote:
>> On 3/2/2011 11:25 AM, Coleen Phillimore wrote:
>>> Summary: Redefine classes copies the constant pool while the 
>>> constant pool may be resolving strings or classes
>>>
>>> open webrev at http://cr.openjdk.java.net/~coleenp/6512830/
>>> bug link at http://bugs.sun.com/view_bug.do?bug_id=6512830
>>
>> src/share/vm/oops/constantPoolOop.cpp
>>    So the race is that one thread is resolving something in
>>    the CP we're copying. By fetching a copy of the CPSlot,
>>    you're eliminating the data race. The copy you have is
>>    either resolved or it's not resolved and now the call
>>    to unresolved_klass_at_put() will see stable data...
>>
>>    Do I have this right? If so, then very nice catch!
>
> Yes, exactly.
>>
>> src/share/vm/prims/jvmtiRedefineClasses.cpp
>>    By adding JVM_CONSTANT_UnresolvedClass to this part of
>>    the case switch, constantPoolOopDesc::copy_entry_to()
>>    won't be called from RedefineClasses() so the change you
>>    made in constantPoolOop.cpp for JVM_CONSTANT_UnresolvedClass
>>    won't come into play for RedefineClasses(). Not a problem,
>>    just an observation.
>>
> Good observation, it is not strictly needed because we handle it 
> earlier in redefine classes but I made the change because I also 
> changed JVM_CONSTANT_Unresolved string in a similar manner and thought 
> it should be consistent.

Agreed. Consistency is good...


> The other callers seem to also be from redefine classes, just at 
> different points, after the constant pool has been copied to a 
> temporary though.  Is this right?

Yes, if by temporary you mean the merged CP.


>
>>    However that change will come into play for other callers...
>>    And the change for JVM_CONSTANT_UnresolvedString will
>>    come into play for RedefineClasses().
>
> Yes, the UnresolvedString case is needed for RedefineClasses() for the 
> same reason as the UnresolvedClass.  Apparently RedefineClasses 
> doesn't unresolve the string as it does for the class for some reason 
> that I don't know.

RedefineClasses() unresolves the classes because the verifier was
unhappy when it was given resolved classes. The verifier didn't
complain about resolved Strings so I didn't unresolve them.

I guess it's too late to claim that I know absolutely nothing about
RedefineClasses()? :-)

Dan



>>
>>    For RedefineClasses(), the classes need to be unresolved
>>    at this stage of merging so your fix makes sure that even
>>    a class that's in the middle of being resolved right now
>>    stays unresolved.
>>
> Yes.
>> Very nice! And thumbs up!
>>
> Thank you!!
> Coleen
>> Dan
>>
>>
>>>
>>> Tested with jvmti tests.
>>>
>>> Thanks,
>>> Coleen
>>>
>


More information about the hotspot-runtime-dev mailing list