Request for reviews (XS): 7011386: race in objArrayKlass::array_klass_impl

Vladimir Kozlov vladimir.kozlov at oracle.com
Tue Jan 11 15:48:19 PST 2011


You are right, I added store_store barriers and make these fields volatile:

http://cr.openjdk.java.net/~kvn/7011386/webrev

Vladimir

Tom Rodriguez wrote:
> On Jan 11, 2011, at 11:15 AM, Vladimir Kozlov wrote:
> 
>> Tom,
>>
>> Using oop_store() instead of oop_store_without_check()
>> will generate barriers but it is overkill.
> 
> Those are gc barriers.  I was really referring to fences.  The code is a classic instance of the double check locking idiom for lazy init:
> 
>   objArrayKlassHandle ak (THREAD, this_oop->higher_dimension());
>   if (ak.is_null()) {
>     if (or_null)  return NULL;
> 
>     ResourceMark rm;
>     JavaThread *jt = (JavaThread *)THREAD;
>     {
>       MutexLocker mc(Compile_lock, THREAD);   // for vtables
>       // Ensure atomic creation of higher dimensions
>       MutexLocker mu(MultiArray_lock, THREAD);
> 
>       // Check if another thread beat us
>       ak = objArrayKlassHandle(THREAD, this_oop->higher_dimension());
>       if( ak.is_null() ) {
> 
> So doesn't that mean that we need a fence of some kind?
> 
> tom
> 
>> I think marking receiver as volatile should be enough:
>>
>>  void set_higher_dimension(klassOop k) volatile { oop_store_without_check((oop*) &_higher_dimension, (oop) k); }
>>  void set_lower_dimension(klassOop k)  volatile { oop_store_without_check((oop*) &_lower_dimension, (oop) k); }
>>
>> Thanks,
>> Vladimir
>>
>> Tom Rodriguez wrote:
>>> That look good, though I keep wondering if we need a barrier in between or if those fields really should be volatile.  It seems like we're playing a little loose with the locking for these lazy values.
>>> tom
>>> On Jan 11, 2011, at 9:54 AM, Vladimir Kozlov wrote:
>>>> http://cr.openjdk.java.net/~kvn/7011386/webrev
>>>>
>>>> Fixed 7011386: race in objArrayKlass::array_klass_impl
>>>>
>>>> Other threads may access _lower_dimension field before
>>>> it is initialized by thread which holds the lock in
>>>> objArrayKlass::array_klass_impl().
>>>>
>>>> Move _lower_dimension field initialization before
>>>> _higher_dimension.
> 


More information about the hotspot-compiler-dev mailing list