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.utility.statistics;
014
015import org.vmmagic.pragma.*;
016
017/**
018 *
019 * This abstract class describes the interface of a generic counter.
020 */
021@Uninterruptible
022public abstract class Counter {
023
024  /****************************************************************************
025   *
026   * Instance variables
027   */
028
029  /**
030   *
031   */
032  private final String name;
033  private final boolean start;
034  private final boolean mergephases;
035
036  /**
037   * Allow for counters whose values are too complex to be simply printed out.
038   */
039  protected boolean complex = false;
040
041  /****************************************************************************
042   *
043   * Initialization
044   */
045
046  /**
047   * Constructor
048   *
049   * @param name The name to be associated with this counter
050   */
051  Counter(String name) {
052    this(name, true, false);
053  }
054
055  /**
056   * Constructor
057   *
058   * @param name The name to be associated with this counter
059   * @param start True if this counter is to be implicitly started
060   * when <code>startAll()</code> is called (otherwise the counter
061   * must be explicitly started).
062   */
063  Counter(String name, boolean start) {
064    this(name, start, false);
065  }
066
067  /**
068   * Constructor
069   *
070   * @param name The name to be associated with this counter
071   * @param start  True if this counter is to be implicitly started
072   * when <code>startAll()</code> is called (otherwise the counter
073   * must be explicitly started).
074   * @param mergephases True if this counter does not separately
075   * report GC and Mutator phases.
076   */
077  Counter(String name, boolean start, boolean mergephases) {
078    this.name = name;
079    this.start = start;
080    this.mergephases = mergephases;
081    Stats.newCounter(this);
082  }
083
084  /****************************************************************************
085   *
086   * Counter control methods: start, stop, print etc
087   */
088
089  /**
090   * Start this counter
091   */
092  abstract void start();
093
094  /**
095   * Stop this counter
096   */
097  abstract void stop();
098
099  /**
100   * The phase has changed (from GC to mutator or mutator to GC).
101   * Take action with respect to the last phase if necessary.
102   *
103   * @param oldPhase The last phase
104   */
105  abstract void phaseChange(int oldPhase);
106
107  /**
108   * Print the value of this counter for the given phase
109   *
110   * @param phase The phase to be printed
111   */
112  abstract void printCount(int phase);
113
114  /**
115   * Print the current total for this counter
116   */
117  abstract void printTotal();
118
119  /**
120   * Print the current total for either the mutator or GC phase
121   *
122   * @param mutator {@code true} if the total for the mutator phases is to be
123   * printed (otherwise the total for the GC phases will be printed).
124   */
125  abstract void printTotal(boolean mutator);
126
127  /**
128   * Print the current minimum value for either the mutator or GC phase
129   *
130   * @param mutator {@code true} if the minimum for the mutator phase is to be
131   * printed (otherwise the minimum for the GC phase will be printed).
132   */
133  abstract void printMin(boolean mutator);
134
135  /**
136   * Print the current maximum value for either the mutator or GC phase
137   *
138   * @param mutator {@code true} if the maximum for the mutator phase is to be
139   * printed (otherwise the maximum for the GC phase will be printed).
140   */
141  abstract void printMax(boolean mutator);
142
143  /**
144   * Print statistics for the most recent phase
145   */
146  public void printLast() {
147    if (Stats.phase > 0) printCount(Stats.phase - 1);
148  }
149
150
151  /****************************************************************************
152   *
153   * Accessor methods
154   */
155
156  /**
157   * Return the name of this counter
158   * @return The name of this counter
159   */
160  String getName() {
161    return name;
162  }
163
164  /**
165   * Return the (option) suffix to be used when reporting this counter
166   * @return The suffix
167   */
168  String getColumnSuffix() {
169    return "";
170  }
171
172  /**
173   * Return {@code true} if this counter is implicitly started when
174   * <code>startAll()</code> is called.
175   * @return {@code true} if this counter is implicitly started when
176   *         <code>startAll()</code> is called.
177   */
178  boolean getStart() {
179    return start;
180  }
181
182  /**
183   * Return true if this counter will merge stats for GC and mutator phases.
184   * @return True if this counter will merge stats for GC and mutator phases.
185   */
186  boolean mergePhases() {
187    return mergephases;
188  }
189
190  boolean isComplex() {
191    return complex;
192  }
193}