/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Eclipse Public License (EPL); * 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/eclipse-1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package org.mmtk.plan; import org.mmtk.utility.Constants; import org.mmtk.utility.deque.SharedDeque; import org.mmtk.policy.RawPageSpace; import org.vmmagic.pragma.*; /** * This abstract class implements the core functionality for a transitive * closure over the heap. This class holds the global state, TraceLocal * and its super-classes handle per-thread state. */ @Uninterruptible public class Trace implements Constants { // Global pools for load-balancing deques final SharedDeque valuePool; final SharedDeque rootLocationPool; /** * Constructor */ public Trace(RawPageSpace metaDataSpace) { valuePool = new SharedDeque("valuePool",metaDataSpace, 1); rootLocationPool = new SharedDeque("rootLocations", metaDataSpace, 1); } /** * Prepare for a new collection pass. */ public void prepareNonBlocking() { valuePool.prepareNonBlocking(); rootLocationPool.prepareNonBlocking(); } /** * Prepare for a new collection pass. * All active GC threads take part. */ public void prepare() { valuePool.prepare(); rootLocationPool.prepareNonBlocking(); } /** * Release resources after completing a collection pass. */ public void release() { valuePool.reset(); rootLocationPool.reset(); } /** * Is there any work outstanding in this trace. That is are there any pages in the pools. */ public boolean hasWork() { return (valuePool.enqueuedPages() + rootLocationPool.enqueuedPages()) > 0; } }