/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Common Public License (CPL); * 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/cpl1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package org.mmtk.policy; import org.mmtk.utility.alloc.LargeObjectAllocator; import org.mmtk.utility.Constants; import org.mmtk.utility.DoublyLinkedList; import org.mmtk.vm.VM; import org.vmmagic.pragma.*; import org.vmmagic.unboxed.*; /** * Each instance of this class is intended to provide fast, * unsynchronized access to explicitly collected objects. Therefore * instances must not be shared across truely concurrent threads * (CPUs). Rather, one or more instances of this class should be * bound to each CPU. The shared VMResource used by each instance is * the point of global synchronization, and synchronization only * occurs at the granularity of aquiring (and releasing) chunks of * memory from the VMResource. * * If there are C CPUs and T LargeObjectSpaces, there must be C X T * instances of this class, one for each CPU, LargeObjectSpace pair. */ @Uninterruptible public final class ExplicitLargeObjectLocal extends LargeObjectAllocator implements Constants { /**************************************************************************** * * Class variables */ /**************************************************************************** * * Instance variables */ /**************************************************************************** * * Initialization */ /** * Constructor * * @param space The large object space to which this thread instance * is bound. */ public ExplicitLargeObjectLocal(LargeObjectSpace space) { super(space); this.space = space; } /**************************************************************************** * * Allocation */ /** * This is called each time a cell is alloced (i.e. if a cell is * reused, this will be called each time it is reused in the * lifetime of the cell, by contrast to initializeCell, which is * called exactly once.). * * @param cell The newly allocated cell */ @Inline protected void postAlloc(Address cell) { space.getCells().add(DoublyLinkedList.payloadToNode(cell)); } /**************************************************************************** * * Collection */ /** * Prepare for a collection. Nothing to be done here */ public void prepare() {} /** * Finish up after a collection. Nothing to be done */ public void release() { } /** * Free an object * * @param space The space the object is allocated in. * @param object The object to be freed. */ @Inline public static void free(LargeObjectSpace space, ObjectReference object) { Address cell = getSuperPage(VM.objectModel.refToAddress(object)); space.getCells().remove(cell); space.release(cell); } /**************************************************************************** * * Miscellaneous size-related methods */ /** * Return the size of the per-superpage header required by this * system. In this case it is just the underlying superpage header * size. * * @return The size of the per-superpage header required by this * system. */ @Inline protected int superPageHeaderSize() { return DoublyLinkedList.headerSize(); } /** * Return the size of the per-cell header for cells of a given class * size. * * @return The size of the per-cell header for cells of a given class * size. */ @Inline protected int cellHeaderSize() { return 0; } }