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.plan.generational;
014    
015    import org.mmtk.plan.StopTheWorldConstraints;
016    
017    import org.mmtk.policy.CopySpace;
018    import org.mmtk.policy.Space;
019    
020    import org.vmmagic.pragma.*;
021    
022    /**
023     * This class and its subclasses communicate to the host VM/Runtime
024     * any features of the selected plan that it needs to know.  This is
025     * separate from the main Plan/PlanLocal class in order to bypass any
026     * issues with ordering of static initialization.
027     */
028    @Uninterruptible
029    public class GenConstraints extends StopTheWorldConstraints {
030    
031      @Override
032      public boolean generational() { return true; }
033    
034      @Override
035      public boolean movesObjects() { return true; }
036    
037      @Override
038      public int gcHeaderBits() { return CopySpace.LOCAL_GC_BITS_REQUIRED; }
039    
040      @Override
041      public int gcHeaderWords() { return CopySpace.GC_HEADER_WORDS_REQUIRED; }
042    
043      @Override
044      public boolean needsObjectReferenceWriteBarrier() { return true; }
045    
046      @Override
047      public boolean needsObjectReferenceNonHeapWriteBarrier() { return Gen.USE_NON_HEAP_OBJECT_REFERENCE_WRITE_BARRIER; }
048    
049      @Override
050      public boolean objectReferenceBulkCopySupported() { return true; }
051    
052      @Override
053      public int numSpecializedScans() { return 2; }
054    
055      @Override
056      public boolean needsLogBitInHeader() { return Gen.USE_OBJECT_BARRIER; }
057    
058      /**
059       * @return The maximum size of an object that may be allocated directly into the nursery
060       */
061      @Override
062      public int maxNonLOSDefaultAllocBytes() {
063        /*
064         * If the nursery is discontiguous, the maximum object is essentially unbounded.  In
065         * a contiguous nursery, we can't attempt to nursery-allocate objects larger than the
066         * available nursery virtual memory.
067         */
068        return  Gen.USE_DISCONTIGUOUS_NURSERY ?
069            org.mmtk.utility.Constants.MAX_INT :
070            Space.getFracAvailable(Gen.NURSERY_VM_FRACTION).toInt();
071      }
072    
073    }