/** * Used to mark boot image objects during a parallel scan of objects during GC Returns true if * marking was done. */ private static boolean testAndMark(ObjectReference object, Word value) throws InlinePragma { Word oldValue; do { oldValue = ObjectModel.prepareAvailableBits(object); Word markBit = oldValue.and(GC_MARK_BIT_MASK); if (markBit.EQ(value)) return false; } while (!ObjectModel.attemptAvailableBits(object, oldValue, oldValue.xor(GC_MARK_BIT_MASK))); return true; }
@Inline @NoNullCheck @Unpreemptible public static void inlineUnlockHelper(Object o, Offset lockOffset) { Word old = Magic.prepareWord(o, lockOffset); // FIXME: bad for PPC? Word id = old.and(TL_THREAD_ID_MASK.or(TL_STAT_MASK)); Word tid = Word.fromIntSignExtend(RVMThread.getCurrentThread().getLockingId()); if (id.EQ(tid)) { if (!old.and(TL_LOCK_COUNT_MASK).isZero()) { setDedicatedU16(o, lockOffset, old.minus(TL_LOCK_COUNT_UNIT)); return; } } else if (old.xor(tid).rshl(TL_LOCK_COUNT_SHIFT).EQ(TL_STAT_THIN.rshl(TL_LOCK_COUNT_SHIFT))) { Magic.sync(); if (Magic.attemptWord(o, lockOffset, old, old.and(TL_UNLOCK_MASK).or(TL_STAT_THIN))) { return; } } unlock(o, lockOffset); }