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.generational.copying; 014 015 import org.mmtk.plan.generational.Gen; 016 import org.mmtk.plan.generational.GenCollector; 017 import org.mmtk.plan.generational.GenMatureTraceLocal; 018 import org.mmtk.plan.Trace; 019 import org.mmtk.policy.Space; 020 021 import org.mmtk.vm.VM; 022 023 import org.vmmagic.pragma.*; 024 import org.vmmagic.unboxed.*; 025 026 /** 027 * This class implements the core functionality for a transitive 028 * closure over the heap graph, specifically in a Generational copying 029 * collector. 030 */ 031 @Uninterruptible 032 public final class GenCopyMatureTraceLocal extends GenMatureTraceLocal { 033 034 /** 035 * Constructor 036 */ 037 public GenCopyMatureTraceLocal(Trace global, GenCollector plan) { 038 super(global, plan); 039 } 040 041 private static GenCopy global() { 042 return (GenCopy) VM.activePlan.global(); 043 } 044 045 /** 046 * Trace a reference into the mature space during GC. This involves 047 * determining whether the instance is in from space, and if so, 048 * calling the <code>traceObject</code> method of the Copy 049 * collector. 050 * 051 * @param object The object reference to be traced. This is <i>NOT</i> an 052 * interior pointer. 053 * @return The possibly moved reference. 054 */ 055 @Override 056 public ObjectReference traceObject(ObjectReference object) { 057 if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(global().traceFullHeap()); 058 if (object.isNull()) return object; 059 060 if (Space.isInSpace(GenCopy.MS0, object)) 061 return GenCopy.matureSpace0.traceObject(this, object, Gen.ALLOC_MATURE_MAJORGC); 062 if (Space.isInSpace(GenCopy.MS1, object)) 063 return GenCopy.matureSpace1.traceObject(this, object, Gen.ALLOC_MATURE_MAJORGC); 064 return super.traceObject(object); 065 } 066 067 @Override 068 public boolean isLive(ObjectReference object) { 069 if (object.isNull()) return false; 070 if (Space.isInSpace(GenCopy.MS0, object)) 071 return GenCopy.hi ? GenCopy.matureSpace0.isLive(object) : true; 072 if (Space.isInSpace(GenCopy.MS1, object)) 073 return GenCopy.hi ? true : GenCopy.matureSpace1.isLive(object); 074 return super.isLive(object); 075 } 076 077 /**************************************************************************** 078 * 079 * Object processing and tracing 080 */ 081 082 083 /** 084 * {@inheritDoc} 085 */ 086 @Override 087 public boolean willNotMoveInCurrentCollection(ObjectReference object) { 088 if (Space.isInSpace(GenCopy.toSpaceDesc(), object)) { 089 return true; 090 } 091 if (Space.isInSpace(GenCopy.fromSpaceDesc(), object)) { 092 return false; 093 } 094 return super.willNotMoveInCurrentCollection(object); 095 } 096 }