Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a buffer for the mutator to push values to the global trace durin…
…g concurrent gc.
- Loading branch information
Daniel Frampton
authored and
Daniel Frampton
committed
Sep 1, 2007
1 parent
ecbfe36
commit 2257a75
Showing
1 changed file
with
72 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/* | ||
* This file is part of the Jikes RVM project (http://jikesrvm.org). | ||
* | ||
* This file is licensed to You under the Common Public License (CPL); | ||
* You may not use this file except in compliance with the License. You | ||
* may obtain a copy of the License at | ||
* | ||
* http://www.opensource.org/licenses/cpl1.0.php | ||
* | ||
* See the COPYRIGHT.txt file distributed with this work for information | ||
* regarding copyright ownership. | ||
*/ | ||
package org.mmtk.plan; | ||
|
||
import org.mmtk.utility.deque.WriteBuffer; | ||
import org.vmmagic.pragma.*; | ||
import org.vmmagic.unboxed.*; | ||
|
||
/** | ||
* This class is used to push values in one direction during a trace. It | ||
* was designed for use in mutators that use write barriers to push | ||
* work to collector threads during concurrent tracing. | ||
* | ||
* @see org.mmtk.plan.TraceLocal | ||
*/ | ||
@Uninterruptible | ||
public final class TraceWriteBuffer extends TransitiveClosure { | ||
/**************************************************************************** | ||
* | ||
* Instance variables | ||
*/ | ||
private final WriteBuffer buffer; | ||
|
||
/**************************************************************************** | ||
* | ||
* Initialization | ||
*/ | ||
|
||
/** | ||
* Constructor | ||
* | ||
* @param trace The global trace class to use. | ||
*/ | ||
public TraceWriteBuffer(Trace trace) { | ||
buffer = new WriteBuffer(trace.valuePool); | ||
} | ||
|
||
/** | ||
* Flush the buffer to the trace. | ||
*/ | ||
public void flush() { | ||
buffer.flushLocal(); | ||
} | ||
|
||
|
||
/** | ||
* @return True if the buffer is flushed. | ||
*/ | ||
public boolean isFlushed() { | ||
return buffer.isFlushed(); | ||
} | ||
|
||
/** | ||
* Enqueue an object during a trace. | ||
* | ||
* @param object The object to enqueue | ||
*/ | ||
@Inline | ||
public void processNode(ObjectReference object) { | ||
buffer.insert(object.toAddress()); | ||
} | ||
} |