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.concurrent.marksweep;
014    
015    import org.mmtk.plan.*;
016    import org.mmtk.plan.concurrent.ConcurrentCollector;
017    import org.mmtk.vm.VM;
018    
019    import org.vmmagic.pragma.*;
020    
021    /**
022     * This class implements <i>per-collector thread</i> behavior
023     * and state for the <i>CMS</i> plan, which implements a full-heap
024     * concurrent mark-sweep collector.<p>
025     */
026    @Uninterruptible
027    public class CMSCollector extends ConcurrentCollector {
028    
029      /****************************************************************************
030       * Instance fields
031       */
032      protected final CMSTraceLocal trace;
033    
034      /****************************************************************************
035       * Initialization
036       */
037    
038      /**
039       * Constructor
040       */
041      public CMSCollector() {
042        trace = new CMSTraceLocal(global().msTrace);
043      }
044    
045      /****************************************************************************
046       *
047       * Collection
048       */
049    
050      /**
051       * {@inheritDoc}
052       */
053      @Override
054      @Inline
055      public void collectionPhase(short phaseId, boolean primary) {
056        if (phaseId == CMS.PREPARE) {
057          super.collectionPhase(phaseId, primary);
058          trace.prepare();
059          return;
060        }
061    
062        if (phaseId == CMS.CLOSURE) {
063          trace.completeTrace();
064          return;
065        }
066    
067        if (phaseId == CMS.RELEASE) {
068          trace.release();
069          super.collectionPhase(phaseId, primary);
070          return;
071        }
072    
073        super.collectionPhase(phaseId, primary);
074      }
075    
076      @Override
077      protected boolean concurrentTraceComplete() {
078        if (!global().msTrace.hasWork()) {
079          return true;
080        }
081        return false;
082      }
083    
084      /****************************************************************************
085       *
086       * Miscellaneous
087       */
088    
089      /** @return The active global plan as an <code>MS</code> instance. */
090      @Inline
091      private static CMS global() {
092        return (CMS) VM.activePlan.global();
093      }
094    
095      /** @return The current trace instance. */
096      @Override
097      public final TraceLocal getCurrentTrace() {
098        return trace;
099      }
100    }