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.heap;
014    
015    import org.mmtk.utility.Constants;
016    
017    import org.vmmagic.unboxed.*;
018    
019    /**
020     * This class manages the encoding and decoding of virtual memory requests.<p>
021     *
022     * By encapsulating this aspect of the construction of a space, we greatly
023     * reduce the number of constructors required.
024     */
025    public final class VMRequest implements Constants {
026    
027      public static final int REQUEST_DISCONTIGUOUS = 0;
028      public static final int REQUEST_FIXED = 1;
029      public static final int REQUEST_EXTENT = 3;
030      public static final int REQUEST_FRACTION = 4;
031    
032      public final int type;
033      public final Address start;
034      public final Extent extent;
035      public final float frac;
036      public final boolean top;
037    
038      private VMRequest(int type, Address start, Extent bytes, float frac, boolean top) {
039        this.type = type;
040        this.start = start;
041        this.extent = bytes;
042        this.frac = frac;
043        this.top = top;
044      }
045    
046      /**
047       * Is this a discontiguous space request?
048       * @return true if this is a discontiguous space request, false otherwise
049       */
050      public boolean isDiscontiguous() {
051        return type == REQUEST_DISCONTIGUOUS;
052      }
053    
054      /**
055       * A request for a discontiguous region of memory
056       *
057       * @return The request object
058       */
059      public static VMRequest create() {
060        return new VMRequest(REQUEST_DISCONTIGUOUS, Address.zero(), Extent.zero(), 0f, false);
061      }
062    
063      /**
064       * A request for an explicit region of memory
065       *
066       * @param start The start of the region
067       * @param extent The size of the region
068       * @return The request object
069       */
070      public static VMRequest create(Address start, Extent extent) {
071        return new VMRequest(REQUEST_FIXED, start, extent, 0f, false);
072      }
073    
074      /**
075       * A request for a number of megabytes of memory
076       *
077       * @param mb The number of megabytes
078       * @return The request object
079       */
080      public static VMRequest create(int mb) {
081        return create(mb, false);
082      }
083    
084      /**
085       * A request for a fraction of available memory
086       *
087       * @param frac The fraction
088       * @return The request object
089       */
090      public static VMRequest create(float frac) {
091        return create(frac, false);
092      }
093    
094      /**
095       * A request for a number of megabytes of memory, optionally requesting the highest available.
096       *
097       * @param mb The number of megabytes
098       * @param top True to request high memory
099       * @return The request object
100       */
101      public static VMRequest create(int mb, boolean top) {
102        return new VMRequest(REQUEST_EXTENT, Address.zero(), Word.fromIntSignExtend(mb).lsh(LOG_BYTES_IN_MBYTE).toExtent(), 0f, top);
103      }
104    
105      /**
106       * A request for a fraction of available memory, optionally requesting the highest available.
107       *
108       * @param frac The fraction
109       * @param top True to request high memory
110       * @return The request object
111       */
112      public static VMRequest create(float frac, boolean top) {
113        return new VMRequest(REQUEST_FRACTION, Address.zero(), Extent.zero(), frac, top);
114      }
115    
116      /**
117       * A request for a number of bytes of memory, optionally requesting the highest available.
118       *
119       * @param extent The number of bytes
120       * @param top True to request high memory
121       * @return The request object
122       */
123      public static VMRequest create(Extent extent, boolean top) {
124        return new VMRequest(REQUEST_EXTENT, Address.zero(), extent, 0f, top);
125      }
126    }