RFR: 8187033: [PPC] Imporve performance of ObjectStreamClass.getClassDataLayout()

Kazunori Ogata OGATAK at jp.ibm.com
Thu Aug 31 11:12:15 UTC 2017


Hi Aleksey,

Thank you for your comment.  I understand your point that a memory fence 
is needed between writes to slots of ClassDataSlot[] and the reader of 
$dataLayout.

Then I think we can put a fence only when dataLayout is updated in the 
following way:


private ClassDataSlot[] dataLayout;

ClassDataSlot[] getClassDataLayout() throws InvalidClassException {
  if (dataLayout == null) {
    volatile ClassDataSlot dl = getClassDataLayout0();
    dataLayout = dl;
  }
  return dataLayout;
}


Is this correct and acceptable?


Regards,
Ogata



From:   Aleksey Shipilev <shade at redhat.com>
To:     Kazunori Ogata <OGATAK at jp.ibm.com>, core-libs-dev at openjdk.java.net
Date:   2017/08/31 19:29
Subject:        Re: RFR: 8187033: [PPC] Imporve performance of 
ObjectStreamClass.getClassDataLayout()



On 08/31/2017 12:05 PM, Kazunori Ogata wrote:
> Bug report: https://bugs.openjdk.java.net/browse/JDK-8187033
> Webrev: http://cr.openjdk.java.net/~horii/8187033/webrev.00/

Alas, this change is incorrect. It introduces the race between readers and 
writers of dataLayout
field. Which means, whatever writers have done in ClassDataSlot[] array is 
not guaranteed to be
visible to the readers of $dataLayout.

You can argue this race is benign, but it is not. ClassDataSlot has only 
the final fields, which is
handy. But the problem is with the ClassDataSlot[] array itself: its 
elements are not "final". Maybe
doing the wrapper with final field around it would help, at the expense of 
additional dereference, e.g.:

private DataLayout dataLayout;

class DataLayout {
  final ClassDataSlot[] slots;  // "final" is important here
  DataLayout(List<ClassDataSlot> src) {
    this.slots = src.toArray(new ClassDataSlot[src.size()];
  }
}

ClassDataSlot[] getClassDataLayout() throws InvalidClassException {
  if (dataLayout == null) {
    dataLayout = getClassDataLayout0();
  }
  return dataLayout.slots;
}

Plus maybe replace all declarations of ObjectStreamClass.ClassDataSlot[] 
with
ObjectStreamClass.DataLayout after this...

Thanks,
-Aleksey

[attachment "signature.asc" deleted by Kazunori Ogata/Japan/IBM] 




More information about the core-libs-dev mailing list