From: <dfr...@us...> - 2007-08-28 09:43:55
|
Revision: 13388 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=13388&view=rev Author: dframpton-oss Date: 2007-08-28 02:43:21 -0700 (Tue, 28 Aug 2007) Log Message: ----------- Reorganise the core of a transitive closure. The motivators for this are twofold. First is concurrent collection, and second is implementing prefetching during trace. Modified Paths: -------------- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceLocal.java rvmroot/trunk/MMTk/src/org/mmtk/plan/copyms/CopyMSTraceLocal.java rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/GenMatureTraceLocal.java rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/GenNurseryTraceLocal.java rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/copying/GenCopyMatureTraceLocal.java rvmroot/trunk/MMTk/src/org/mmtk/plan/markcompact/MCMarkTraceLocal.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/DecBuffer.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/RCBaseCollector.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionCollectStep.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionGreyStep.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionScanBlackStep.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionScanStep.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCCollector.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCModifiedProcessor.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCCollector.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCModifiedProcessor.java rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCTraceLocal.java rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/SS.java rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/SSTraceLocal.java rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/gctrace/GCTraceTraceLocal.java rvmroot/trunk/MMTk/src/org/mmtk/policy/CopySpace.java rvmroot/trunk/MMTk/src/org/mmtk/policy/ExplicitFreeListSpace.java rvmroot/trunk/MMTk/src/org/mmtk/policy/ImmortalSpace.java rvmroot/trunk/MMTk/src/org/mmtk/policy/LargeObjectSpace.java rvmroot/trunk/MMTk/src/org/mmtk/policy/MarkCompactSpace.java rvmroot/trunk/MMTk/src/org/mmtk/policy/MarkSweepSpace.java rvmroot/trunk/MMTk/src/org/mmtk/policy/RawPageSpace.java rvmroot/trunk/MMTk/src/org/mmtk/policy/Space.java rvmroot/trunk/MMTk/src/org/mmtk/utility/deque/ObjectReferenceBuffer.java rvmroot/trunk/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java rvmroot/trunk/MMTk/src/org/mmtk/utility/scan/Scan.java rvmroot/trunk/MMTk/src/org/mmtk/vm/Scanning.java Added Paths: ----------- rvmroot/trunk/MMTk/src/org/mmtk/plan/TransitiveClosure.java Removed Paths: ------------- rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceStep.java Modified: rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -13,7 +13,7 @@ package org.jikesrvm.mm.mmtk; import org.mmtk.plan.TraceLocal; -import org.mmtk.plan.TraceStep; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.utility.scan.Scan; import org.mmtk.utility.Constants; @@ -46,7 +46,7 @@ */ @Inline @Uninterruptible - public final void scanObject(TraceStep trace, ObjectReference object) { + public final void scanObject(TransitiveClosure trace, ObjectReference object) { // Never reached if (VM.VerifyAssertions) VM._assert(false); } Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceLocal.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceLocal.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -34,8 +34,7 @@ * @see org.mmtk.plan.Trace */ @Uninterruptible -public abstract class TraceLocal extends TraceStep - implements Constants { +public abstract class TraceLocal extends TransitiveClosure implements Constants { /**************************************************************************** * * Instance variables @@ -81,7 +80,7 @@ * @param root True if <code>objLoc</code> is within a root. */ @Inline - public final void traceObjectLocation(Address objLoc, boolean root) { + public final void processEdge(Address objLoc, boolean root) { ObjectReference object = objLoc.loadObjectReference(); ObjectReference newObject = traceObject(object, root); objLoc.store(newObject); @@ -97,8 +96,8 @@ * traced. The object reference is <i>NOT</i> an interior pointer. */ @Inline - public final void traceObjectLocation(Address objLoc) { - traceObjectLocation(objLoc, false); + public final void processEdge(Address objLoc) { + processEdge(objLoc, false); } /** @@ -111,9 +110,7 @@ * @param root True if the reference to <code>obj</code> was held in a root. * @return The possibly moved interior reference. */ - public final Address traceInteriorReference(ObjectReference object, - Address interiorRef, - boolean root) { + public final Address processInteriorEdge(ObjectReference object, Address interiorRef, boolean root) { Offset offset = interiorRef.diff(object.toAddress()); ObjectReference newObject = traceObject(object, root); if (VM.VERIFY_ASSERTIONS) { @@ -158,7 +155,7 @@ * @param object The object to be enqueued */ @Inline - public final void enqueue(ObjectReference object) { + public final void processNode(ObjectReference object) { values.push(object); } @@ -446,14 +443,14 @@ logMessage(5, "processing root locations"); while (!rootLocations.isEmpty()) { Address loc = rootLocations.pop(); - traceObjectLocation(loc, true); + processEdge(loc, true); } logMessage(5, "processing interior root locations"); while (!interiorRootLocations.isEmpty()) { ObjectReference obj = interiorRootLocations.pop1().toObjectReference(); Address interiorLoc = interiorRootLocations.pop2(); Address interior = interiorLoc.loadAddress(); - Address newInterior = traceInteriorReference(obj, interior, true); + Address newInterior = processInteriorEdge(obj, interior, true); interiorLoc.store(newInterior); } completeTrace(); @@ -516,16 +513,6 @@ } /** - * Copying traces should override this stub - * - * @return The allocator id to use when copying. - */ - public int getAllocator() { - if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(false); - return -1; - } - - /** * Given a slot (ie the address of an ObjectReference), ensure that the * referent will not move for the rest of the GC. This is achieved by * calling the precopyObject method. Deleted: rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceStep.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceStep.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceStep.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -1,35 +0,0 @@ -/* - * This file is part of the Jikes RVM project (http://jikesrvm.org). - * - * This file is licensed to You under the Common Public License (CPL); - * You may not use this file except in compliance with the License. You - * may obtain a copy of the License at - * - * http://www.opensource.org/licenses/cpl1.0.php - * - * See the COPYRIGHT.txt file distributed with this work for information - * regarding copyright ownership. - */ -package org.mmtk.plan; - -import org.mmtk.utility.Constants; - -import org.vmmagic.pragma.*; -import org.vmmagic.unboxed.*; - -/** - * This abstract class is the fundamental mechanism for performing a - * transitive closure over an object graph.<p> - * - * @see org.mmtk.plan.TraceLocal - */ -@Uninterruptible public abstract class TraceStep implements Constants { - - /** - * Trace a reference during GC. - * - * @param objLoc The location containing the object reference to be - * traced. - */ - public abstract void traceObjectLocation(Address objLoc); -} Copied: rvmroot/trunk/MMTk/src/org/mmtk/plan/TransitiveClosure.java (from rev 13386, rvmroot/trunk/MMTk/src/org/mmtk/plan/TraceStep.java) =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/TransitiveClosure.java (rev 0) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/TransitiveClosure.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -0,0 +1,47 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.mmtk.plan; + +import org.mmtk.vm.VM; +import org.vmmagic.pragma.*; +import org.vmmagic.unboxed.*; + +/** + * This abstract class is the fundamental mechanism for performing a + * transitive closure over an object graph.<p> + * + * Some mechanisms only operate on nodes or edges, but due to limitations + * of inheritance we have combined these two here. + * + * @see org.mmtk.plan.TraceLocal + */ +@Uninterruptible +public abstract class TransitiveClosure { + /** + * Trace an edge during GC. + * + * @param objLoc The location containing the object reference. + */ + public void processEdge(Address objLoc) { + VM.assertions.fail("processEdge not implemented."); + } + + /** + * Trace a node during GC. + * + * @param object The object to be processed. + */ + public void processNode(ObjectReference object) { + VM.assertions.fail("processNode not implemented."); + } +} Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/copyms/CopyMSTraceLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/copyms/CopyMSTraceLocal.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/copyms/CopyMSTraceLocal.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -72,7 +72,7 @@ public ObjectReference traceObject(ObjectReference object) { if (object.isNull()) return object; if (Space.isInSpace(CopyMS.NURSERY, object)) - return CopyMS.nurserySpace.traceObject(this, object); + return CopyMS.nurserySpace.traceObject(this, object, CopyMS.ALLOC_MS); if (Space.isInSpace(CopyMS.MARK_SWEEP, object)) return CopyMS.msSpace.traceObject(this, object); return super.traceObject(object); @@ -89,7 +89,7 @@ public ObjectReference precopyObject(ObjectReference object) { if (object.isNull()) return object; else if (Space.isInSpace(CopyMS.NURSERY, object)) - return CopyMS.nurserySpace.traceObject(this, object); + return CopyMS.nurserySpace.traceObject(this, object, CopyMS.ALLOC_MS); else return object; } @@ -103,12 +103,4 @@ public boolean willNotMoveInCurrentCollection(ObjectReference object) { return !Space.isInSpace(CopyMS.NURSERY, object); } - - /** - * @return The allocator to use when copying objects. - */ - @Inline - public int getAllocator() { - return CopyMS.ALLOC_MS; - } } Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/GenMatureTraceLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/GenMatureTraceLocal.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/GenMatureTraceLocal.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -102,7 +102,7 @@ if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!object.isNull()); if (object.toAddress().GE(Gen.NURSERY_START)) { if (object.toAddress().LT(Gen.NURSERY_END)) - return Gen.nurserySpace.traceObject(this, object); + return Gen.nurserySpace.traceObject(this, object, Gen.ALLOC_MATURE_MAJORGC); else return Gen.ploSpace.traceObject(this, object); } @@ -110,16 +110,6 @@ } /** - * Where do we send copied objects ? - * - * @return The allocator for copied objects - */ - @Inline - public final int getAllocator() { - return Gen.ALLOC_MATURE_MAJORGC; - } - - /** * Process any remembered set entries. */ protected void processRememberedSets() { Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/GenNurseryTraceLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/GenNurseryTraceLocal.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/GenNurseryTraceLocal.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -83,7 +83,7 @@ public ObjectReference traceObject(ObjectReference object) { if (!object.isNull() && object.toAddress().GE(Gen.NURSERY_START)) { if (object.toAddress().LT(Gen.NURSERY_END)) - return Gen.nurserySpace.traceObject(this, object); + return Gen.nurserySpace.traceObject(this, object, Gen.ALLOC_MATURE_MINORGC); else return Gen.ploSpace.traceObject(this, object); } @@ -98,7 +98,7 @@ logMessage(5, "processing remset"); while (!remset.isEmpty()) { Address loc = remset.pop(); - traceObjectLocation(loc, false); + processEdge(loc, false); } logMessage(5, "processing array remset"); arrayRemset.flushLocal(); @@ -106,21 +106,13 @@ Address start = arrayRemset.pop1(); Address guard = arrayRemset.pop2(); while (start.LT(guard)) { - traceObjectLocation(start, false); + processEdge(start, false); start = start.plus(BYTES_IN_ADDRESS); } } } /** - * @return The allocator to use when copying objects during this trace. - */ - @Inline - public int getAllocator() { - return Gen.ALLOC_MATURE_MINORGC; - } - - /** * Will the object move from now on during the collection. * * @param object The object to query. Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/copying/GenCopyMatureTraceLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/copying/GenCopyMatureTraceLocal.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/generational/copying/GenCopyMatureTraceLocal.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,6 +12,7 @@ */ package org.mmtk.plan.generational.copying; +import org.mmtk.plan.generational.Gen; import org.mmtk.plan.generational.GenCollector; import org.mmtk.plan.generational.GenMatureTraceLocal; import org.mmtk.plan.Trace; @@ -55,9 +56,9 @@ if (object.isNull()) return object; if (Space.isInSpace(GenCopy.MS0, object)) - return GenCopy.matureSpace0.traceObject(this, object); + return GenCopy.matureSpace0.traceObject(this, object, Gen.ALLOC_MATURE_MAJORGC); if (Space.isInSpace(GenCopy.MS1, object)) - return GenCopy.matureSpace1.traceObject(this, object); + return GenCopy.matureSpace1.traceObject(this, object, Gen.ALLOC_MATURE_MAJORGC); return super.traceObject(object); } Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/markcompact/MCMarkTraceLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/markcompact/MCMarkTraceLocal.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/markcompact/MCMarkTraceLocal.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -88,7 +88,7 @@ // Currently, Jikes RVM does not require many objects to be precopied. ObjectReference newObject = VM.objectModel.copy(object, MC.ALLOC_IMMORTAL); MarkCompactSpace.setForwardingPointer(object, newObject); - enqueue(newObject); + processNode(newObject); return newObject; } // Somebody else got to it first Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/DecBuffer.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/DecBuffer.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/DecBuffer.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -21,9 +21,10 @@ /** * This class implements a dec-buffer for a reference counting collector * - * @see org.mmtk.plan.TraceStep + * @see org.mmtk.plan.TransitiveClosure */ -@Uninterruptible public final class DecBuffer extends ObjectReferenceBuffer implements Constants { +@Uninterruptible +public final class DecBuffer extends ObjectReferenceBuffer implements Constants { /**************************************************************************** * * Initialization Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/RCBaseCollector.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/RCBaseCollector.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/RCBaseCollector.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -195,7 +195,7 @@ * Process the modified object buffers. */ public void processModBuffer() { - TraceStep modProcessor = getModifiedProcessor(); + TransitiveClosure modProcessor = getModifiedProcessor(); ObjectReference current; while (!(current = modBuffer.pop()).isNull()) { RCHeader.makeUnlogged(current); @@ -220,7 +220,7 @@ } /** @return The TraceStep to use when processing modified objects. */ - protected abstract TraceStep getModifiedProcessor(); + protected abstract TransitiveClosure getModifiedProcessor(); /** @return The active cycle detector instance */ @Inline Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionCollectStep.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionCollectStep.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionCollectStep.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,7 +12,7 @@ */ package org.mmtk.plan.refcount.cd; -import org.mmtk.plan.TraceStep; +import org.mmtk.plan.TransitiveClosure; import org.vmmagic.pragma.*; import org.vmmagic.unboxed.*; @@ -20,7 +20,8 @@ /** * This trace step is used during trial deletion processing. */ -@Uninterruptible public final class TrialDeletionCollectStep extends TraceStep { +@Uninterruptible +public final class TrialDeletionCollectStep extends TransitiveClosure { /** * Trace a reference during GC. @@ -28,7 +29,7 @@ * @param objLoc The location containing the object reference to be * traced. */ - public void traceObjectLocation(Address objLoc) { + public void processEdge(Address objLoc) { ObjectReference object = objLoc.loadObjectReference(); ((TrialDeletionCollector)CDCollector.current()).enumerateCollect(object); } Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionGreyStep.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionGreyStep.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionGreyStep.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,7 +12,7 @@ */ package org.mmtk.plan.refcount.cd; -import org.mmtk.plan.TraceStep; +import org.mmtk.plan.TransitiveClosure; import org.vmmagic.pragma.*; import org.vmmagic.unboxed.*; @@ -20,7 +20,8 @@ /** * This trace step is used during trial deletion processing. */ -@Uninterruptible public final class TrialDeletionGreyStep extends TraceStep { +@Uninterruptible +public final class TrialDeletionGreyStep extends TransitiveClosure { /** * Trace a reference during GC. @@ -28,7 +29,7 @@ * @param objLoc The location containing the object reference to be * traced. */ - public void traceObjectLocation(Address objLoc) { + public void processEdge(Address objLoc) { ObjectReference object = objLoc.loadObjectReference(); ((TrialDeletionCollector)CDCollector.current()).enumerateGrey(object); } Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionScanBlackStep.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionScanBlackStep.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionScanBlackStep.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,7 +12,7 @@ */ package org.mmtk.plan.refcount.cd; -import org.mmtk.plan.TraceStep; +import org.mmtk.plan.TransitiveClosure; import org.vmmagic.pragma.*; import org.vmmagic.unboxed.*; @@ -20,7 +20,8 @@ /** * This trace step is used during trial deletion processing. */ -@Uninterruptible public final class TrialDeletionScanBlackStep extends TraceStep { +@Uninterruptible +public final class TrialDeletionScanBlackStep extends TransitiveClosure { /** * Trace a reference during GC. @@ -28,7 +29,7 @@ * @param objLoc The location containing the object reference to be * traced. */ - public void traceObjectLocation(Address objLoc) { + public void processEdge(Address objLoc) { ObjectReference object = objLoc.loadObjectReference(); ((TrialDeletionCollector)CDCollector.current()).enumerateScanBlack(object); } Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionScanStep.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionScanStep.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/cd/TrialDeletionScanStep.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,7 +12,7 @@ */ package org.mmtk.plan.refcount.cd; -import org.mmtk.plan.TraceStep; +import org.mmtk.plan.TransitiveClosure; import org.vmmagic.pragma.*; import org.vmmagic.unboxed.*; @@ -20,7 +20,8 @@ /** * This trace step is used during trial deletion processing. */ -@Uninterruptible public final class TrialDeletionScanStep extends TraceStep { +@Uninterruptible +public final class TrialDeletionScanStep extends TransitiveClosure { /** * Trace a reference during GC. @@ -28,7 +29,7 @@ * @param objLoc The location containing the object reference to be * traced. */ - public void traceObjectLocation(Address objLoc) { + public void processEdge(Address objLoc) { ObjectReference object = objLoc.loadObjectReference(); ((TrialDeletionCollector)CDCollector.current()).enumerateScan(object); } Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCCollector.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCCollector.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCCollector.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -80,7 +80,7 @@ } /** @return The current modified object processor. */ - public final TraceStep getModifiedProcessor() { + public final TransitiveClosure getModifiedProcessor() { return modProcessor; } } Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCModifiedProcessor.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCModifiedProcessor.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/fullheap/RCModifiedProcessor.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,7 +12,7 @@ */ package org.mmtk.plan.refcount.fullheap; -import org.mmtk.plan.TraceStep; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.plan.refcount.RCHeader; import org.vmmagic.pragma.*; @@ -24,7 +24,8 @@ * * @see org.mmtk.plan.TraceLocal */ -@Uninterruptible public final class RCModifiedProcessor extends TraceStep { +@Uninterruptible +public final class RCModifiedProcessor extends TransitiveClosure { /** * Trace a reference during GC. @@ -32,7 +33,7 @@ * @param objLoc The location containing the object reference to be * traced. */ - public void traceObjectLocation(Address objLoc) { + public void processEdge(Address objLoc) { ObjectReference object = objLoc.loadObjectReference(); if (RC.isRCObject(object)) { RCHeader.incRC(object); Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCCollector.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCCollector.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCCollector.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -13,7 +13,7 @@ package org.mmtk.plan.refcount.generational; import org.mmtk.plan.TraceLocal; -import org.mmtk.plan.TraceStep; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.plan.refcount.RCBaseCollector; import org.mmtk.plan.refcount.RCHeader; import org.mmtk.policy.CopySpace; @@ -155,7 +155,7 @@ } /** @return The current modified object processor. */ - public final TraceStep getModifiedProcessor() { + public final TransitiveClosure getModifiedProcessor() { return modProcessor; } } Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCModifiedProcessor.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCModifiedProcessor.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCModifiedProcessor.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,7 +12,7 @@ */ package org.mmtk.plan.refcount.generational; -import org.mmtk.plan.TraceStep; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.plan.refcount.RCHeader; import org.mmtk.policy.Space; @@ -25,7 +25,8 @@ * * @see org.mmtk.plan.TraceLocal */ -@Uninterruptible public final class GenRCModifiedProcessor extends TraceStep { +@Uninterruptible +public final class GenRCModifiedProcessor extends TransitiveClosure { private final GenRCTraceLocal trace; @@ -40,11 +41,11 @@ * traced. */ @Inline - public void traceObjectLocation(Address objLoc) { + public void processEdge(Address objLoc) { ObjectReference object = objLoc.loadObjectReference(); if (!object.isNull()) { if (Space.isInSpace(GenRC.NS, object)) { - object = GenRC.nurserySpace.traceObject(trace, object); + object = GenRC.nurserySpace.traceObject(trace, object, GenRC.ALLOC_RC); RCHeader.incRC(object); objLoc.store(object); } else if (GenRC.isRCObject(object)) { Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCTraceLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCTraceLocal.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/refcount/generational/GenRCTraceLocal.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -70,7 +70,7 @@ boolean root) { if (object.isNull()) return object; if (Space.isInSpace(GenRC.NS, object)) { - object = GenRC.nurserySpace.traceObject(this, object); + object = GenRC.nurserySpace.traceObject(this, object, GenRC.ALLOC_RC); } else if (!GenRC.isRCObject(object)) { return object; } @@ -95,11 +95,6 @@ return traceObject(object, false); } - @Inline - public int getAllocator() { - return GenRC.ALLOC_RC; - } - public boolean willNotMoveInCurrentCollection(ObjectReference object) { if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!object.isNull()); return !(Space.isInSpace(GenRC.NS, object)); @@ -107,7 +102,7 @@ public ObjectReference precopyObject(ObjectReference object) { if (Space.isInSpace(GenRC.NS, object)) - return GenRC.nurserySpace.traceObject(this, object); + return GenRC.nurserySpace.traceObject(this, object, GenRC.ALLOC_RC); return object; } Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/SS.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/SS.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/SS.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -68,7 +68,7 @@ /** * Class variables */ - protected static final int ALLOC_SS = Plan.ALLOC_DEFAULT; + public static final int ALLOC_SS = Plan.ALLOC_DEFAULT; /** * Class initializer. This is executed <i>prior</i> to bootstrap Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/SSTraceLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/SSTraceLocal.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/SSTraceLocal.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -67,9 +67,9 @@ public ObjectReference traceObject(ObjectReference object) { if (object.isNull()) return object; if (Space.isInSpace(SS.SS0, object)) - return SS.copySpace0.traceObject(this, object); + return SS.copySpace0.traceObject(this, object, SS.ALLOC_SS); if (Space.isInSpace(SS.SS1, object)) - return SS.copySpace1.traceObject(this, object); + return SS.copySpace1.traceObject(this, object, SS.ALLOC_SS); return super.traceObject(object); } @@ -83,9 +83,9 @@ public ObjectReference precopyObject(ObjectReference object) { if (object.isNull()) return object; if (Space.isInSpace(SS.SS0, object)) - return SS.copySpace0.traceObject(this, object); + return SS.copySpace0.traceObject(this, object, SS.ALLOC_SS); if (Space.isInSpace(SS.SS1, object)) - return SS.copySpace1.traceObject(this, object); + return SS.copySpace1.traceObject(this, object, SS.ALLOC_SS); return object; } @@ -99,12 +99,4 @@ return (SS.hi && !Space.isInSpace(SS.SS0, object)) || (!SS.hi && !Space.isInSpace(SS.SS1, object)); } - - /** - * @return The allocator to use when copying during the trace. - */ - @Inline - public final int getAllocator() { - return SS.ALLOC_SS; - } } Modified: rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/gctrace/GCTraceTraceLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/gctrace/GCTraceTraceLocal.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/plan/semispace/gctrace/GCTraceTraceLocal.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -150,9 +150,9 @@ public ObjectReference getForwardedReference(ObjectReference object) { if (object.isNull()) return object; if (SS.hi && Space.isInSpace(SS.SS0, object)) { - return SS.copySpace0.traceObject(this, object); + return SS.copySpace0.traceObject(this, object, GCTrace.ALLOC_SS); } else if (!SS.hi && Space.isInSpace(SS.SS1, object)) { - return SS.copySpace1.traceObject(this, object); + return SS.copySpace1.traceObject(this, object, GCTrace.ALLOC_SS); } return object; } Modified: rvmroot/trunk/MMTk/src/org/mmtk/policy/CopySpace.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/policy/CopySpace.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/policy/CopySpace.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -13,6 +13,7 @@ package org.mmtk.policy; import org.mmtk.plan.TraceLocal; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.utility.heap.*; import org.mmtk.utility.Constants; @@ -237,7 +238,28 @@ * @return The forwarded object. */ @Inline - public ObjectReference traceObject(TraceLocal trace, ObjectReference object) { + public ObjectReference traceObject(TransitiveClosure trace, ObjectReference object) { + VM.assertions.fail("CopySpace.traceLocal called without allocator"); + return ObjectReference.nullReference(); + } + + /** + * Trace an object under a copying collection policy. + * + * We use a tri-state algorithm to deal with races to forward + * the object. The tracer must wait if the object is concurrently + * being forwarded by another thread. + * + * If the object is already forwarded, the copy is returned. + * Otherwise, the object is forwarded and the copy is returned. + * + * @param trace The trace being conducted. + * @param object The object to be forwarded. + * @param allocator The allocator to use when copying. + * @return The forwarded object. + */ + @Inline + public ObjectReference traceObject(TransitiveClosure trace, ObjectReference object, int allocator) { /* If the object in question is already in to-space, then do nothing */ if (!fromSpace) return object; @@ -256,9 +278,9 @@ } else { /* We are the designated copier, so forward it and enqueue it */ - ObjectReference newObject = VM.objectModel.copy(object, trace.getAllocator()); + ObjectReference newObject = VM.objectModel.copy(object, allocator); setForwardingPointer(object, newObject); - trace.enqueue(newObject); // Scan it later + trace.processNode(newObject); // Scan it later return newObject; } @@ -301,7 +323,7 @@ public static void markObject(TraceLocal trace, ObjectReference object, Word markState) { if (testAndMark(object, markState)) - trace.enqueue(object); + trace.processNode(object); } /**************************************************************************** Modified: rvmroot/trunk/MMTk/src/org/mmtk/policy/ExplicitFreeListSpace.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/policy/ExplicitFreeListSpace.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/policy/ExplicitFreeListSpace.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,7 +12,7 @@ */ package org.mmtk.policy; -import org.mmtk.plan.TraceLocal; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.utility.heap.*; import org.mmtk.utility.Constants; @@ -188,8 +188,7 @@ * void method but for compliance to a more general interface). */ @Inline - public ObjectReference traceObject(TraceLocal trace, - ObjectReference object) { + public ObjectReference traceObject(TransitiveClosure trace, ObjectReference object) { return object; } Modified: rvmroot/trunk/MMTk/src/org/mmtk/policy/ImmortalSpace.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/policy/ImmortalSpace.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/policy/ImmortalSpace.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -13,7 +13,7 @@ package org.mmtk.policy; import org.mmtk.plan.Plan; -import org.mmtk.plan.TraceLocal; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.utility.heap.MonotonePageResource; import org.mmtk.utility.Constants; @@ -197,10 +197,9 @@ * @param object The object to be traced. */ @Inline - public ObjectReference traceObject(TraceLocal trace, - ObjectReference object) { + public ObjectReference traceObject(TransitiveClosure trace, ObjectReference object) { if (testAndMark(object, markState)) - trace.enqueue(object); + trace.processNode(object); return object; } Modified: rvmroot/trunk/MMTk/src/org/mmtk/policy/LargeObjectSpace.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/policy/LargeObjectSpace.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/policy/LargeObjectSpace.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,7 +12,7 @@ */ package org.mmtk.policy; -import org.mmtk.plan.TraceLocal; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.utility.alloc.LargeObjectAllocator; import org.mmtk.utility.heap.FreeListPageResource; import org.mmtk.utility.DoublyLinkedList; @@ -247,13 +247,12 @@ * void method but for compliance to a more general interface). */ @Inline - public ObjectReference traceObject(TraceLocal trace, - ObjectReference object) { + public ObjectReference traceObject(TransitiveClosure trace, ObjectReference object) { boolean nurseryObject = isInNursery(object); if (!inNurseryGC || nurseryObject) { if (testAndMark(object, markState)) { internalMarkObject(object, nurseryObject); - trace.enqueue(object); + trace.processNode(object); } } return object; Modified: rvmroot/trunk/MMTk/src/org/mmtk/policy/MarkCompactSpace.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/policy/MarkCompactSpace.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/policy/MarkCompactSpace.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -13,6 +13,7 @@ package org.mmtk.policy; import org.mmtk.plan.TraceLocal; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.utility.heap.*; import org.mmtk.utility.Constants; @@ -124,7 +125,7 @@ * @return The forwarded object. */ @Inline - public ObjectReference traceObject(TraceLocal trace, ObjectReference object) { + public ObjectReference traceObject(TransitiveClosure trace, ObjectReference object) { if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(false); return null; @@ -143,7 +144,7 @@ @Inline public ObjectReference traceMarkObject(TraceLocal trace, ObjectReference object) { if (testAndMark(object)) { - trace.enqueue(object); + trace.processNode(object); } else if (!getForwardingPointer(object).isNull()) { return getForwardingPointer(object); } @@ -163,7 +164,7 @@ @Inline public ObjectReference traceForwardObject(TraceLocal trace, ObjectReference object) { if (testAndClearMark(object)) { - trace.enqueue(object); + trace.processNode(object); } ObjectReference newObject = getForwardingPointer(object); if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!newObject.isNull()); Modified: rvmroot/trunk/MMTk/src/org/mmtk/policy/MarkSweepSpace.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/policy/MarkSweepSpace.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/policy/MarkSweepSpace.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,7 +12,7 @@ */ package org.mmtk.policy; -import org.mmtk.plan.TraceLocal; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.utility.heap.*; import org.mmtk.utility.options.Options; import org.mmtk.utility.options.MarkSweepMarkBits; @@ -242,16 +242,15 @@ * void method but for compliance to a more general interface). */ @Inline - public ObjectReference traceObject(TraceLocal trace, - ObjectReference object) { + public ObjectReference traceObject(TransitiveClosure trace, ObjectReference object) { if (MarkSweepLocal.HEADER_MARK_BITS) { if (testAndMark(object, markState)) { MarkSweepLocal.liveBlock(object); - trace.enqueue(object); + trace.processNode(object); } } else { if (MarkSweepLocal.liveObject(object)) { - trace.enqueue(object); + trace.processNode(object); } } return object; Modified: rvmroot/trunk/MMTk/src/org/mmtk/policy/RawPageSpace.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/policy/RawPageSpace.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/policy/RawPageSpace.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,7 +12,7 @@ */ package org.mmtk.policy; -import org.mmtk.plan.TraceLocal; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.utility.heap.FreeListPageResource; import org.mmtk.utility.Constants; @@ -111,8 +111,7 @@ * @return <code>zero</code>: calling this is an error. */ @Inline - public ObjectReference traceObject(TraceLocal trace, - ObjectReference object) { + public ObjectReference traceObject(TransitiveClosure trace, ObjectReference object) { if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(false); return ObjectReference.nullReference(); } Modified: rvmroot/trunk/MMTk/src/org/mmtk/policy/Space.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/policy/Space.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/policy/Space.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -13,7 +13,7 @@ package org.mmtk.policy; import org.mmtk.plan.Plan; -import org.mmtk.plan.TraceLocal; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.utility.heap.Map; import org.mmtk.utility.heap.Mmapper; import org.mmtk.utility.heap.PageResource; @@ -635,8 +635,7 @@ * @param object The object to trace * @return The object, forwarded, if appropriate */ - public abstract ObjectReference traceObject(TraceLocal trace, - ObjectReference object); + public abstract ObjectReference traceObject(TransitiveClosure trace, ObjectReference object); /** Modified: rvmroot/trunk/MMTk/src/org/mmtk/utility/deque/ObjectReferenceBuffer.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/utility/deque/ObjectReferenceBuffer.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/utility/deque/ObjectReferenceBuffer.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -12,7 +12,7 @@ */ package org.mmtk.utility.deque; -import org.mmtk.plan.TraceStep; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.utility.Constants; import org.mmtk.utility.scan.Scan; @@ -23,9 +23,10 @@ * This class is a combination of a Deque and a TraceStep, designed to include * intelligent processing of child references as objects are scanned. * - * @see org.mmtk.plan.TraceStep + * @see org.mmtk.plan.TransitiveClosure */ -@Uninterruptible public abstract class ObjectReferenceBuffer extends TraceStep implements Constants { +@Uninterruptible +public abstract class ObjectReferenceBuffer extends TransitiveClosure implements Constants { /**************************************************************************** * * Instance variables @@ -54,7 +55,7 @@ * @param loc The location containing the object reference to process. */ @Inline - public final void traceObjectLocation(Address loc) { + public final void processEdge(Address loc) { ObjectReference object = loc.loadObjectReference(); process(object); } Modified: rvmroot/trunk/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -149,7 +149,7 @@ if (SanityDataTable.incRC(tableEntry, root)) { SanityChecker.liveObjectCount++; - trace.enqueue(object); + trace.processNode(object); } } Modified: rvmroot/trunk/MMTk/src/org/mmtk/utility/scan/Scan.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/utility/scan/Scan.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/utility/scan/Scan.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -13,7 +13,7 @@ package org.mmtk.utility.scan; import org.mmtk.plan.TraceLocal; -import org.mmtk.plan.TraceStep; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.vm.VM; @@ -31,14 +31,14 @@ * @param object The object to be scanned. */ @Inline - public static void scanObject(TraceStep trace, + public static void scanObject(TransitiveClosure trace, ObjectReference object) { MMType type = VM.objectModel.getObjectType(object); if (!type.isDelegated()) { int references = type.getReferences(object); for (int i = 0; i < references; i++) { Address slot = type.getSlot(object, i); - trace.traceObjectLocation(slot); + trace.processEdge(slot); } } else VM.scanning.scanObject(trace, object); Modified: rvmroot/trunk/MMTk/src/org/mmtk/vm/Scanning.java =================================================================== --- rvmroot/trunk/MMTk/src/org/mmtk/vm/Scanning.java 2007-08-28 09:12:51 UTC (rev 13387) +++ rvmroot/trunk/MMTk/src/org/mmtk/vm/Scanning.java 2007-08-28 09:43:21 UTC (rev 13388) @@ -13,7 +13,7 @@ package org.mmtk.vm; import org.mmtk.plan.TraceLocal; -import org.mmtk.plan.TraceStep; +import org.mmtk.plan.TransitiveClosure; import org.mmtk.utility.Constants; import org.vmmagic.pragma.Uninterruptible; @@ -26,7 +26,7 @@ * * @param object The object to be scanned. */ - public abstract void scanObject(TraceStep trace, ObjectReference object); + public abstract void scanObject(TransitiveClosure trace, ObjectReference object); /** * Delegated precopying of a object's children, processing each pointer field This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |