/* * 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; import org.mmtk.utility.Log; import org.mmtk.vm.VM; import org.vmmagic.pragma.*; /** * This class (and its sub-classes) implement <i>per-mutator thread</i> * behavior and state. * * MMTk assumes that the VM instantiates instances of MutatorContext * in thread local storage (TLS) for each application thread. Accesses * to this state are therefore assumed to be low-cost during mutator * time.<p> * * @see MutatorContext */ @Uninterruptible public abstract class SimpleMutator extends MutatorContext { /**************************************************************************** * * Collection. */ /** * Perform a per-mutator collection phase. This is executed by * one collector thread on behalf of a mutator thread. * * @param phaseId The unique phase identifier * @param primary Should this thread be used to execute any single-threaded * local operations? */ @Inline public void collectionPhase(short phaseId, boolean primary) { if (phaseId == Simple.PREPARE_STACKS) { if (!Plan.stacksPrepared()) { VM.collection.prepareMutator(this); } flushRememberedSets(); return; } if (phaseId == Simple.PREPARE) { los.prepare(true); lgcode.prepare(true); smcode.prepare(); nonmove.prepare(); VM.memory.collectorPrepareVMSpace(); return; } if (phaseId == Simple.RELEASE) { los.release(true); lgcode.release(true); smcode.release(); nonmove.release(); VM.memory.collectorReleaseVMSpace(); return; } Log.write("Per-mutator phase \""); Phase.getPhase(phaseId).logPhase(); Log.writeln("\" not handled."); VM.assertions.fail("Per-mutator phase not handled!"); } }