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.semispace;
014
015 import org.mmtk.plan.*;
016 import org.mmtk.policy.CopyLocal;
017 import org.mmtk.policy.Space;
018 import org.mmtk.utility.alloc.Allocator;
019
020 import org.vmmagic.unboxed.*;
021 import org.vmmagic.pragma.*;
022
023 /**
024 * This class implements <i>per-mutator thread</i> behavior
025 * and state for the <i>SS</i> plan, which implements a full-heap
026 * semi-space collector.<p>
027 *
028 * Specifically, this class defines <i>SS</i> mutator-time allocation
029 * and per-mutator thread collection semantics (flushing and restoring
030 * per-mutator allocator state).<p>
031 *
032 * See {@link SS} for an overview of the semi-space algorithm.<p>
033 *
034 * @see SS
035 * @see SSCollector
036 * @see StopTheWorldMutator
037 * @see MutatorContext
038 */
039 @Uninterruptible
040 public class SSMutator extends StopTheWorldMutator {
041 /****************************************************************************
042 * Instance fields
043 */
044 protected final CopyLocal ss;
045
046 /****************************************************************************
047 *
048 * Initialization
049 */
050
051 /**
052 * Constructor
053 */
054 public SSMutator() {
055 ss = new CopyLocal();
056 }
057
058 /**
059 * Called before the MutatorContext is used, but after the context has been
060 * fully registered and is visible to collection.
061 */
062 @Override
063 public void initMutator(int id) {
064 super.initMutator(id);
065 ss.rebind(SS.toSpace());
066 }
067
068 /****************************************************************************
069 *
070 * Mutator-time allocation
071 */
072
073 /**
074 * {@inheritDoc}
075 */
076 @Override
077 @Inline
078 public Address alloc(int bytes, int align, int offset, int allocator, int site) {
079 if (allocator == SS.ALLOC_SS)
080 return ss.alloc(bytes, align, offset);
081 else
082 return super.alloc(bytes, align, offset, allocator, site);
083 }
084
085 @Override
086 @Inline
087 public void postAlloc(ObjectReference object, ObjectReference typeRef,
088 int bytes, int allocator) {
089 if (allocator == SS.ALLOC_SS) return;
090 super.postAlloc(object, typeRef, bytes, allocator);
091 }
092
093 @Override
094 public Allocator getAllocatorFromSpace(Space space) {
095 if (space == SS.copySpace0 || space == SS.copySpace1) return ss;
096 return super.getAllocatorFromSpace(space);
097 }
098
099 /****************************************************************************
100 *
101 * Collection
102 */
103
104 /**
105 * {@inheritDoc}
106 */
107 @Override
108 @Inline
109 public void collectionPhase(short phaseId, boolean primary) {
110 if (phaseId == SS.PREPARE) {
111 super.collectionPhase(phaseId, primary);
112 return;
113 }
114
115 if (phaseId == SS.RELEASE) {
116 super.collectionPhase(phaseId, primary);
117 // rebind the allocation bump pointer to the appropriate semispace.
118 ss.rebind(SS.toSpace());
119 return;
120 }
121
122 super.collectionPhase(phaseId, primary);
123 }
124
125
126 /****************************************************************************
127 *
128 * Miscellaneous
129 */
130
131 /**
132 * Show the status of each of the allocators.
133 */
134 public final void show() {
135 ss.show();
136 los.show();
137 immortal.show();
138 }
139
140 }