RFR (M) 8186088: ConstantPoolCache::_resolved_references is not a JNIHandle

Christian Thalinger cthalinger at twitter.com
Fri Aug 18 07:31:42 UTC 2017


> On Aug 15, 2017, at 4:56 AM, coleen.phillimore at oracle.com wrote:
> 
> 
> 
> On 8/14/17 8:26 PM, David Holmes wrote:
>> On 15/08/2017 9:46 AM, coleen.phillimore at oracle.com <mailto:coleen.phillimore at oracle.com> wrote:
>>> 
>>> Better yet, I removed the _pd field assignment from being cmpxchg/conditional and do it under the metaspace_lock which we take out anyway to add the handle.   How is this?
>>> 
>>> open webrev at http://cr.openjdk.java.net/~coleenp/8186088.03/webrev <http://cr.openjdk.java.net/~coleenp/8186088.03/webrev>
>> 
>> I like the fact OopHandle no longer has atomics. :)
> 
> Yes, this solved a bunch of problems.

Do you still need this:

  32 class outputStream;

?

>> 
>> Sorry I'm being a bit dense today when it comes to this code:
>> 
>> ! void ClassLoaderData::init_handle_locked(OopHandle& dest, Handle h) {
>> !   MutexLockerEx ml(metaspace_lock(), Mutex::_no_safepoint_check_flag);
>> !   if (dest.resolve() != NULL) {
>> !     return;
>> !   } else {
>> !     dest = _handles.add(h());
>> !   }
>>  }
>> 
>> I would have expected to see something like dest.set(x). I'm not sure what magic operator= is doing behind the scenes here ??
> 
> It's doing a bitwise copy.
>> 
>> I did check the code that calls this, and the locking seems safe in that context.
>> 
> 
> Thanks.  It's a lot better now.
> Coleen
>> Thanks,
>> David
>> 
>>> I reran the tests that use this code.
>>> 
>>> thanks,
>>> Coleen
>>> 
>>> On 8/14/17 4:36 PM, David Holmes wrote:
>>>> Hi Coleen,
>>>> 
>>>> On 15/08/2017 1:38 AM, coleen.phillimore at oracle.com wrote:
>>>>> 
>>>>> 
>>>>> On 8/13/17 9:04 PM, David Holmes wrote:
>>>>>> Hi Coleen,
>>>>>> 
>>>>>> On 12/08/2017 7:34 AM, coleen.phillimore at oracle.com wrote:
>>>>>>> Summary: Make an OopHandle type to replace jobject to encapsulate these oop pointers in metadata and module entry.
>>>>>>> 
>>>>>>> This replaces places where there's a jobject that doesn't point into the JNIHandles, notably things allocated in ClassLoaderData::_handles.
>>>>>>> 
>>>>>>> There were platform specific changes that I tried to carefully make - can someone test them for s390, aarch64 and ppc?
>>>>>>> 
>>>>>>> Tested with tier1 testing, JPRT (all oracle platforms), nsk.jvmti, monitoring, parallel class loading and g1class unloading tests.
>>>>>>> 
>>>>>>> open webrev at http://cr.openjdk.java.net/~coleenp/8186088.01/webrev
>>>>>>> bug link https://bugs.openjdk.java.net/browse/JDK-8186088
>>>>>> 
>>>>>> Is it possible to put the declaration of MacroAssembler::resolve_oop_handle into the shared macroAssembler.hpp file to avoid the need to add it to the platform specific hpp files?
>>>>>> 
>>>>>> I'm unsure about the OopHandle containing set_atomic. First if it is present then the _obj field should be volatile. But then it also raises the question: if we can race to set this, do we need load-acquire versions of the accessors? Based on the single existing usage I don't think we presently do. But I think it may be cleaner/simpler to not have set_atomic, make the OopHandle immutable, and do the cmpxchg back in the caller code by atomically updating _pd (which should also be volatile even today) with a new OopHandle.
>>>>> 
>>>>> I couldn't convince the compiler to compile an Atomic::cmpxchg_ptr() to an address of OopHandle since it is not a pointer but a struct. The 
>>>> 
>>>> _pd would have to be a pointer.
>>>> 
>>>>> casting would be wrong.   So I added a resolve_acquire() for the protection_domain case in ModuleEntry, and some commentary.
>>>> 
>>>> For completeness you may also need ptr_acquire().
>>>> 
>>>> The _obj field should be volatile.
>>>> 
>>>> Thanks,
>>>> David
>>>> -----
>>>> 
>>>>> open webrev at http://cr.openjdk.java.net/~coleenp/8186088.02/webrev
>>>>> 
>>>>> thanks,
>>>>> Coleen
>>>>> 
>>>>>> 
>>>>>> Thanks,
>>>>>> David
>>>>>> 
>>>>>>> Thanks,
>>>>>>> Coleen



More information about the hotspot-dev mailing list