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.refcount.generational;
014    
015    import org.mmtk.plan.refcount.RCBase;
016    import org.mmtk.policy.CopySpace;
017    import org.mmtk.policy.Space;
018    import org.mmtk.utility.heap.VMRequest;
019    import org.mmtk.utility.options.Options;
020    import org.vmmagic.pragma.*;
021    import org.vmmagic.unboxed.ObjectReference;
022    
023    /**
024     * This class implements the global state of a a simple reference counting collector.
025     */
026    @Uninterruptible
027    public class GenRC extends RCBase {
028    
029      public static final int ALLOC_NURSERY = ALLOC_DEFAULT;
030      public static final int ALLOC_RC      = RCBase.ALLOCATORS + 1;
031    
032      /** The nursery space is where all new objects are allocated by default */
033      public static final CopySpace nurserySpace = new CopySpace("nursery", false, VMRequest.create(0.15f, true));
034    
035      public static final int NURSERY = nurserySpace.getDescriptor();
036    
037      /*****************************************************************************
038       *
039       * Collection
040       */
041    
042      /**
043       * {@inheritDoc}
044       */
045      @Override
046      public final void collectionPhase(short phaseId) {
047       if (phaseId == PREPARE) {
048          nurserySpace.prepare(true);
049          super.collectionPhase(phaseId);
050          return;
051        }
052    
053        if (phaseId == RELEASE) {
054          super.collectionPhase(phaseId);
055          nurserySpace.release();
056          switchNurseryZeroingApproach(nurserySpace);
057          return;
058        }
059    
060        super.collectionPhase(phaseId);
061      }
062    
063      @Override
064      public final boolean collectionRequired(boolean spaceFull, Space space) {
065        boolean nurseryFull = nurserySpace.reservedPages() > Options.nurserySize.getMaxNursery();
066        return super.collectionRequired(spaceFull, space) || nurseryFull;
067      }
068    
069      /*****************************************************************************
070       *
071       * Accounting
072       */
073    
074      /**
075       * Return the number of pages available for allocation, <i>assuming
076       * all future allocation is to the nursery</i>.
077       *
078       * @return The number of pages available for allocation, <i>assuming
079       * all future allocation is to the nursery</i>.
080       */
081      @Override
082      public int getPagesAvail() {
083        return super.getPagesAvail() >> 1;
084      }
085    
086      /**
087       * Return the number of pages reserved for copying.
088       */
089      @Override
090      public final int getCollectionReserve() {
091        return nurserySpace.reservedPages() + super.getCollectionReserve();
092      }
093    
094      @Override
095      public boolean willNeverMove(ObjectReference object) {
096        if (Space.isInSpace(NURSERY, object)) {
097          return false;
098        }
099        if (Space.isInSpace(REF_COUNT_LOS, object)) {
100          return true;
101        }
102        return super.willNeverMove(object);
103      }
104    
105      @Interruptible
106      @Override
107      public void fullyBooted() {
108        super.fullyBooted();
109        nurserySpace.setZeroingApproach(Options.nurseryZeroing.getNonTemporal(), Options.nurseryZeroing.getConcurrent());
110      }
111    }