001/* 002 * This file is part of the Jikes RVM project (http://jikesrvm.org). 003 * 004 * This file is licensed to You under the Eclipse Public License (EPL); 005 * You may not use this file except in compliance with the License. You 006 * may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/eclipse-1.0.php 009 * 010 * See the COPYRIGHT.txt file distributed with this work for information 011 * regarding copyright ownership. 012 */ 013package org.mmtk.plan; 014 015import org.mmtk.utility.Log; 016import org.mmtk.vm.VM; 017 018import org.vmmagic.pragma.*; 019 020/** 021 * This class (and its sub-classes) implement <i>per-mutator thread</i> 022 * behavior and state.<p> 023 * 024 * MMTk assumes that the VM instantiates instances of MutatorContext 025 * in thread local storage (TLS) for each application thread. Accesses 026 * to this state are therefore assumed to be low-cost during mutator 027 * time. 028 * 029 * @see MutatorContext 030 */ 031@Uninterruptible 032public abstract class SimpleMutator extends MutatorContext { 033 034 /**************************************************************************** 035 * 036 * Collection. 037 */ 038 039 /** 040 * Perform a per-mutator collection phase. This is executed by 041 * one collector thread on behalf of a mutator thread. 042 */ 043 @Override 044 @Inline 045 public void collectionPhase(short phaseId, boolean primary) { 046 if (phaseId == Simple.PREPARE_STACKS) { 047 if (!Plan.stacksPrepared()) { 048 VM.collection.prepareMutator(this); 049 } 050 flushRememberedSets(); 051 return; 052 } 053 054 if (phaseId == Simple.PREPARE) { 055 los.prepare(true); 056 lgcode.prepare(true); 057 smcode.prepare(); 058 nonmove.prepare(); 059 VM.memory.collectorPrepareVMSpace(); 060 return; 061 } 062 063 if (phaseId == Simple.RELEASE) { 064 los.release(true); 065 lgcode.release(true); 066 smcode.release(); 067 nonmove.release(); 068 VM.memory.collectorReleaseVMSpace(); 069 return; 070 } 071 072 Log.write("Per-mutator phase \""); Phase.getPhase(phaseId).logPhase(); 073 Log.writeln("\" not handled."); 074 VM.assertions.fail("Per-mutator phase not handled!"); 075 } 076}