File tree Expand file tree Collapse file tree 3 files changed +14
-8
lines changed
substratevm/src/com.oracle.svm.core.genscavenge/src/com/oracle/svm/core/genscavenge Expand file tree Collapse file tree 3 files changed +14
-8
lines changed Original file line number Diff line number Diff 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 );
Original file line number Diff line number Diff 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 }
Original file line number Diff line number Diff 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 }
You can’t perform that action at this time.
0 commit comments