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.TraceLocal;
016 import org.mmtk.plan.Trace;
017 import org.mmtk.policy.Space;
018 import org.mmtk.utility.HeaderByte;
019 import org.mmtk.utility.deque.ObjectReferenceDeque;
020
021 import org.vmmagic.pragma.*;
022 import org.vmmagic.unboxed.*;
023
024 /**
025 * This class implements the thread-local functionality for a transitive
026 * closure over a mark-sweep space.
027 */
028 @Uninterruptible
029 public final class MSTraceLocal extends TraceLocal {
030 /****************************************************************************
031 * Instance fields
032 */
033
034 /**
035 *
036 */
037 private final ObjectReferenceDeque modBuffer;
038
039 /**
040 * Constructor
041 */
042 public MSTraceLocal(Trace trace, ObjectReferenceDeque modBuffer) {
043 super(MS.SCAN_MARK, trace);
044 this.modBuffer = modBuffer;
045 }
046
047
048 /****************************************************************************
049 * Externally visible Object processing and tracing
050 */
051
052 /**
053 * {@inheritDoc}
054 */
055 @Override
056 public boolean isLive(ObjectReference object) {
057 if (object.isNull()) return false;
058 if (Space.isInSpace(MS.MARK_SWEEP, object)) {
059 return MS.msSpace.isLive(object);
060 }
061 return super.isLive(object);
062 }
063
064 /**
065 * {@inheritDoc}<p>
066 *
067 * In this instance, we refer objects in the mark-sweep space to the
068 * msSpace for tracing, and defer to the superclass for all others.
069 *
070 * @param object The object to be traced.
071 * @return The new reference to the same object instance.
072 */
073 @Inline
074 @Override
075 public ObjectReference traceObject(ObjectReference object) {
076 if (object.isNull()) return object;
077 if (Space.isInSpace(MS.MARK_SWEEP, object))
078 return MS.msSpace.traceObject(this, object);
079 return super.traceObject(object);
080 }
081
082 /**
083 * Process any remembered set entries. This means enumerating the
084 * mod buffer and for each entry, marking the object as unlogged
085 * (we don't enqueue for scanning since we're doing a full heap GC).
086 */
087 @Override
088 protected void processRememberedSets() {
089 if (modBuffer != null) {
090 logMessage(5, "clearing modBuffer");
091 while (!modBuffer.isEmpty()) {
092 ObjectReference src = modBuffer.pop();
093 HeaderByte.markAsUnlogged(src);
094 }
095 }
096 }
097 }