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.marksweep;
014    
015    import org.mmtk.plan.*;
016    import org.mmtk.policy.MarkSweepSpace;
017    import org.mmtk.policy.Space;
018    import org.mmtk.utility.heap.VMRequest;
019    
020    import org.vmmagic.pragma.*;
021    import org.vmmagic.unboxed.*;
022    
023    /**
024     * This class implements the global state of a simple mark-sweep collector.<p>
025     *
026     * All plans make a clear distinction between <i>global</i> and
027     * <i>thread-local</i> activities, and divides global and local state
028     * into separate class hierarchies.  Global activities must be
029     * synchronized, whereas no synchronization is required for
030     * thread-local activities.  There is a single instance of Plan (or the
031     * appropriate sub-class), and a 1:1 mapping of PlanLocal to "kernel
032     * threads" (aka CPUs).  Thus instance
033     * methods of PlanLocal allow fast, unsychronized access to functions such as
034     * allocation and collection.<p>
035     *
036     * The global instance defines and manages static resources
037     * (such as memory and virtual memory resources).  This mapping of threads to
038     * instances is crucial to understanding the correctness and
039     * performance properties of MMTk plans.
040     */
041    @Uninterruptible
042    public class MS extends StopTheWorld {
043    
044      /****************************************************************************
045       * Class variables
046       */
047    
048      /**
049       *
050       */
051      public static final MarkSweepSpace msSpace = new MarkSweepSpace("ms", VMRequest.create());
052      public static final int MARK_SWEEP = msSpace.getDescriptor();
053    
054      public static final int SCAN_MARK = 0;
055    
056    
057      /****************************************************************************
058       * Instance variables
059       */
060    
061      /**
062       *
063       */
064      public final Trace msTrace = new Trace(metaDataSpace);
065    
066    
067      /*****************************************************************************
068       * Collection
069       */
070    
071      /**
072       * {@inheritDoc}
073       */
074      @Inline
075      @Override
076      public void collectionPhase(short phaseId) {
077    
078        if (phaseId == PREPARE) {
079          super.collectionPhase(phaseId);
080          msTrace.prepare();
081          msSpace.prepare(true);
082          return;
083        }
084    
085        if (phaseId == CLOSURE) {
086          msTrace.prepare();
087          return;
088        }
089        if (phaseId == RELEASE) {
090          msTrace.release();
091          msSpace.release();
092          super.collectionPhase(phaseId);
093          return;
094        }
095    
096        super.collectionPhase(phaseId);
097      }
098    
099      /*****************************************************************************
100       * Accounting
101       */
102    
103      /**
104       * {@inheritDoc}
105       * The superclass accounts for its spaces, we just
106       * augment this with the mark-sweep space's contribution.
107       */
108      @Override
109      public int getPagesUsed() {
110        return (msSpace.reservedPages() + super.getPagesUsed());
111      }
112    
113      /*****************************************************************************
114       * Miscellaneous
115       */
116    
117      /**
118       * {@inheritDoc}
119       */
120      @Override
121      public boolean willNeverMove(ObjectReference object) {
122        if (Space.isInSpace(MARK_SWEEP, object))
123          return true;
124        return super.willNeverMove(object);
125      }
126    
127      @Interruptible
128      @Override
129      protected void registerSpecializedMethods() {
130        TransitiveClosure.registerSpecializedScan(SCAN_MARK, MSTraceLocal.class);
131        super.registerSpecializedMethods();
132      }
133    }