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;
014
015 import org.mmtk.utility.deque.WriteBuffer;
016 import org.vmmagic.pragma.*;
017 import org.vmmagic.unboxed.*;
018
019 /**
020 * This class is used to push values in one direction during a trace. It
021 * was designed for use in mutators that use write barriers to push
022 * work to collector threads during concurrent tracing.
023 *
024 * @see org.mmtk.plan.TraceLocal
025 */
026 @Uninterruptible
027 public final class TraceWriteBuffer extends TransitiveClosure {
028 /****************************************************************************
029 *
030 * Instance variables
031 */
032
033 /**
034 *
035 */
036 private final WriteBuffer buffer;
037
038 /****************************************************************************
039 *
040 * Initialization
041 */
042
043 /**
044 * Constructor
045 *
046 * @param trace The global trace class to use.
047 */
048 public TraceWriteBuffer(Trace trace) {
049 buffer = new WriteBuffer(trace.valuePool);
050 }
051
052 /**
053 * Flush the buffer to the trace.
054 */
055 public void flush() {
056 buffer.flushLocal();
057 }
058
059
060 /**
061 * @return <code>true</code> if the buffer is flushed.
062 */
063 public boolean isFlushed() {
064 return buffer.isFlushed();
065 }
066
067 /**
068 * Enqueue an object during a trace.
069 *
070 * @param object The object to enqueue
071 */
072 @Override
073 @Inline
074 public void processNode(ObjectReference object) {
075 buffer.insert(object.toAddress());
076 }
077 }