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}