/* * 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.utility.statistics; import org.vmmagic.pragma.*; /** * * This abstract class describes the interface of a generic counter. */ @Uninterruptible public abstract class Counter { /**************************************************************************** * * Instance variables */ /** * */ private final String name; private final boolean start; private final boolean mergephases; /** * Allow for counters whose values are too complex to be simply printed out. */ protected boolean complex = false; /**************************************************************************** * * Initialization */ /** * Constructor * * @param name The name to be associated with this counter */ Counter(String name) { this(name, true, false); } /** * Constructor * * @param name The name to be associated with this counter * @param start True if this counter is to be implicitly started * when <code>startAll()</code> is called (otherwise the counter * must be explicitly started). */ Counter(String name, boolean start) { this(name, start, false); } /** * Constructor * * @param name The name to be associated with this counter * @param start True if this counter is to be implicitly started * when <code>startAll()</code> is called (otherwise the counter * must be explicitly started). * @param mergephases True if this counter does not separately * report GC and Mutator phases. */ Counter(String name, boolean start, boolean mergephases) { this.name = name; this.start = start; this.mergephases = mergephases; Stats.newCounter(this); } /**************************************************************************** * * Counter control methods: start, stop, print etc */ /** * Start this counter */ abstract void start(); /** * Stop this counter */ abstract void stop(); /** * The phase has changed (from GC to mutator or mutator to GC). * Take action with respect to the last phase if necessary. * * @param oldPhase The last phase */ abstract void phaseChange(int oldPhase); /** * Print the value of this counter for the given phase * * @param phase The phase to be printed */ abstract void printCount(int phase); /** * Print the current total for this counter */ abstract void printTotal(); /** * Print the current total for either the mutator or GC phase * * @param mutator {@code true} if the total for the mutator phases is to be * printed (otherwise the total for the GC phases will be printed). */ abstract void printTotal(boolean mutator); /** * Print the current minimum value for either the mutator or GC phase * * @param mutator {@code true} if the minimum for the mutator phase is to be * printed (otherwise the minimum for the GC phase will be printed). */ abstract void printMin(boolean mutator); /** * Print the current maximum value for either the mutator or GC phase * * @param mutator {@code true} if the maximum for the mutator phase is to be * printed (otherwise the maximum for the GC phase will be printed). */ abstract void printMax(boolean mutator); /** * Print statistics for the most recent phase */ public void printLast() { if (Stats.phase > 0) printCount(Stats.phase - 1); } /**************************************************************************** * * Accessor methods */ /** * Return the name of this counter * @return The name of this counter */ String getName() { return name; } /** * Return the (option) suffix to be used when reporting this counter * @return The suffix */ String getColumnSuffix() { return ""; } /** * Return {@code true} if this counter is implicitly started when * <code>startAll()</code> is called. * @return {@code true} if this counter is implicitly started when * <code>startAll()</code> is called. */ boolean getStart() { return start; } /** * Return true if this counter will merge stats for GC and mutator phases. * @return True if this counter will merge stats for GC and mutator phases. */ boolean mergePhases() { return mergephases; } boolean isComplex() { return complex; } }