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 }