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.policy; 014 015 import org.mmtk.plan.TransitiveClosure; 016 import org.mmtk.utility.heap.*; 017 import org.mmtk.utility.Constants; 018 019 import org.vmmagic.pragma.*; 020 import org.vmmagic.unboxed.*; 021 022 /** 023 * Each instance of this class corresponds to one *space*. 024 * Each of the instance methods of this class may be called by any 025 * thread (i.e. synchronization must be explicit in any instance or 026 * class method). This contrasts with the MarkSweepLocal, where 027 * instances correspond to *plan* instances and therefore to kernel 028 * threads. Thus unlike this class, synchronization is not necessary 029 * in the instance methods of MarkSweepLocal. 030 */ 031 @Uninterruptible 032 public final class ExplicitFreeListSpace extends SegregatedFreeListSpace implements Constants { 033 034 /**************************************************************************** 035 * 036 * Class variables 037 */ 038 039 /** 040 * 041 */ 042 public static final int LOCAL_GC_BITS_REQUIRED = 0; 043 public static final int GLOBAL_GC_BITS_REQUIRED = 0; 044 public static final int GC_HEADER_WORDS_REQUIRED = 0; 045 046 /**************************************************************************** 047 * 048 * Initialization 049 */ 050 051 /** 052 * The caller specifies the region of virtual memory to be used for 053 * this space. If this region conflicts with an existing space, 054 * then the constructor will fail. 055 * 056 * @param name The name of this space (used when printing error messages etc) 057 * @param vmRequest An object describing the virtual memory requested. 058 */ 059 public ExplicitFreeListSpace(String name, VMRequest vmRequest) { 060 super(name, 0, vmRequest); 061 } 062 063 @Override 064 @Inline 065 protected boolean maintainSideBitmap() { 066 return true; 067 } 068 069 @Override 070 @Inline 071 protected boolean preserveFreeList() { 072 return false; 073 } 074 075 /**************************************************************************** 076 * 077 * Collection 078 */ 079 080 /** 081 * Prepare the next block in the free block list for use by the free 082 * list allocator. In the case of lazy sweeping this involves 083 * sweeping the available cells. <b>The sweeping operation must 084 * ensure that cells are pre-zeroed</b>, as this method must return 085 * pre-zeroed cells. 086 * 087 * @param block The block to be prepared for use 088 * @param sizeClass The size class of the block 089 * @return The address of the first pre-zeroed cell in the free list 090 * for this block, or zero if there are no available cells. 091 */ 092 @Override 093 protected Address advanceToBlock(Address block, int sizeClass) { 094 return makeFreeList(block, sizeClass); 095 } 096 097 @Override 098 protected void notifyNewBlock(Address block, int sizeClass) { 099 clearLiveBits(block, sizeClass); 100 } 101 102 /** 103 * Free an object. 104 * 105 * @param object The object to be freed. 106 */ 107 @Inline 108 public void free(ObjectReference object) { 109 clearLiveBit(object); 110 } 111 112 /** 113 * Prepare for a new collection increment. 114 */ 115 public void prepare() { 116 flushAvailableBlocks(); 117 } 118 119 /** 120 * A new collection increment has completed. 121 */ 122 public void release() { 123 sweepConsumedBlocks(true); 124 } 125 126 /** 127 * Release an allocated page or pages 128 * 129 * @param start The address of the start of the page or pages 130 */ 131 @Override 132 @Inline 133 public void release(Address start) { 134 ((FreeListPageResource) pr).releasePages(start); 135 } 136 137 /**************************************************************************** 138 * 139 * Object processing and tracing 140 */ 141 142 /** 143 * Trace a reference to an object under a mark sweep collection 144 * policy. If the object header is not already marked, mark the 145 * object in either the bitmap or by moving it off the treadmill, 146 * and enqueue the object for subsequent processing. The object is 147 * marked as (an atomic) side-effect of checking whether already 148 * marked. 149 * 150 * @param object The object to be traced. 151 * @return The object (there is no object forwarding in this 152 * collector, so we always return the same object: this could be a 153 * void method but for compliance to a more general interface). 154 */ 155 @Override 156 @Inline 157 public ObjectReference traceObject(TransitiveClosure trace, ObjectReference object) { 158 return object; 159 } 160 161 /** 162 * @return {@code true} if this object is known to be live (i.e. it is marked) 163 */ 164 @Override 165 @Inline 166 public boolean isLive(ObjectReference object) { 167 return liveBitSet(object); 168 } 169 }