blob: 9f3447c168d20495a81308dbf0d49c17dad9ec83 [file] [log] [blame]
/*
* 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.policy;
import org.mmtk.plan.TransitiveClosure;
import org.mmtk.utility.heap.*;
import org.mmtk.utility.Constants;
import org.vmmagic.pragma.*;
import org.vmmagic.unboxed.*;
/**
* Each instance of this class corresponds to one *space*.
* Each of the instance methods of this class may be called by any
* thread (i.e. synchronization must be explicit in any instance or
* class method). This contrasts with the MarkSweepLocal, where
* instances correspond to *plan* instances and therefore to kernel
* threads. Thus unlike this class, synchronization is not necessary
* in the instance methods of MarkSweepLocal.
*/
@Uninterruptible
public final class ExplicitFreeListSpace extends SegregatedFreeListSpace implements Constants {
/****************************************************************************
*
* Class variables
*/
public static final int LOCAL_GC_BITS_REQUIRED = 0;
public static final int GLOBAL_GC_BITS_REQUIRED = 0;
public static final int GC_HEADER_WORDS_REQUIRED = 0;
/****************************************************************************
*
* Initialization
*/
/**
* The caller specifies the region of virtual memory to be used for
* this space. If this region conflicts with an existing space,
* then the constructor will fail.
*
* @param name The name of this space (used when printing error messages etc)
* @param pageBudget The number of pages this space may consume
* before consulting the plan
* @param vmRequest An object describing the virtual memory requested.
*/
public ExplicitFreeListSpace(String name, int pageBudget, VMRequest vmRequest) {
super(name, pageBudget, 0, vmRequest);
}
/**
* Should SegregatedFreeListSpace manage a side bitmap to keep track of live objects?
*/
@Inline
protected boolean maintainSideBitmap() {
return true;
}
/**
* Do we need to preserve free lists as we move blocks around.
*/
@Inline
protected boolean preserveFreeList() {
return false;
}
/****************************************************************************
*
* Collection
*/
/**
* Prepare the next block in the free block list for use by the free
* list allocator. In the case of lazy sweeping this involves
* sweeping the available cells. <b>The sweeping operation must
* ensure that cells are pre-zeroed</b>, as this method must return
* pre-zeroed cells.
*
* @param block The block to be prepared for use
* @param sizeClass The size class of the block
* @return The address of the first pre-zeroed cell in the free list
* for this block, or zero if there are no available cells.
*/
protected Address advanceToBlock(Address block, int sizeClass) {
return makeFreeList(block, sizeClass);
}
/**
* Notify that a new block has been installed. This is to ensure that
* appropriate collection state can be initialized for the block
*
* @param block The new block
* @param sizeClass The block's sizeclass.
*/
protected void notifyNewBlock(Address block, int sizeClass) {
clearLiveBits(block, sizeClass);
}
/**
* Free an object.
*
* @param object The object to be freed.
*/
@Inline
public void free(ObjectReference object) {
clearLiveBit(object);
}
/**
* Prepare for a new collection increment.
*/
public void prepare() {
flushAvailableBlocks();
}
/**
* A new collection increment has completed.
*/
public void release() {
sweepConsumedBlocks(true);
}
/**
* Release an allocated page or pages
*
* @param start The address of the start of the page or pages
*/
@Inline
public void release(Address start) {
((FreeListPageResource) pr).releasePages(start);
}
/****************************************************************************
*
* Object processing and tracing
*/
/**
* Trace a reference to an object under a mark sweep collection
* policy. If the object header is not already marked, mark the
* object in either the bitmap or by moving it off the treadmill,
* and enqueue the object for subsequent processing. The object is
* marked as (an atomic) side-effect of checking whether already
* marked.
*
* @param object The object to be traced.
* @return The object (there is no object forwarding in this
* collector, so we always return the same object: this could be a
* void method but for compliance to a more general interface).
*/
@Inline
public ObjectReference traceObject(TransitiveClosure trace, ObjectReference object) {
return object;
}
/**
*
* @param object The object in question
* @return True if this object is known to be live (i.e. it is marked)
*/
@Inline
public boolean isLive(ObjectReference object) {
return liveBitSet(object);
}
}