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.Constants; 016 import org.mmtk.utility.deque.SharedDeque; 017 import org.mmtk.policy.RawPageSpace; 018 019 import org.vmmagic.pragma.*; 020 021 /** 022 * This abstract class implements the core functionality for a transitive 023 * closure over the heap. This class holds the global state, TraceLocal 024 * and its super-classes handle per-thread state. 025 */ 026 @Uninterruptible 027 public class Trace implements Constants { 028 029 // Global pools for load-balancing deques 030 final SharedDeque valuePool; 031 final SharedDeque rootLocationPool; 032 033 /** 034 * Constructor 035 */ 036 public Trace(RawPageSpace metaDataSpace) { 037 valuePool = new SharedDeque("valuePool",metaDataSpace, 1); 038 rootLocationPool = new SharedDeque("rootLocations", metaDataSpace, 1); 039 } 040 041 /** 042 * Prepare for a new collection pass. 043 */ 044 public void prepareNonBlocking() { 045 valuePool.prepareNonBlocking(); 046 rootLocationPool.prepareNonBlocking(); 047 } 048 049 /** 050 * Prepare for a new collection pass. 051 * All active GC threads take part. 052 */ 053 public void prepare() { 054 valuePool.prepare(); 055 rootLocationPool.prepareNonBlocking(); 056 } 057 058 /** 059 * Release resources after completing a collection pass. 060 */ 061 public void release() { 062 valuePool.reset(); 063 rootLocationPool.reset(); 064 } 065 066 /** 067 * Is there any work outstanding in this trace. That is are there any pages in the pools. 068 */ 069 public boolean hasWork() { 070 return (valuePool.enqueuedPages() + rootLocationPool.enqueuedPages()) > 0; 071 } 072 }