RFR (S): CR 8012939: @Contended doesn't work correctly with inheritance

Vladimir Kozlov vladimir.kozlov at oracle.com
Mon May 13 14:01:30 PDT 2013


On 5/13/13 12:43 PM, Aleksey Shipilev wrote:
> On 05/13/2013 11:29 PM, Vladimir Kozlov wrote:
>> I meant to make it local to use place with renaming if needed.
>
> Ah, you mean at the very first change. I can do that, thanks.

I meant both places. You can simple remove

3148   int next_nonstatic_type_offset;

and add 'int' in use places because they are in different scopes.

>
>>>> I think the fix is not right. If super is contended the nonstatic size
>>>> should contain the padding already:
>>>>
>>>> 3134   int nonstatic_field_size = _super_klass() == NULL ? 0 :
>>>> _super_klass()->nonstatic_field_size();
>>>>
>>>> Why it is not?
>>>
>>> Because nonstatic_field_size was actually missing the trailing padding.
>>
>> Why? Do you mean next codes did not add padding for super class:
>>
>> 3189   // class is contended, pad before all the fields
>> 3190   if (parsed_annotations->is_contended()) {
>> 3191     first_nonstatic_field_offset += pad_size;
>> 3192   }
>> 3193
>>
>> 3586   // Entire class is contended, pad in the back.
>> 3589   if (parsed_annotations->is_contended()) {
>> 3590     notaligned_offset += pad_size;
>> 3591   }
>
> There are two parts to this story: one is adding the padding for the
> class, which obviously works, and the second one is adding the padding
> for the field, which is missing. See the regression test there: the

Then why the next code does not work in such case?:

3482     // if there is at least one contended field, we need to have
pre-padding for them
3483     if (nonstatic_contended_count > 0) {
3484       next_nonstatic_padded_offset += pad_size;
3485     }


> field from the super-class and the field in subclass are not separated
> by any padding, even though both are @Contended.
>
>>> See the assert before, it is obviously not correct: instance_size misses
>>> the padding, and we need to add it up in the right hand side.
>>
>> Yes, assert was wrong.
>>
>>>
>>>> Also your fix does double padding:
>>>>
>>>> 3588   if (parsed_annotations->is_contended()) {
>>>> 3589     notaligned_offset += pad_size;
>>>> 3590   }
>>>>
>>>> 3598              + (parsed_annotations->is_contended() ? pad_size :
>>>> 0))/heapOopSize);
>>>
>>> Yes it does, but this is not introduced by the fix. The double padding
>>
>> You added line 3598. As result it adds class padding 2 times at the end.
>
> Ah, this line is confusing. See the chunk you had already posted?
>
>   3189   // class is contended, pad before all the fields
>   3190   if (parsed_annotations->is_contended()) {
>   3191     first_nonstatic_field_offset += pad_size;
>   3192   }
>   3193
>
> What line 3598 actually does is adds the leading padding *back* so we
> can calculate the proper instance size, because
> first_nonstatic_field_offset is already not at the start of the fields.

So HERE !!! is the main problem, first_nonstatic_field_offset does not
include class pre-padding. It was totally not clear from your changes.
And my question above about fields padding still stay, why it did not
add padding for Contended fields?

I think the better fix would be to use separate variable which includes
pre-padding and use it in nonstatic_field_size and instance_size
calculation.

Vladimir

>
>>> is due to this case:
>>>
>>>    @Contended
>>>    class C {
>>>       @Contended
>>>       int field;
>>>    }
>>
>> The bug report is not for this case.
>
> Sure, I'm just demonstrating how the double padding arises. That was a
> deliberate choice for the basic implementation.
>
>> Let see.
>>
>> Next expression should give correct nonstatic_field_size with class
>> padding for super class:
>>
>> 3134   int nonstatic_field_size = _super_klass() == NULL ? 0 :
>> _super_klass()->nonstatic_field_size();
>>
>> It should be (272-head_size)/heapOopSize for bug case. If it is not,
>> then that is the bug.
>
> I had the printed debugging to demonstrate the nonstatic_field_size was
> the culprit, because we accidentally chomped off the leading field
> padding the super-class by subtracting already "off"
> first_nonstatic_field_offset.
>
> Do you want me to rework this to make the intent clearer?
>
> -Aleksey.
>




More information about the hotspot-dev mailing list