Skip to content

Commit 59c56b0

Browse files
committed
Fixed some races
1 parent c38406c commit 59c56b0

File tree

3 files changed

+14
-8
lines changed

3 files changed

+14
-8
lines changed

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/ObjectHeaderImpl.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,11 @@ public static void setRememberedSetBit(Object o) {
343343
writeHeaderToObject(o, newHeader);
344344
}
345345

346+
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
347+
static long setRememberedSetBit(long headerBytes) {
348+
return headerBytes | REMEMBERED_SET_BIT.rawValue();
349+
}
350+
346351
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
347352
public static boolean hasRememberedSet(UnsignedWord header) {
348353
return header.and(REMEMBERED_SET_BIT).notEqual(0);
@@ -359,11 +364,6 @@ public static boolean isForwardedHeader(UnsignedWord header) {
359364
return header.and(FORWARDED_BIT).notEqual(0);
360365
}
361366

362-
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
363-
Object getForwardedObject(Pointer ptr) {
364-
return getForwardedObject(ptr, readHeaderFromPointer(ptr));
365-
}
366-
367367
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
368368
Object getForwardedObject(Pointer ptr, UnsignedWord header) {
369369
assert isForwardedHeader(header);

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/ReferenceObjectProcessing.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ private static boolean processRememberedRef(Reference<?> dr) {
233233
@Uninterruptible(reason = "Called from uninterruptible code.", mayBeInlined = true)
234234
private static boolean maybeUpdateForwardedReference(Reference<?> dr, Pointer referentAddr, UnsignedWord header) {
235235
if (ObjectHeaderImpl.isForwardedHeader(header)) {
236-
Object forwardedObj = ObjectHeaderImpl.getObjectHeaderImpl().getForwardedObject(referentAddr);
236+
Object forwardedObj = ObjectHeaderImpl.getObjectHeaderImpl().getForwardedObject(referentAddr, header);
237237
ReferenceInternals.setReferent(dr, forwardedObj);
238238
return true;
239239
}

substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge/Space.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,13 @@ private Object copyAlignedObjectParallel(Object original) {
489489
return null;
490490
}
491491

492+
/*
493+
* It's important that we set the RS bit before everything else because
494+
* YoungGeneration.contains() checks it.
495+
*/
496+
long copyHeaderBytes = isOldSpace() ? ObjectHeaderImpl.setRememberedSetBit(eightHeaderBytes) : eightHeaderBytes;
497+
copyMemory.writeLong(hubOffset, copyHeaderBytes);
498+
492499
/* Install forwarding pointer into the original header. */
493500
Object copy = copyMemory.toObject();
494501
Object forward = ohi.installForwardingPointerParallel(original, eightHeaderBytes, copy);
@@ -498,8 +505,7 @@ private Object copyAlignedObjectParallel(Object original) {
498505
return forward;
499506
}
500507

501-
/* We have won the race. Install the object header and copy the rest of the object. */
502-
copyMemory.writeLong(hubOffset, eightHeaderBytes);
508+
/* We have won the race. Copy the rest of the object. */
503509
if (hubOffset > 0) {
504510
UnmanagedMemoryUtil.copyLongsForward(originalMemory, copyMemory, WordFactory.unsigned(hubOffset));
505511
}

0 commit comments

Comments
 (0)