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.nogc;
014    
015    import org.mmtk.plan.MutatorContext;
016    import org.mmtk.policy.ImmortalLocal;
017    import org.mmtk.policy.Space;
018    import org.mmtk.utility.alloc.Allocator;
019    import org.mmtk.vm.VM;
020    
021    import org.vmmagic.pragma.*;
022    import org.vmmagic.unboxed.*;
023    
024    /**
025     * This class implements <i>per-mutator thread</i> behavior and state
026     * for the <i>NoGC</i> plan, which simply allocates (without ever collecting
027     * until the available space is exhausted.<p>
028     *
029     * Specifically, this class defines <i>NoGC</i> mutator-time allocation
030     * through a bump pointer (<code>def</code>) and includes stubs for
031     * per-mutator thread collection semantics (since there is no collection
032     * in this plan, these remain just stubs).
033     *
034     * @see NoGC
035     * @see NoGCCollector
036     * @see org.mmtk.plan.StopTheWorldMutator
037     * @see org.mmtk.plan.MutatorContext
038     */
039    @Uninterruptible
040    public class NoGCMutator extends MutatorContext {
041    
042      /************************************************************************
043       * Instance fields
044       */
045    
046      /**
047       *
048       */
049      private final ImmortalLocal nogc = new ImmortalLocal(NoGC.noGCSpace);
050    
051    
052      /****************************************************************************
053       * Mutator-time allocation
054       */
055    
056      /**
057       * {@inheritDoc}
058       */
059      @Inline
060      @Override
061      public Address alloc(int bytes, int align, int offset, int allocator, int site) {
062        if (allocator == NoGC.ALLOC_DEFAULT) {
063          return nogc.alloc(bytes, align, offset);
064        }
065        return super.alloc(bytes, align, offset, allocator, site);
066      }
067    
068      @Inline
069      @Override
070      public void postAlloc(ObjectReference ref, ObjectReference typeRef,
071          int bytes, int allocator) {
072        if (allocator != NoGC.ALLOC_DEFAULT) {
073          super.postAlloc(ref, typeRef, bytes, allocator);
074        }
075      }
076    
077      @Override
078      public Allocator getAllocatorFromSpace(Space space) {
079        if (space == NoGC.noGCSpace) return nogc;
080        return super.getAllocatorFromSpace(space);
081      }
082    
083    
084      /****************************************************************************
085       * Collection
086       */
087    
088      /**
089       * {@inheritDoc}
090       */
091      @Inline
092      @Override
093      public final void collectionPhase(short phaseId, boolean primary) {
094        VM.assertions.fail("GC Triggered in NoGC Plan.");
095        /*
096         if (phaseId == NoGC.PREPARE) {
097         }
098    
099         if (phaseId == NoGC.RELEASE) {
100         }
101         super.collectionPhase(phaseId, primary);
102         */
103      }
104    }