From: <lhe...@us...> - 2011-03-25 00:03:55
|
Revision: 16060 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=16060&view=rev Author: lhellyer Date: 2011-03-25 00:03:45 +0000 (Fri, 25 Mar 2011) Log Message: ----------- A (mostly) working concurrent on-the-fly implementation of the first Sapphire phase Merge up to 7ccc0f5e83f130e2bc668285ee9cc0f570cf3b42 Modified Paths: -------------- rvmroot/branches/RVM-893-Sapphire/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/MutatorContext.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Phase.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Plan.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Simple.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmix.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixCollector.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixConstraints.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixMatureDefragTraceLocal.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/Sapphire.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireCollector.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireMutator.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireTraceLocalFirst.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/stickyimmix/StickyImmix.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/ImmortalSpace.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/LargeObjectSpace.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/MarkSweepSpace.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/SegregatedFreeListSpace.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/options/ConcurrentTrigger.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/sanitychecker/SanityChecker.java rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/sanitychecker/SanityTraceLocal.java rvmroot/branches/RVM-893-Sapphire/build/components/javacc.xml rvmroot/branches/RVM-893-Sapphire/build/test-runs/sanity.properties rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/PhantomReference.java rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/Reference.java rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/SoftReference.java rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/WeakReference.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/VM.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMArray.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMClass.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMField.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMType.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/TypeReference.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/mm/mminterface/MemoryManager.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/mm/mminterface/SpecializedScanMethod.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/objectmodel/ObjectModel.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/objectmodel/TIB.java rvmroot/branches/RVM-893-Sapphire/rvm/src-generated/vm-configuration/HeapLayoutConstants.template rvmroot/branches/RVM-893-Sapphire/testing/tests/sapphire/build.xml rvmroot/branches/RVM-893-Sapphire/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImage.java rvmroot/branches/RVM-893-Sapphire/tools/bootImageWriter/src/org/jikesrvm/tools/bootImageWriter/BootImageWriter.java Added Paths: ----------- rvmroot/branches/RVM-893-Sapphire/common/vmmagic/src/org/vmmagic/pragma/ReferenceFieldsVary.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/mm/mminterface/AlignmentEncoding.java rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/mm/mminterface/HandInlinedScanning.java Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -23,6 +23,8 @@ import org.jikesrvm.compilers.common.CompiledMethods; import org.jikesrvm.jni.JNIEnvironment; import org.jikesrvm.jni.JNIGlobalRefTable; +import org.jikesrvm.mm.mminterface.AlignmentEncoding; +import org.jikesrvm.mm.mminterface.HandInlinedScanning; import org.jikesrvm.mm.mminterface.Selected; import org.jikesrvm.mm.mminterface.MemoryManagerConstants; import org.jikesrvm.mm.mminterface.SpecializedScanMethod; @@ -49,7 +51,12 @@ */ @Inline public void scanObject(TransitiveClosure trace, ObjectReference object) { - SpecializedScanMethod.fallback(object.toObject(), trace); + if (HandInlinedScanning.ENABLED) { + int tibCode = AlignmentEncoding.getTibCode(object); + HandInlinedScanning.scanObject(tibCode, object.toObject(), trace); + } else { + SpecializedScanMethod.fallback(object.toObject(), trace); + } } @Inline @@ -72,10 +79,15 @@ */ @Inline public void specializedScanObject(int id, TransitiveClosure trace, ObjectReference object) { - if (SpecializedScanMethod.ENABLED) { - SpecializedScanMethod.invoke(id, object.toObject(), trace); + if (HandInlinedScanning.ENABLED) { + int tibCode = AlignmentEncoding.getTibCode(object); + HandInlinedScanning.scanObject(tibCode, id, object.toObject(), trace); } else { - SpecializedScanMethod.fallback(object.toObject(), trace); + if (SpecializedScanMethod.ENABLED) { + SpecializedScanMethod.invoke(id, object.toObject(), trace); + } else { + SpecializedScanMethod.fallback(object.toObject(), trace); + } } } Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/MutatorContext.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/MutatorContext.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/MutatorContext.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -232,9 +232,9 @@ switch (allocator) { case Plan.ALLOC_LOS: Plan.loSpace.initializeHeader(ref, true); return; case Plan.ALLOC_IMMORTAL: Plan.immortalSpace.initializeHeader(ref); return; - case Plan.ALLOC_CODE: Plan.smallCodeSpace.initializeHeader(ref, true); return; + case Plan.ALLOC_CODE: Plan.smallCodeSpace.initializeHeader(ref, true); return; case Plan.ALLOC_LARGE_CODE: Plan.largeCodeSpace.initializeHeader(ref, true); return; - case Plan.ALLOC_NON_MOVING: Plan.nonMovingSpace.initializeHeader(ref, true); return; + case Plan.ALLOC_NON_MOVING: Plan.nonMovingSpace.initializeHeader(ref, true); return; default: VM.assertions.fail("No such allocator"); } @@ -262,7 +262,7 @@ if (Plan.USE_CODE_SPACE && space == Plan.largeCodeSpace) return lgcode; // Invalid request has been made - if (space == Plan.metaDataSpace) { + if (space == Plan.metaDataSpace || space == Plan.metaDataSpace1 || space == Plan.metaDataSpace2) { VM.assertions.fail("MutatorContext.getAllocatorFromSpace given meta space"); } else if (space != null) { VM.assertions.fail("MutatorContext.getAllocatorFromSpace given invalid space"); Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Phase.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Phase.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Phase.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -498,7 +498,7 @@ /* Start the timer(s) */ if (primary) { if (resume) { - resumeComplexTimers(); + // resumeComplexTimers(); } if (p.timer != null) p.timer.start(); if (startComplexTimer > 0) { @@ -552,7 +552,12 @@ MutatorContext mutator; while ((mutator = VM.activePlan.getNextMutator()) != null) { if (VM.DEBUG) VM.debugging.mutatorPhase(phaseId,mutator.getId(),true); - if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(VM.collection.isBlockedForGC(mutator)); + if (VM.VERIFY_ASSERTIONS) { + if (!VM.collection.isBlockedForGC(mutator)) { + Log.write("Argh expected mutators to be stopped and they weren't, phase is "); Log.writeln(Phase.getName(phaseId)); + VM.assertions.fail("DEAD"); + } + } mutator.collectionPhase(phaseId, primary); if (VM.DEBUG) VM.debugging.mutatorPhase(phaseId,mutator.getId(),false); } @@ -579,7 +584,7 @@ /* We are yielding to a concurrent collection phase */ if (logDetails) Log.writeln(" Yielding..."); if (primary) { - pauseComplexTimers(); + // pauseComplexTimers(); //LPJH: disable timers for the moment as we never start them anyway /* Concurrent phase, we need to stop gc and set correct phase for the concurrent GC * @phaseStackPointer will have the complex phase continueConcurrentScheduledPhase associated with * the current concurrent phase Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Plan.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Plan.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Plan.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -111,6 +111,8 @@ /** All meta data that is used by MMTk is allocated (and accounted for) in the meta data space. */ public static final RawPageSpace metaDataSpace = new RawPageSpace("meta", VMRequest.create()); + public static final RawPageSpace metaDataSpace1 = new RawPageSpace("meta1", VMRequest.create()); + public static final RawPageSpace metaDataSpace2 = new RawPageSpace("meta2", VMRequest.create()); /** Large objects are allocated into a special large object space. */ public static final LargeObjectSpace loSpace = new LargeObjectSpace("los", VMRequest.create()); @@ -791,7 +793,7 @@ * allocation, excluding space reserved for copying. */ public int getPagesUsed() { - return loSpace.reservedPages() + immortalSpace.reservedPages() + + return loSpace.reservedPages() + // immortalSpace.reservedPages() + metaDataSpace.reservedPages() + nonMovingSpace.reservedPages(); } @@ -836,7 +838,7 @@ */ public final boolean poll(boolean spaceFull, Space space) { if (collectionRequired(spaceFull, space)) { - if (space == metaDataSpace) { + if (space == metaDataSpace || space == metaDataSpace1 || space == metaDataSpace2) { /* In general we must not trigger a GC on metadata allocation since * this is not, in general, in a GC safe point. Instead we initiate * an asynchronous GC, which will occur at the next safe point. @@ -851,10 +853,14 @@ } if (concurrentCollectionRequired(space)) { - if (space == metaDataSpace) { + if (space == metaDataSpace || space == metaDataSpace2) { logPoll(space, "Triggering async concurrent collection"); triggerInternalCollectionRequest(); return false; + } else if (space == metaDataSpace1) { + logPoll(space, "Triggering async concurrent collection"); + triggerInternalCollectionRequest(); + return false; } else { logPoll(space, "Triggering concurrent collection"); triggerInternalCollectionRequest(); Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Simple.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Simple.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/Simple.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -123,15 +123,18 @@ Phase.scheduleGlobal (PREPARE), Phase.scheduleCollector (PREPARE)); + protected static final short rootScanPhase = Phase.createComplex("root-scan", null, + Phase.scheduleComplex (prepareStacks), + Phase.scheduleCollector(STACK_ROOTS), + Phase.scheduleGlobal (STACK_ROOTS), + Phase.scheduleCollector(ROOTS), + Phase.scheduleGlobal (ROOTS)); + /** * Perform the initial determination of liveness from the roots. */ protected static final short rootClosurePhase = Phase.createComplex("initial-closure", null, - Phase.scheduleComplex (prepareStacks), - Phase.scheduleCollector(STACK_ROOTS), - Phase.scheduleGlobal (STACK_ROOTS), - Phase.scheduleCollector(ROOTS), - Phase.scheduleGlobal (ROOTS), + Phase.scheduleComplex (rootScanPhase), Phase.scheduleGlobal (CLOSURE), Phase.scheduleCollector (CLOSURE)); // over loaded to concurrentClosure @@ -162,7 +165,7 @@ * Complete closure including reference types and finalizable objects. */ protected static final short completeClosurePhase = Phase.createComplex("release", null, - Phase.scheduleSTWmutator (RELEASE), + Phase.scheduleSTWmutator(RELEASE), Phase.scheduleCollector (RELEASE), Phase.scheduleGlobal (RELEASE)); Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmix.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmix.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmix.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -62,8 +62,8 @@ public static final int IMMIX = immixSpace.getDescriptor(); + /** Specialized scanning method identifier */ public static final int SCAN_IMMIX = 1; - public static final int SCAN_DEFRAG = 2; /**************************************************************************** * @@ -202,7 +202,7 @@ @Interruptible protected void registerSpecializedMethods() { TransitiveClosure.registerSpecializedScan(SCAN_IMMIX, GenImmixMatureTraceLocal.class); - TransitiveClosure.registerSpecializedScan(SCAN_DEFRAG, GenImmixMatureDefragTraceLocal.class); +// TransitiveClosure.registerSpecializedScan(SCAN_DEFRAG, GenImmixMatureDefragTraceLocal.class); super.registerSpecializedMethods(); } } Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixCollector.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixCollector.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixCollector.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -134,7 +134,7 @@ * @param phaseId Collection phase to perform * @param primary Is this thread to do the one-off thread-local tasks */ - @NoInline + @Inline public void collectionPhase(short phaseId, boolean primary) { TraceLocal trace = GenImmix.immixSpace.inImmixDefragCollection() ? defragTrace : matureTrace; Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixConstraints.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixConstraints.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixConstraints.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -28,7 +28,7 @@ public class GenImmixConstraints extends GenConstraints { /** @return The specialized scan methods required */ @Override - public int numSpecializedScans() { return 3; } + public int numSpecializedScans() { return 2; } @Override public int maxNonLOSCopyBytes() { return MAX_IMMIX_OBJECT_BYTES;} } Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixMatureDefragTraceLocal.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixMatureDefragTraceLocal.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/generational/immix/GenImmixMatureDefragTraceLocal.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -37,7 +37,7 @@ * Constructor */ public GenImmixMatureDefragTraceLocal(Trace global, GenCollector plan) { - super(GenImmix.SCAN_DEFRAG, global, plan); + super(-1, global, plan); } /** Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/Sapphire.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/Sapphire.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/Sapphire.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -37,8 +37,11 @@ */ /** True if allocating into the "higher" semispace */ - public static boolean low = true; // True if allocing to "lower" semispace + public static volatile boolean low = true; // True if allocing to "lower" semispace, volatile so collector thread always reads the + // right value + public static boolean iuTerminationMustCheckRoots = true; + /** One of the two semi spaces that alternate roles at each collection */ public static final ReplicatingSpace repSpace0 = new ReplicatingSpace("rep-ss0", VMRequest.create()); public static final int SS0 = repSpace0.getDescriptor(); @@ -90,8 +93,8 @@ * Constructor */ public Sapphire() { - globalFirstTrace = new Trace(metaDataSpace); - globalSecondTrace = new Trace(metaDataSpace); + globalFirstTrace = new Trace(metaDataSpace1); + globalSecondTrace = new Trace(metaDataSpace2); /** * This is the phase that is executed to perform a collection. */ @@ -99,19 +102,21 @@ Phase.schedulePlaceholder(PRE_SANITY_PLACEHOLDER), Phase.scheduleComplex(initPhase), Phase.scheduleGlobal(SAPPHIRE_PREPARE_FIRST_TRACE), - Phase.scheduleComplex(rootClosurePhase), - Phase.scheduleComplex(refTypeClosurePhase), - Phase.scheduleComplex(insertionBarrierTerminationClosurePhase), + Phase.scheduleOnTheFlyMutator(FLUSH_MUTATOR), + Phase.scheduleComplex(transitiveClosure), + Phase.scheduleGlobal(INSERTION_BARRIER_TERMINATION_CONDITION), + Phase.scheduleSpecial(DISABLE_MUTATORS), Phase.scheduleComplex(completeClosurePhase), - Phase.scheduleSpecial(DISABLE_MUTATORS), // previous phases stop us but be explict about it Phase.schedulePlaceholder(POST_SANITY_PLACEHOLDER), + // Phase.scheduleGlobal(SANITY_SET_POSTGC), + // Phase.scheduleComplex(sanityBuildPhase), + // Phase.scheduleComplex(sanityCheckPhase), Phase.scheduleSTWmutator(PREPARE), // STW here to help verify mutators are stopped, change later Phase.scheduleGlobal (PREPARE), Phase.scheduleCollector (PREPARE), Phase.scheduleGlobal(SAPPHIRE_PREPARE_SECOND_TRACE), Phase.schedulePlaceholder(PRE_SANITY_PLACEHOLDER), - Phase.scheduleComplex(rootClosurePhase), - Phase.scheduleComplex(refTypeClosurePhase), + Phase.scheduleComplex(transitiveClosure), Phase.scheduleComplex(forwardPhase), Phase.scheduleComplex(completeClosurePhase), Phase.schedulePlaceholder(POST_SANITY_PLACEHOLDER), @@ -120,16 +125,10 @@ Phase.scheduleSpecial(ENABLE_MUTATORS)); } - protected static final short insertionBarrierTerminationClosurePhase = Phase.createComplex("sapphire-insertion-barrier-termination-closure", null, - Phase.scheduleSpecial(DISABLE_MUTATORS), - Phase.scheduleOnTheFlyMutator(FLUSH_MUTATOR), - Phase.scheduleComplex (prepareStacks), - Phase.scheduleCollector(STACK_ROOTS), - Phase.scheduleGlobal (STACK_ROOTS), - Phase.scheduleCollector(ROOTS), - Phase.scheduleGlobal (ROOTS), - Phase.scheduleGlobal (CLOSURE), - Phase.scheduleCollector (CLOSURE), // over loaded to concurrentClosure + protected static final short INSERTION_BARRIER_TERMINATION_CONDITION = Phase.createSimple("insertionBarrierTerminationCondition"); + + protected static final short transitiveClosure = Phase.createComplex("transitiveClosure", + Phase.scheduleComplex(rootClosurePhase), Phase.scheduleComplex(refTypeClosurePhase)); /**************************************************************************** @@ -152,6 +151,7 @@ } if (Options.verbose.getValue() >= 8) Log.writeln("Switching to 1st trace"); Sapphire.currentTrace = 1; + iuTerminationMustCheckRoots = true;; MutatorContext.globalViewInsertionBarrier = true; MutatorContext.globalViewMutatorMustDoubleAllocate = false; // must not yet turn on allocation barrier until all threads have // seen insertion barrier - this is required because otherwise new @@ -167,6 +167,35 @@ return; } + if (phaseId == INSERTION_BARRIER_TERMINATION_CONDITION) { + if (Options.verbose.getValue() >= 8) { + Log.writeln("INSERTION_BARRIER_TERMINATION_CONDITION checking for work"); + Space.printVMMap(); + } + // first check the global write buffer + if (globalFirstTrace.hasWork()) { + // found some work in a buffer + + if (Options.verbose.getValue() >= 8) Log.writeln("INSERTION_BARRIER_TERMINATION_CONDITION globalFirstTrace already contains work, mustCheckRoots will be set true"); + Phase.pushScheduledPhase(Phase.scheduleGlobal(INSERTION_BARRIER_TERMINATION_CONDITION)); // ensure we will rerun the termination check + Phase.pushScheduledPhase(Phase.scheduleComplex(transitiveClosure)); // do another transitive closure + iuTerminationMustCheckRoots = true; // we will need to check for work again + return; + } + if (iuTerminationMustCheckRoots) { // do we need to check the roots? + if (Options.verbose.getValue() >= 8) Log.writeln("INSERTION_BARRIER_TERMINATION_CONDITION mustCheckRoots true, will scan roots"); + // in reverse order do... + Phase.pushScheduledPhase(Phase.scheduleGlobal(INSERTION_BARRIER_TERMINATION_CONDITION)); // ensure we will rerun the termination check + Phase.pushScheduledPhase(Phase.scheduleCollector(FLUSH_COLLECTOR)); // flush collector threads that scanned the stacks + Phase.pushScheduledPhase(Phase.scheduleOnTheFlyMutator(FLUSH_MUTATOR)); // flush here so we can tell if there is any work left on the queues + Phase.pushScheduledPhase(Phase.scheduleComplex(rootScanPhase)); // do another transitive closure + iuTerminationMustCheckRoots = false; // will be set to true if globalFirstTrace finds work + return; + } + if (Options.verbose.getValue() >= 8) Log.writeln("INSERTION_BARRIER_TERMINATION_CONDITION found no work and did not have to scan roots, done"); + return; + } + if (phaseId == PRE_TRACE_LINEAR_SCAN) { if (currentTrace == 0) { // run *before* 1st trace Log.writeln("Global running preFirstPhaseFromSpaceLinearSanityScan and preFirstPhaseToSpaceLinearSanityScan"); @@ -445,10 +474,10 @@ /* Set up the concurrent marking phase */ replacePhase(Phase.scheduleCollector(CLOSURE), Phase.scheduleComplex(concurrentClosure)); - if (Options.sanityCheck.getValue()) { - Log.writeln("Sapphire Collection sanity checking enabled."); - replacePhase(Phase.schedulePlaceholder(PRE_SANITY_PLACEHOLDER), Phase.scheduleComplex(preSanityPhase)); - replacePhase(Phase.schedulePlaceholder(POST_SANITY_PLACEHOLDER), Phase.scheduleComplex(postSanityPhase)); - } + // if (Options.sanityCheck.getValue()) { + // Log.writeln("Sapphire Collection sanity checking enabled."); + // replacePhase(Phase.schedulePlaceholder(PRE_SANITY_PLACEHOLDER), Phase.scheduleComplex(preSanityPhase)); + // replacePhase(Phase.schedulePlaceholder(POST_SANITY_PLACEHOLDER), Phase.scheduleComplex(postSanityPhase)); + // } } } Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireCollector.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireCollector.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireCollector.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -15,10 +15,10 @@ import org.mmtk.plan.*; import org.mmtk.plan.concurrent.ConcurrentCollector; import org.mmtk.policy.CopyLocal; -import org.mmtk.policy.LargeObjectLocal; import org.mmtk.policy.Space; import org.mmtk.utility.ForwardingWord; import org.mmtk.utility.Log; +import org.mmtk.utility.options.Options; import org.mmtk.vm.VM; import org.vmmagic.unboxed.*; @@ -33,8 +33,7 @@ protected final SapphireTraceLocalFirst localFirstTrace; protected final SapphireTraceLocalSecond localSecondTrace; - protected final CopyLocal ss; - protected final LargeObjectLocal los; + protected final CopyLocal ss = new CopyLocal(); /**************************************************************************** @@ -54,9 +53,6 @@ * @param tr The trace to use */ protected SapphireCollector(SapphireTraceLocalFirst tr, SapphireTraceLocalSecond tr2) { - ss = new CopyLocal(); - ss.rebind(Sapphire.toSpace()); - los = new LargeObjectLocal(Plan.loSpace); localFirstTrace = tr; localSecondTrace = tr2; } @@ -77,22 +73,14 @@ * @return The address of the first byte of the allocated region */ @Inline - public Address allocCopy(ObjectReference original, int bytes, - int align, int offset, int allocator) { - if (allocator == Plan.ALLOC_LOS) { - if (VM.VERIFY_ASSERTIONS) - VM.assertions._assert(bytes > Plan.MAX_NON_LOS_COPY_BYTES); - VM.assertions.fail("Sapphire debugging - should not copy into LOS at present"); - return los.alloc(bytes, align, offset); - } else { - if (VM.VERIFY_ASSERTIONS) { - // VM.assertions._assert(bytes <= Plan.MAX_NON_LOS_COPY_BYTES); // LPJH: when allow copying to LOS then uncomment this - VM.assertions._assert(allocator == Sapphire.ALLOC_REPLICATING); - } - Address addy = ss.alloc(bytes, align, offset); - // Log.write("AllocCopy "); Log.writeln(addy.plus(16)); // hard coded nasty hack - return addy; + public Address allocCopy(ObjectReference original, int bytes, int align, int offset, int allocator) { + if (VM.VERIFY_ASSERTIONS) { + // VM.assertions._assert(bytes <= Plan.MAX_NON_LOS_COPY_BYTES); // LPJH: when allow copying to LOS then uncomment this + VM.assertions._assert(allocator == Sapphire.ALLOC_REPLICATING); } + Address addy = ss.alloc(bytes, align, offset); + // Log.write("AllocCopy "); Log.writeln(addy.plus(16)); // hard coded nasty hack + return addy; } /** @@ -111,13 +99,10 @@ } ForwardingWord.clearForwardingBits(to); if (VM.VERIFY_ASSERTIONS) { + VM.assertions._assert(allocator == Sapphire.ALLOC_REPLICATING); VM.assertions._assert(!ForwardingWord.isBusy(to)); VM.assertions._assert(!ForwardingWord.isForwarded(to)); - } - if (allocator == Plan.ALLOC_LOS) - Plan.loSpace.initializeHeader(to, false); - if (VM.VERIFY_ASSERTIONS) { -// VM.assertions._assert(getCurrentTrace().isLive(from)); // FP is installed after Copy + // VM.assertions._assert(getCurrentTrace().isLive(from)); // FP is installed after Copy if(!getCurrentTrace().willNotMoveInCurrentCollection(to)) { Log.write("Argh postCopy assertion failure with toSpace copy "); Log.writeln(to); Space.printVMMap(); @@ -163,11 +148,14 @@ // about to first trace // rebind the copy bump pointer to the appropriate semispace. ss.rebind(Sapphire.toSpace()); + if (Options.verbose.getValue() >= 8) { + Log.write("Bound collector #", getId()); + Log.writeln(ss.getSpace().getName()); + } } else { // about to second trace if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(Sapphire.currentTrace == 1); } - los.prepare(true); super.collectionPhase(phaseId, primary); return; } @@ -205,20 +193,21 @@ if (phaseId == Sapphire.RELEASE) { getCurrentTrace().release(); - los.release(true); super.collectionPhase(phaseId, primary); return; } if (phaseId == Sapphire.COMPLETE) { if (Sapphire.currentTrace == 2) { - // second trace + // end of gc no more objects to copy Sapphire.deadBumpPointersLock.acquire(); - Sapphire.deadFromSpaceBumpPointers.tackOn(ss); + Sapphire.deadFromSpaceBumpPointers.tackOn(ss); // collector allocation now becomes fromSpace allocation Sapphire.deadBumpPointersLock.release(); - ss.reset(); // reset the bump pointer as it will not be used for any more alloc during this GC - } else { - // current trace 1 + ss.reset(); // reset the bump pointer + if (Options.verbose.getValue() >= 8) { + Log.write("Reset collector #", getId()); + Log.writeln(ss.getSpace().getName()); + } } super.collectionPhase(phaseId, primary); return; @@ -227,7 +216,30 @@ super.collectionPhase(phaseId, primary); } + /** + * Perform some concurrent collection work. + * + * @param phaseId + * The unique phase identifier + */ + @Unpreemptible + public void concurrentCollectionPhase(short phaseId) { + ss.rebind(Sapphire.toSpace()); + if (Options.verbose.getValue() >= 8) { + Log.write("Bound concurrent collector #", getId()); + Log.writeln(ss.getSpace().getName()); + } + super.concurrentCollectionPhase(phaseId); + Sapphire.deadBumpPointersLock.acquire(); + Sapphire.deadToSpaceBumpPointers.tackOn(ss); // stuff we concurrently allocated is toSpace + Sapphire.deadBumpPointersLock.release(); + ss.reset(); + if (Options.verbose.getValue() >= 8) { + Log.writeln("Reset concurrent collector and tacked on to deadToSpace #", getId()); + } + } + /**************************************************************************** * * Object processing and tracing Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireMutator.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireMutator.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireMutator.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -15,6 +15,7 @@ import org.mmtk.plan.*; import org.mmtk.plan.concurrent.ConcurrentMutator; import org.mmtk.policy.CopyLocal; +import org.mmtk.policy.SegregatedFreeListSpace; import org.mmtk.policy.Space; import org.mmtk.utility.ForwardingWord; import org.mmtk.utility.Log; @@ -101,6 +102,7 @@ * @param allocator The allocator number to be used for this allocation */ @Inline + // postAlloc called for new Scalars and Arrays public void postAlloc(ObjectReference object, ObjectReference typeRef, int bytes, int allocator, int align, int offset) { if (allocator == Sapphire.ALLOC_REPLICATING) { if (mutatorMustDoubleAllocate) { @@ -109,12 +111,50 @@ Address toSpace = toSpaceLocal.alloc(alignedUpBytes, align, offset); // Log.write("PostAlloc "); Log.writeln(toSpace.plus(16)); // hard coded nasty hack ObjectReference newObject = VM.objectModel.fillInBlankDoubleRelica(object, toSpace, bytes); + if (VM.VERIFY_ASSERTIONS) { + VM.assertions._assert(Sapphire.inToSpace(toSpace)); + VM.assertions._assert(Sapphire.inToSpace(newObject)); + } VM.objectModel.writeReplicaPointer(object, newObject); // avoid a load of assertions // Log.write("Finished double allocing for "); Log.writeln(object); } + return; + } + postAlloc(object, typeRef, bytes, allocator); // not in Sapphire space + } + + public void postAlloc(ObjectReference object, ObjectReference typeRef, int bytes, int allocator) { + // not in Sapphire space + if (mutatorMustDoubleAllocate) { // consider if we need to blacken the object + if (allocator == Sapphire.ALLOC_CODE) { + Plan.smallCodeSpace.initializeHeader(object, true); + boolean result = Sapphire.smallCodeSpace.testAndMark(object); + SegregatedFreeListSpace.markBlock(object); // ensure the current block we are allocating into is marked live + if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(result); + } else if (allocator == Sapphire.ALLOC_NON_MOVING) { + Plan.nonMovingSpace.initializeHeader(object, true); + boolean result = Sapphire.nonMovingSpace.testAndMark(object); + SegregatedFreeListSpace.markBlock(object); // ensure the current block we are allocating into is marked live + if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(result); + } else if (allocator == Sapphire.ALLOC_LARGE_CODE) { + Plan.largeCodeSpace.initializeHeader(object, false); + } else if (allocator == Sapphire.ALLOC_LOS) { + Plan.loSpace.initializeHeader(object, false); + } else if (allocator == Sapphire.ALLOC_IMMORTAL) { + Plan.immortalSpace.initializeHeader(object); + Sapphire.immortalSpace.makeBlack(object); + } } else { - super.postAlloc(object, typeRef, bytes, allocator); - checkAndEnqueueReference(object); // could consider using makeAllocAsMarked() but can only do so after insertion barrier is turned on + // don't need to alloc black + switch (allocator) { + case Plan.ALLOC_LOS: Plan.loSpace.initializeHeader(object, true); return; + case Plan.ALLOC_IMMORTAL: Plan.immortalSpace.initializeHeader(object); return; + case Plan.ALLOC_CODE: Plan.smallCodeSpace.initializeHeader(object, true); return; + case Plan.ALLOC_LARGE_CODE: Plan.largeCodeSpace.initializeHeader(object, true); return; + case Plan.ALLOC_NON_MOVING: Plan.nonMovingSpace.initializeHeader(object, true); return; + default: + VM.assertions.fail("No such allocator"); + } } } @@ -960,6 +1000,7 @@ * Flush per-mutator remembered sets into the global remset pool. */ public final void flushRememberedSets() { + if (Options.verbose.getValue() >= 8) Log.writeln("Flushing #", getId()); mutatorLocalTraceWriteBuffer.flush(); assertRemsetsFlushed(); } @@ -995,7 +1036,8 @@ } if (VM.VERIFY_ASSERTIONS) { - if (!ref.isNull() && !Plan.gcInProgress()) { + VM.assertions._assert(VM.objectModel.validRef(ref)); // catch inserting a non valid reference + if (!Plan.gcInProgress()) { if (Space.isInSpace(Sapphire.SS0, ref)) VM.assertions._assert(Sapphire.repSpace0.isLive(ref)); else if (Space.isInSpace(Sapphire.SS1, ref)) VM.assertions._assert(Sapphire.repSpace1.isLive(ref)); else if (Space.isInSpace(Sapphire.IMMORTAL, ref)) VM.assertions._assert(Sapphire.immortalSpace.isLive(ref)); Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireTraceLocalFirst.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireTraceLocalFirst.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/sapphire/SapphireTraceLocalFirst.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -112,6 +112,7 @@ // this work here is necessary because we don't want the insertion barrier to do any work (allocation) // therefore the insertion barrier can't mark objects as live so we must do that before we scan the object traceObject(v); // the object we just popped is not yet live, mark it as live + if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(isLive(v)); scanObject(v); // now that we have made the object live, scan it's children } processRememberedSets(); Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/stickyimmix/StickyImmix.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/stickyimmix/StickyImmix.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/plan/stickyimmix/StickyImmix.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -122,7 +122,6 @@ super.collectionPhase(phaseId); collectWholeHeap = requiresFullHeapCollection(); if (Stats.gatheringStats() && collectWholeHeap) fullHeap.set(); - super.collectionPhase(phaseId); return; } Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/ImmortalSpace.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/ImmortalSpace.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/ImmortalSpace.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -84,6 +84,13 @@ * @param object The newly allocated object instance whose header we are initializing */ public void initializeHeader(ObjectReference object) { + // byte oldValue = VM.objectModel.readAvailableByte(object); + // byte newValue = (byte) ((oldValue & GC_MARK_BIT_MASK) | markState); + // if (HeaderByte.NEEDS_UNLOGGED_BIT) newValue |= HeaderByte.UNLOGGED_BIT; + // VM.objectModel.writeAvailableByte(object, newValue); + } + + public void makeBlack(ObjectReference object) { byte oldValue = VM.objectModel.readAvailableByte(object); byte newValue = (byte) ((oldValue & GC_MARK_BIT_MASK) | markState); if (HeaderByte.NEEDS_UNLOGGED_BIT) newValue |= HeaderByte.UNLOGGED_BIT; Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/LargeObjectSpace.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/LargeObjectSpace.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/LargeObjectSpace.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -171,7 +171,7 @@ * @param object The object which has been marked. */ @Inline - private void internalMarkObject(ObjectReference object, boolean nurseryObject) { + public void internalMarkObject(ObjectReference object, boolean nurseryObject) { Address cell = VM.objectModel.objectStartRef(object); Address node = Treadmill.midPayloadToNode(cell); @@ -193,7 +193,7 @@ @Inline public void initializeHeader(ObjectReference object, boolean alloc) { byte oldValue = VM.objectModel.readAvailableByte(object); - byte newValue = (byte) ((oldValue & ~LOS_BIT_MASK) | markState); + byte newValue = (byte) ((oldValue & ~LOS_BIT_MASK) | markState); // when changed? if (alloc) newValue |= NURSERY_BIT; if (HeaderByte.NEEDS_UNLOGGED_BIT) newValue |= HeaderByte.UNLOGGED_BIT; VM.objectModel.writeAvailableByte(object, newValue); Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/MarkSweepSpace.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/MarkSweepSpace.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/MarkSweepSpace.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -364,7 +364,7 @@ * @param value The value to which the mark bits will be set */ @Inline - private boolean testAndMark(ObjectReference object) { + public boolean testAndMark(ObjectReference object) { byte oldValue, markBits; oldValue = VM.objectModel.readAvailableByte(object); markBits = (byte) (oldValue & MARK_COUNT_MASK); Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/SegregatedFreeListSpace.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/SegregatedFreeListSpace.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/policy/SegregatedFreeListSpace.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -815,7 +815,7 @@ * @param object The object whose blocks liveness is to be set. */ @Inline - protected static void markBlock(ObjectReference object) { + public static void markBlock(ObjectReference object) { BlockAllocator.markBlockMeta(object); } Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/options/ConcurrentTrigger.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/options/ConcurrentTrigger.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/options/ConcurrentTrigger.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -22,7 +22,7 @@ public ConcurrentTrigger() { super(Options.set, "Concurrent Trigger", "Concurrent trigger percentage", - 10); + 5); } /** Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/sanitychecker/SanityChecker.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/sanitychecker/SanityChecker.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/sanitychecker/SanityChecker.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -16,8 +16,10 @@ import org.mmtk.plan.Trace; import org.mmtk.plan.Simple; import org.mmtk.plan.TraceLocal; +import org.mmtk.plan.sapphire.Sapphire; import org.mmtk.policy.Space; import org.mmtk.utility.Constants; +import org.mmtk.utility.ForwardingWord; import org.mmtk.utility.Log; import org.mmtk.vm.VM; @@ -216,7 +218,7 @@ * @param object The object to mark. * @param root True If the object is a root. */ - public void processObject(TraceLocal trace, ObjectReference object, boolean root) { + public void processObject(TraceLocal trace, Address parent, ObjectReference object, boolean root) { SanityChecker.referenceCount++; if (root) SanityChecker.rootReferenceCount++; @@ -229,6 +231,20 @@ return; } + if (Space.isInSpace(Plan.NON_MOVING, object) && !Plan.nonMovingSpace.isLive(object)) { + Log.write("Argh found non moving non live object"); + VM.objectModel.dumpObject(object); + VM.objectModel.dumpObject(parent.toObjectReference()); + Space.printVMMap(); + } + + if (Sapphire.inFromSpace(object) && ForwardingWord.getReplicaPointer(object).isNull()) { + Log.write("Argh badness "); + VM.objectModel.dumpObject(object); + VM.objectModel.dumpObject(parent.toObjectReference()); + Space.printVMMap(); + } + // Get the table entry. Address tableEntry = sanityTable.getEntry(object, true); Modified: rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/sanitychecker/SanityTraceLocal.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/sanitychecker/SanityTraceLocal.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/MMTk/src/org/mmtk/utility/sanitychecker/SanityTraceLocal.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -24,6 +24,7 @@ @Uninterruptible public final class SanityTraceLocal extends TraceLocal { + private Address current; private final SanityChecker sanityChecker; /** @@ -39,6 +40,11 @@ * Object processing and tracing */ + public void scanObject(ObjectReference o) { + current = o.toAddress(); + super.scanObject(o); + current = Address.zero(); + } /** * This method is the core method during the trace of the object graph. * The role of this method is to: @@ -49,7 +55,7 @@ */ @Inline public ObjectReference traceObject(ObjectReference object, boolean root) { - sanityChecker.processObject(this, object, root); + sanityChecker.processObject(this, current, object, root); return object; } Modified: rvmroot/branches/RVM-893-Sapphire/build/components/javacc.xml =================================================================== --- rvmroot/branches/RVM-893-Sapphire/build/components/javacc.xml 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/build/components/javacc.xml 2011-03-25 00:03:45 UTC (rev 16060) @@ -36,7 +36,7 @@ <property name="javacc.web-archive" value="javacc-${javacc.version}.zip"/> <mkdir dir="${javacc.package.dir}"/> <cachedGet key="${javacc.web-archive}" - src="https://javacc.dev.java.net/files/documents/17/26777/${javacc.web-archive}" + src="http://java.net/projects/javacc/downloads/download/oldversions/${javacc.web-archive}" dest="${javacc.package.dir}/${javacc.web-archive}"/> <unzip src="${javacc.package.dir}/${javacc.web-archive}" dest="${javacc.package.dir}"/> <writeComponentConstants dir="${javacc.dir}"/> Modified: rvmroot/branches/RVM-893-Sapphire/build/test-runs/sanity.properties =================================================================== --- rvmroot/branches/RVM-893-Sapphire/build/test-runs/sanity.properties 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/build/test-runs/sanity.properties 2011-03-25 00:03:45 UTC (rev 16060) @@ -130,3 +130,4 @@ test.config.jsr166-tck.TreeSetTest.exclude=true test.config.jsr166-tck.TreeSubMapTest.exclude=true test.config.jsr166-tck.TreeSubSetTest.exclude=true +test.config.jsr166-tck.SynchronousQueueTest.exclude=true Added: rvmroot/branches/RVM-893-Sapphire/common/vmmagic/src/org/vmmagic/pragma/ReferenceFieldsVary.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/common/vmmagic/src/org/vmmagic/pragma/ReferenceFieldsVary.java (rev 0) +++ rvmroot/branches/RVM-893-Sapphire/common/vmmagic/src/org/vmmagic/pragma/ReferenceFieldsVary.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -0,0 +1,33 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Eclipse Public License (EPL); + * 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/eclipse-1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.vmmagic.pragma; + +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.ElementType; + +/** + * This annotation marks types which have fields that can be marked + * as either traced or untraced by the VM. It disables GC optimizations + * that rely on the object pattern remaining static from build time + * to execution time. + * + * The property conferred by this annotation applies to all its subtypes as + * well. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +@Inherited +public @interface ReferenceFieldsVary { } Modified: rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/PhantomReference.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/PhantomReference.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/PhantomReference.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -13,10 +13,12 @@ package java.lang.ref; import org.jikesrvm.mm.mminterface.MemoryManager; +import org.vmmagic.pragma.ReferenceFieldsVary; /** * Implementation of java.lang.ref.PhantomReference for JikesRVM. */ +@ReferenceFieldsVary public class PhantomReference<T> extends Reference<T> { public PhantomReference(T referent, ReferenceQueue<T> q) { Modified: rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/Reference.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/Reference.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/Reference.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -12,15 +12,20 @@ */ package java.lang.ref; +import static org.jikesrvm.mm.mminterface.Barriers.NEEDS_OBJECT_GETFIELD_BARRIER; + +import org.jikesrvm.classloader.RVMType; import org.jikesrvm.mm.mminterface.Barriers; import org.jikesrvm.runtime.Magic; import org.vmmagic.pragma.Inline; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.ReferenceFieldsVary; import org.vmmagic.unboxed.Address; /** * The JikesRVM implementation of the java.lang.ref.Reference class. */ +@ReferenceFieldsVary public abstract class Reference<T> { /** @@ -79,21 +84,35 @@ @Uninterruptible @Inline Object getInternal() { - Address tmp = _referent; - if (tmp.isZero()) { - return null; + if (RVMType.JavaLangRefReferenceReferenceField.madeTraced()) { + if (NEEDS_OBJECT_GETFIELD_BARRIER) { + return Barriers.objectFieldRead(this, RVMType.JavaLangRefReferenceReferenceField.getOffset(), RVMType.JavaLangRefReferenceReferenceField.getId()); + } else { + return Magic.getObjectAtOffset(this, RVMType.JavaLangRefReferenceReferenceField.getOffset(), RVMType.JavaLangRefReferenceReferenceField.getId()); + } } else { - Object ref = Magic.addressAsObject(tmp); + Address tmp = _referent; + if (tmp.isZero()) { + return null; + } else { + Object ref = Magic.addressAsObject(tmp); - if (Barriers.NEEDS_JAVA_LANG_REFERENCE_READ_BARRIER) { - ref = Barriers.javaLangReferenceReadBarrier(ref); + if (Barriers.NEEDS_JAVA_LANG_REFERENCE_READ_BARRIER) { + ref = Barriers.javaLangReferenceReadBarrier(ref); + } + return ref; } - return ref; } } public void clear() { - _referent = Address.zero(); + if (RVMType.JavaLangRefReferenceReferenceField.madeTraced()) { + if (NEEDS_OBJECT_GETFIELD_BARRIER) { + Barriers.objectFieldWrite(this, null, RVMType.JavaLangRefReferenceReferenceField.getOffset(), RVMType.JavaLangRefReferenceReferenceField.getId()); + } else { + Magic.setObjectAtOffset(this, RVMType.JavaLangRefReferenceReferenceField.getOffset(), null, RVMType.JavaLangRefReferenceReferenceField.getId()); + } + } } public boolean isEnqueued() { Modified: rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/SoftReference.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/SoftReference.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/SoftReference.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -13,10 +13,12 @@ package java.lang.ref; import org.jikesrvm.mm.mminterface.MemoryManager; +import org.vmmagic.pragma.ReferenceFieldsVary; /** * Implementation of java.lang.ref.SoftReference for JikesRVM. */ +@ReferenceFieldsVary public class SoftReference<T> extends Reference<T> { public SoftReference(T referent) { Modified: rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/WeakReference.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/WeakReference.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/libraryInterface/Common/src/java/lang/ref/WeakReference.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -13,12 +13,14 @@ package java.lang.ref; import org.jikesrvm.mm.mminterface.MemoryManager; +import org.vmmagic.pragma.ReferenceFieldsVary; /** * Implementation of java.lang.ref.WeakReference for JikesRVM. * * @see java.util.WeakHashMap */ +@ReferenceFieldsVary public class WeakReference<T> extends Reference<T> { public WeakReference(T referent) { Modified: rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/VM.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/VM.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/VM.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -44,6 +44,7 @@ import org.jikesrvm.scheduler.RVMThread; import org.jikesrvm.runtime.FileSystem; import org.jikesrvm.tuningfork.TraceEngine; +import org.mmtk.policy.Space; import org.vmmagic.pragma.Entrypoint; import org.vmmagic.pragma.Inline; import org.vmmagic.pragma.Interruptible; @@ -2281,6 +2282,7 @@ VM.sysWriteln("Died in System Thread:"); else VM.sysWriteln("Died in Mutator Thread:"); + Space.printVMMap(); RVMThread.traceback(message); VM.sysWriteln("Virtual machine state:"); RVMThread.dumpVirtualMachine(); Modified: rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMArray.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMArray.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMArray.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -17,6 +17,7 @@ import org.jikesrvm.ArchitectureSpecific; import org.jikesrvm.VM; import org.jikesrvm.Constants; +import org.jikesrvm.mm.mminterface.HandInlinedScanning; import org.jikesrvm.mm.mminterface.Barriers; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.ObjectModel; @@ -488,7 +489,9 @@ // virtual method fields and substituting an appropriate type field. // TIB javaLangObjectTIB = RVMType.JavaLangObjectType.getTypeInformationBlock(); - TIB allocatedTib = MemoryManager.newTIB(javaLangObjectTIB.numVirtualMethods()); + + int alignCode = elementType.isReferenceType() ? HandInlinedScanning.referenceArray() : HandInlinedScanning.primitiveArray(); + TIB allocatedTib = MemoryManager.newTIB(javaLangObjectTIB.numVirtualMethods(), alignCode); superclassIds = DynamicTypeCheck.buildSuperclassIds(this); doesImplement = DynamicTypeCheck.buildDoesImplement(this); publishResolved(allocatedTib, superclassIds, doesImplement); Modified: rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMClass.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMClass.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMClass.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -20,6 +20,8 @@ import org.jikesrvm.VM; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.opt.inlining.ClassLoadingDependencyManager; +import org.jikesrvm.mm.mminterface.HandInlinedScanning; +import org.jikesrvm.mm.mminterface.AlignmentEncoding; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.FieldLayoutContext; import org.jikesrvm.objectmodel.IMT; @@ -1290,9 +1292,11 @@ // allocate "type information block" TIB allocatedTib; if (isInterface()) { - allocatedTib = MemoryManager.newTIB(0); + allocatedTib = MemoryManager.newTIB(0, AlignmentEncoding.ALIGN_CODE_NONE); + } else if (isAnnotationDeclared(TypeReference.ReferenceFieldsVary)) { + allocatedTib = MemoryManager.newTIB(virtualMethods.length, HandInlinedScanning.fallback()); } else { - allocatedTib = MemoryManager.newTIB(virtualMethods.length); + allocatedTib = MemoryManager.newTIB(virtualMethods.length, HandInlinedScanning.scalar(referenceOffsets)); } superclassIds = DynamicTypeCheck.buildSuperclassIds(this); @@ -1473,7 +1477,7 @@ * Make the passed field a traced field by garbage collection. Also affects all * subclasses. */ - public synchronized void makeFieldTraced(RVMField field) { + public void makeFieldTraced(RVMField field) { int[] oldOffsets = referenceOffsets; int fieldOffset = field.getOffset().toInt(); referenceOffsets = MemoryManager.newNonMovingIntArray(oldOffsets.length + 1); @@ -1481,7 +1485,6 @@ for(i=0; i < oldOffsets.length && oldOffsets[i] < fieldOffset; i++) { referenceOffsets[i] = oldOffsets[i]; } - if (VM.VerifyAssertions) VM._assert(oldOffsets[i] != fieldOffset, "Field is already traced!"); referenceOffsets[i++] = fieldOffset; while(i < referenceOffsets.length) { referenceOffsets[i] = oldOffsets[i-1]; Modified: rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMField.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMField.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMField.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -156,6 +156,15 @@ } /** + * Does the field hold a made-traced reference? + */ + @Uninterruptible + public boolean madeTraced() { + return madeTraced; + } + + + /** * Does the field hold a reference? */ public boolean isReferenceType() { Modified: rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMType.java =================================================================== --- rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMType.java 2011-03-18 05:41:53 UTC (rev 16059) +++ rvmroot/branches/RVM-893-Sapphire/rvm/src/org/jikesrvm/classloader/RVMType.java 2011-03-25 00:03:45 UTC (rev 16060) @@ -16,6 +16,7 @@ import org.jikesrvm.Constants; import org.jikesrvm.SizeConstants; import org.jikesrvm.ArchitectureSpecific.CodeArray; +import org.jikesrvm.mm.mminterface.AlignmentEncoding; import org.jikesrvm.mm.mminterface.MemoryManager; import org.jikesrvm.objectmodel.TIB; import org.jikesrvm.runtime.RuntimeEntrypoints; @@ -248,8 +249,9 @@ this.classForType = classForType; this.dimension = dimension; + /* install partial type information block (no method dispatch table) for use in type checking. */ - TIB tib = MemoryManager.newTIB(0); + TIB tib = MemoryManager.newTIB(0, AlignmentEncoding.ALIGN_CODE_NONE); tib.setType(this); Statics.setSlotContents(getTibOffset(), tib); } @@ -268,8 +270,9 @@ this.classForType = createClassForType(this, typeRef); this.dimension = dimension; + /* install partial type information block (no method dis... [truncated message content] |