RFR: NewInstanceStub reads InstanceKlass::_init_state as int but is u1
Doug Simon
doug.simon at oracle.com
Wed Jul 24 02:16:45 PDT 2013
Looks good.
On Jul 24, 2013, at 3:23 AM, Christian Thalinger <christian.thalinger at oracle.com> wrote:
> Here are a couple more fixes to this code. The threadAllocatedBytesOffset change is not really necessary but since it's defined as a long:
>
> jlong _allocated_bytes; // Cumulative number of bytes allocated on
>
> we should read it as a long.
>
> -- Chris
>
> diff -r 6057d0168f47 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java
> --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java Tue Jul 23 12:27:06 2013 -0700
> +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java Tue Jul 23 18:20:38 2013 -0700
> @@ -89,7 +89,7 @@ public class NewInstanceStub extends Sni
> private static Object newInstance(Word hub, @ConstantParameter Word intArrayHub) {
> int sizeInBytes = hub.readInt(klassInstanceSizeOffset(), LocationIdentity.FINAL_LOCATION);
> if (!forceSlowPath() && inlineContiguousAllocationSupported()) {
> - if (hub.readInt(klassStateOffset(), CLASS_STATE_LOCATION) == klassStateFullyInitialized()) {
> + if (hub.readByte(klassStateOffset(), CLASS_STATE_LOCATION) == klassStateFullyInitialized()) {
> Word memory = refillAllocate(intArrayHub, sizeInBytes, logging());
> if (memory.notEqual(0)) {
> Word prototypeMarkWord = hub.readWord(prototypeMarkWordOffset(), PROTOTYPE_MARK_WORD_LOCATION);
> @@ -137,21 +137,21 @@ public class NewInstanceStub extends Sni
> Word end = readTlabEnd(thread);
>
> // calculate amount of free space
> - Word tlabFreeSpaceInBytes = end.subtract(top);
> + long tlabFreeSpaceInBytes = end.subtract(top).rawValue();
>
> if (log) {
> printf("refillTLAB: thread=%p\n", thread.rawValue());
> printf("refillTLAB: top=%p\n", top.rawValue());
> printf("refillTLAB: end=%p\n", end.rawValue());
> - printf("refillTLAB: tlabFreeSpaceInBytes=%d\n", tlabFreeSpaceInBytes.rawValue());
> + printf("refillTLAB: tlabFreeSpaceInBytes=%ld\n", tlabFreeSpaceInBytes);
> }
>
> - Word tlabFreeSpaceInWords = tlabFreeSpaceInBytes.unsignedShiftRight(log2WordSize());
> + long tlabFreeSpaceInWords = tlabFreeSpaceInBytes >>> log2WordSize();
>
> // Retain TLAB and allocate object in shared space if
> // the amount free in the TLAB is too large to discard.
> Word refillWasteLimit = thread.readWord(tlabRefillWasteLimitOffset(), TLAB_REFILL_WASTE_LIMIT_LOCATION);
> - if (tlabFreeSpaceInWords.belowOrEqual(refillWasteLimit)) {
> + if (tlabFreeSpaceInWords <= refillWasteLimit.rawValue()) {
> if (tlabStats()) {
> // increment number of refills
> thread.writeInt(tlabNumberOfRefillsOffset(), thread.readInt(tlabNumberOfRefillsOffset(), TLAB_NOF_REFILLS_LOCATION) + 1, TLAB_NOF_REFILLS_LOCATION);
> @@ -159,11 +159,11 @@ public class NewInstanceStub extends Sni
> printf("thread: %p -- number_of_refills %d\n", thread.rawValue(), thread.readInt(tlabNumberOfRefillsOffset(), TLAB_NOF_REFILLS_LOCATION));
> }
> // accumulate wastage
> - Word wastage = thread.readWord(tlabFastRefillWasteOffset(), TLAB_FAST_REFILL_WASTE_LOCATION).add(tlabFreeSpaceInWords);
> + int wastage = thread.readInt(tlabFastRefillWasteOffset(), TLAB_FAST_REFILL_WASTE_LOCATION) + (int) tlabFreeSpaceInWords;
> if (log) {
> - printf("thread: %p -- accumulated wastage %d\n", thread.rawValue(), wastage.rawValue());
> + printf("thread: %p -- accumulated wastage %d\n", thread.rawValue(), wastage);
> }
> - thread.writeWord(tlabFastRefillWasteOffset(), wastage, TLAB_FAST_REFILL_WASTE_LOCATION);
> + thread.writeInt(tlabFastRefillWasteOffset(), wastage, TLAB_FAST_REFILL_WASTE_LOCATION);
> }
>
> // if TLAB is currently allocated (top or end != null) then
> @@ -172,13 +172,13 @@ public class NewInstanceStub extends Sni
> int headerSize = arrayBaseOffset(Kind.Int);
> // just like the HotSpot assembler stubs, assumes that tlabFreeSpaceInInts fits in
> // an int
> - int tlabFreeSpaceInInts = (int) tlabFreeSpaceInBytes.rawValue() >>> 2;
> + int tlabFreeSpaceInInts = (int) tlabFreeSpaceInBytes >>> 2;
> int length = ((alignmentReserveInBytes - headerSize) >>> 2) + tlabFreeSpaceInInts;
> NewObjectSnippets.formatArray(intArrayHub, -1, length, headerSize, top, intArrayMarkWord, false);
>
> - Word allocated = thread.readWord(threadAllocatedBytesOffset(), TLAB_THREAD_ALLOCATED_BYTES_LOCATION);
> - allocated = allocated.add(top.subtract(readTlabStart(thread)));
> - thread.writeWord(threadAllocatedBytesOffset(), allocated, TLAB_THREAD_ALLOCATED_BYTES_LOCATION);
> + long allocated = thread.readLong(threadAllocatedBytesOffset(), TLAB_THREAD_ALLOCATED_BYTES_LOCATION);
> + allocated = allocated + top.subtract(readTlabStart(thread)).rawValue();
> + thread.writeLong(threadAllocatedBytesOffset(), allocated, TLAB_THREAD_ALLOCATED_BYTES_LOCATION);
> }
>
> // refill the TLAB with an eden allocation
>
> On Jul 23, 2013, at 2:09 PM, Christian Thalinger <christian.thalinger at oracle.com> wrote:
>
>> _init_state is defined as u1 in InstanceKlass:
>>
>> u1 _init_state; // state of class
>>
>> but is read as int in newInstance:
>>
>> diff -r 6057d0168f47 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java
>> --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java Tue Jul 23 12:27:06 2013 -0700
>> +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/stubs/NewInstanceStub.java Tue Jul 23 14:06:49 2013 -0700
>> @@ -89,7 +89,7 @@ public class NewInstanceStub extends Sni
>> private static Object newInstance(Word hub, @ConstantParameter Word intArrayHub) {
>> int sizeInBytes = hub.readInt(klassInstanceSizeOffset(), LocationIdentity.FINAL_LOCATION);
>> if (!forceSlowPath() && inlineContiguousAllocationSupported()) {
>> - if (hub.readInt(klassStateOffset(), CLASS_STATE_LOCATION) == klassStateFullyInitialized()) {
>> + if (hub.readByte(klassStateOffset(), CLASS_STATE_LOCATION) == klassStateFullyInitialized()) {
>> Word memory = refillAllocate(intArrayHub, sizeInBytes, logging());
>> if (memory.notEqual(0)) {
>> Word prototypeMarkWord = hub.readWord(prototypeMarkWordOffset(), PROTOTYPE_MARK_WORD_LOCATION);
>>
>> -- Chris
>
More information about the graal-dev
mailing list