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 */ 013package org.mmtk.plan; 014 015import org.mmtk.vm.VM; 016 017import org.vmmagic.pragma.*; 018 019/** 020 * TODO: Documentation. 021 */ 022@Uninterruptible 023public abstract class ParallelCollector extends CollectorContext { 024 025 /**************************************************************************** 026 * Instance fields 027 */ 028 029 /** The group that this collector context is running in (may be null) */ 030 protected ParallelCollectorGroup group; 031 032 /** Last group trigger index (see CollectorContextGroup) */ 033 int lastTriggerCount; 034 035 /** The index of this thread in the collector context group. */ 036 int workerOrdinal; 037 038 /**************************************************************************** 039 * Collection. 040 */ 041 042 /** 043 * {@inheritDoc} 044 */ 045 @Override 046 @Unpreemptible 047 public void run() { 048 while (true) { 049 park(); 050 collect(); 051 } 052 } 053 054 /** Perform a single garbage collection */ 055 public void collect() { 056 VM.assertions.fail("Collector has not implemented collectionPhase"); 057 } 058 059 /** 060 * Perform a (local, i.e.per-collector) collection phase. 061 * 062 * @param phaseId The unique phase identifier 063 * @param primary Should this thread be used to execute any single-threaded 064 * local operations? 065 */ 066 public void collectionPhase(short phaseId, boolean primary) { 067 VM.assertions.fail("Collector has not implemented collectionPhase"); 068 } 069 070 /** 071 * @return The current trace instance. 072 */ 073 public TraceLocal getCurrentTrace() { 074 VM.assertions.fail("Collector has not implemented getCurrentTrace"); 075 return null; 076 } 077 078 /** 079 * Park this thread into the group, waiting for a request. 080 */ 081 public final void park() { 082 if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(this.group != null); 083 group.park(this); 084 } 085 086 @Override 087 public int parallelWorkerCount() { 088 return group.activeWorkerCount(); 089 } 090 091 @Override 092 public int parallelWorkerOrdinal() { 093 return workerOrdinal; 094 } 095 096 @Override 097 public int rendezvous() { 098 return group.rendezvous(); 099 } 100}