/* * 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.mmtk.plan.semispace.gctrace; import org.mmtk.plan.*; import org.mmtk.plan.semispace.*; import org.mmtk.vm.VM; import org.vmmagic.pragma.*; /** * This class implements <i>per-collector thread</i> behavior and state for the * <i>GCTrace</i> plan, which implements a GC tracing algorithm.<p> * * Specifically, this class defines <i>SS</i> collection behavior * (through <code>inducedTrace</code> and the <code>collectionPhase</code> * method), and collection-time allocation (copying of objects).<p> * * See {@link GCTrace} for an overview of the GC trace algorithm.<p> * * @see SSCollector * @see GCTrace * @see GCTraceMutator * @see org.mmtk.plan.StopTheWorldCollector * @see org.mmtk.plan.CollectorContext */ @Uninterruptible public class GCTraceCollector extends SSCollector { /**************************************************************************** * Instance fields */ protected final GCTraceTraceLocal inducedTrace; /**************************************************************************** * * Initialization */ /** * Constructor */ public GCTraceCollector() { inducedTrace = new GCTraceTraceLocal(global().ssTrace); } /**************************************************************************** * * Collection */ /** * Perform a per-collector collection phase. * * @param phaseId The collection phase to perform * @param primary perform any single-threaded local activities. */ public void collectionPhase(short phaseId, boolean primary) { if (phaseId == GCTrace.CLOSURE) { inducedTrace.completeTrace(); return; } if (phaseId == GCTrace.RELEASE) { inducedTrace.release(); if (!GCTrace.traceInducedGC) { super.collectionPhase(phaseId, primary); } return; } /* fall through case */ if (!GCTrace.traceInducedGC || ((phaseId != StopTheWorld.SOFT_REFS) && (phaseId != StopTheWorld.WEAK_REFS) && (phaseId != StopTheWorld.PHANTOM_REFS) && (phaseId != StopTheWorld.FINALIZABLE) && (phaseId != SS.PREPARE))) { // Delegate up. super.collectionPhase(phaseId, primary); } } /**************************************************************************** * * Miscellaneous */ /** @return The active global plan as a <code>GCTrace</code> instance. */ @Inline private static GCTrace global() { return (GCTrace) VM.activePlan.global(); } /** @return The current trace instance */ public TraceLocal getCurrentTrace() { return inducedTrace; } }