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.MarkSweepLocal;
017 import org.mmtk.policy.Space;
018 import org.mmtk.utility.alloc.Allocator;
019
020 import org.vmmagic.pragma.*;
021 import org.vmmagic.unboxed.*;
022
023 /**
024 * This class implements <i>per-mutator thread</i> behavior
025 * and state for the <i>MS</i> plan, which implements a full-heap
026 * mark-sweep collector.<p>
027 *
028 * Specifically, this class defines <i>MS</i> mutator-time allocation
029 * and per-mutator thread collection semantics (flushing and restoring
030 * per-mutator allocator state).<p>
031 *
032 * @see MS
033 * @see MSCollector
034 * @see StopTheWorldMutator
035 * @see MutatorContext
036 */
037 @Uninterruptible
038 public class MSMutator extends StopTheWorldMutator {
039
040 /****************************************************************************
041 * Instance fields
042 */
043
044 /**
045 *
046 */
047 protected MarkSweepLocal ms = new MarkSweepLocal(MS.msSpace);
048
049
050 /****************************************************************************
051 * Mutator-time allocation
052 */
053
054 /**
055 * {@inheritDoc}<p>
056 *
057 * This class handles the default allocator from the mark sweep space,
058 * and delegates everything else to the superclass.
059 */
060 @Inline
061 @Override
062 public Address alloc(int bytes, int align, int offset, int allocator, int site) {
063 if (allocator == MS.ALLOC_DEFAULT) {
064 return ms.alloc(bytes, align, offset);
065 }
066 return super.alloc(bytes, align, offset, allocator, site);
067 }
068
069 /**
070 * {@inheritDoc}<p>
071 *
072 * Initialize the object header for objects in the mark-sweep space,
073 * and delegate to the superclass for other objects.
074 */
075 @Inline
076 @Override
077 public void postAlloc(ObjectReference ref, ObjectReference typeRef,
078 int bytes, int allocator) {
079 if (allocator == MS.ALLOC_DEFAULT)
080 MS.msSpace.postAlloc(ref);
081 else
082 super.postAlloc(ref, typeRef, bytes, allocator);
083 }
084
085 @Override
086 public Allocator getAllocatorFromSpace(Space space) {
087 if (space == MS.msSpace) return ms;
088 return super.getAllocatorFromSpace(space);
089 }
090
091
092 /****************************************************************************
093 * Collection
094 */
095
096 /**
097 * {@inheritDoc}
098 */
099 @Inline
100 @Override
101 public void collectionPhase(short phaseId, boolean primary) {
102 if (phaseId == MS.PREPARE) {
103 super.collectionPhase(phaseId, primary);
104 ms.prepare();
105 return;
106 }
107
108 if (phaseId == MS.RELEASE) {
109 ms.release();
110 super.collectionPhase(phaseId, primary);
111 return;
112 }
113
114 super.collectionPhase(phaseId, primary);
115 }
116
117 @Override
118 public void flush() {
119 super.flush();
120 ms.flush();
121 }
122 }