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.utility.alloc;
014
015 import org.mmtk.policy.BaseLargeObjectSpace;
016 import org.mmtk.utility.Constants;
017
018 import org.vmmagic.unboxed.*;
019 import org.vmmagic.pragma.*;
020
021 /**
022 * This abstract class implements core functionality for a generic
023 * large object allocator. The shared VMResource used by each instance
024 * is the point of global synchronization, and synchronization only
025 * occurs at the granularity of acquiring (and releasing) chunks of
026 * memory from the VMResource. Subclasses may require finer grained
027 * synchronization during a marking phase, for example.<p>
028 *
029 * This is a first cut implementation, with plenty of room for
030 * improvement...
031 */
032 @Uninterruptible
033 public abstract class LargeObjectAllocator extends Allocator implements Constants {
034
035 /****************************************************************************
036 *
037 * Instance variables
038 */
039
040 /**
041 *
042 */
043 protected final BaseLargeObjectSpace space;
044
045 /****************************************************************************
046 *
047 * Initialization
048 */
049
050 /**
051 * Constructor
052 *
053 * @param space The space with which this large object allocator
054 * will be associated.
055 */
056 public LargeObjectAllocator(BaseLargeObjectSpace space) {
057 this.space = space;
058 }
059
060 @Override
061 protected final BaseLargeObjectSpace getSpace() {
062 return this.space;
063 }
064
065 /****************************************************************************
066 *
067 * Allocation
068 */
069
070 /**
071 * Allocate space for an object
072 *
073 * @param bytes The number of bytes allocated
074 * @param align The requested alignment.
075 * @param offset The alignment offset.
076 * @return The address of the first byte of the allocated cell Will
077 * not return zero.
078 */
079 @NoInline
080 public final Address alloc(int bytes, int align, int offset) {
081 Address cell = allocSlow(bytes, align, offset);
082 return alignAllocation(cell, align, offset);
083 }
084
085 /**
086 * Allocate a large object. Large objects are directly allocted and
087 * freed in page-grained units via the vm resource. This routine
088 * returned zeroed memory.
089 *
090 * @param bytes The required size of this space in bytes.
091 * @param offset The alignment offset.
092 * @param align The requested alignment.
093 * @return The address of the start of the newly allocated region at
094 * least <code>bytes</code> bytes in size.
095 */
096 @Override
097 protected final Address allocSlowOnce(int bytes, int align, int offset) {
098 int header = space.getHeaderSize();
099 int maxbytes = getMaximumAlignedSize(bytes + header, align);
100 int pages = (maxbytes + BYTES_IN_PAGE - 1) >> LOG_BYTES_IN_PAGE;
101 Address sp = space.acquire(pages);
102 if (sp.isZero()) return sp;
103 Address cell = sp.plus(header);
104 return cell;
105 }
106
107 /****************************************************************************
108 *
109 * Miscellaneous
110 */
111 public void show() {
112 }
113 }
114