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 */ 013 package org.mmtk.plan.copyms; 014 015 import org.mmtk.plan.*; 016 import org.mmtk.policy.LargeObjectLocal; 017 import org.mmtk.policy.MarkSweepLocal; 018 import org.mmtk.utility.alloc.Allocator; 019 import org.mmtk.vm.VM; 020 021 import org.vmmagic.pragma.*; 022 import org.vmmagic.unboxed.*; 023 024 /** 025 * This class implements <i>per-collector thread</i> behavior 026 * and state for the <i>CopyMS</i> plan.<p> 027 * 028 * Specifically, this class defines <i>CopyMS</i> 029 * collection behavior (through <code>trace</code> and 030 * the <code>collectionPhase</code> method), and 031 * collection-time allocation into the mature space. 032 * 033 * @see CopyMS 034 * @see CopyMSMutator 035 * @see StopTheWorldCollector 036 * @see CollectorContext 037 */ 038 @Uninterruptible 039 public class CopyMSCollector extends StopTheWorldCollector { 040 041 /**************************************************************************** 042 * Instance fields 043 */ 044 045 /** 046 * 047 */ 048 private MarkSweepLocal mature; 049 private CopyMSTraceLocal trace; 050 051 protected final LargeObjectLocal los; 052 053 /**************************************************************************** 054 * 055 * Initialization 056 */ 057 058 /** 059 * Create a new (local) instance. 060 */ 061 public CopyMSCollector() { 062 los = new LargeObjectLocal(Plan.loSpace); 063 mature = new MarkSweepLocal(CopyMS.msSpace); 064 trace = new CopyMSTraceLocal(global().trace); 065 } 066 067 /**************************************************************************** 068 * 069 * Collection-time allocation 070 */ 071 072 /** 073 * {@inheritDoc} 074 */ 075 @Override 076 @Inline 077 public final Address allocCopy(ObjectReference original, int bytes, 078 int align, int offset, int allocator) { 079 if (allocator == Plan.ALLOC_LOS) { 080 if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(Allocator.getMaximumAlignedSize(bytes, align) > Plan.MAX_NON_LOS_COPY_BYTES); 081 return los.alloc(bytes, align, offset); 082 } else { 083 if (VM.VERIFY_ASSERTIONS) { 084 VM.assertions._assert(bytes <= Plan.MAX_NON_LOS_COPY_BYTES); 085 VM.assertions._assert(allocator == CopyMS.ALLOC_MS); 086 } 087 return mature.alloc(bytes, align, offset); 088 } 089 } 090 091 @Override 092 @Inline 093 public final void postCopy(ObjectReference object, ObjectReference typeRef, 094 int bytes, int allocator) { 095 if (allocator == Plan.ALLOC_LOS) 096 Plan.loSpace.initializeHeader(object, false); 097 else 098 CopyMS.msSpace.postCopy(object, true); 099 } 100 101 /**************************************************************************** 102 * 103 * Collection 104 */ 105 106 /** 107 * {@inheritDoc} 108 */ 109 @Override 110 @Inline 111 public final void collectionPhase(short phaseId, boolean primary) { 112 if (phaseId == CopyMS.PREPARE) { 113 super.collectionPhase(phaseId, primary); 114 mature.prepare(); 115 trace.prepare(); 116 return; 117 } 118 119 if (phaseId == CopyMS.CLOSURE) { 120 trace.completeTrace(); 121 return; 122 } 123 124 if (phaseId == CopyMS.RELEASE) { 125 mature.release(); 126 trace.release(); 127 super.collectionPhase(phaseId, primary); 128 return; 129 } 130 131 super.collectionPhase(phaseId, primary); 132 } 133 134 /**************************************************************************** 135 * 136 * Miscellaneous 137 */ 138 139 /** @return the active global plan as an <code>MS</code> instance. */ 140 @Inline 141 private static CopyMS global() { 142 return (CopyMS) VM.activePlan.global(); 143 } 144 145 /** @return The current trace instance. */ 146 @Override 147 public final TraceLocal getCurrentTrace() { return trace; } 148 149 }