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.utility.statistics;
014    
015    import org.vmmagic.pragma.*;
016    
017    /**
018     * This class implements a simple counter of events of different sizes
019     * (eg object allocations, where total number of objects and total
020     * volume of objects would be counted).<p>
021     *
022     * The counter is trivially composed from two event counters (one for
023     * counting the number of events, the other for counting the volume).
024     */
025    @Uninterruptible
026    public class SizeCounter {
027    
028      /****************************************************************************
029       *
030       * Instance variables
031       */
032    
033      /**
034       *
035       */
036      private EventCounter units;
037      private EventCounter volume;
038    
039      /****************************************************************************
040       *
041       * Initialization
042       */
043    
044      /**
045       * Constructor
046       *
047       * @param name The name to be associated with this counter
048       */
049      public SizeCounter(String name) {
050        this(name, true, false);
051      }
052    
053      /**
054       * Constructor
055       *
056       * @param name The name to be associated with this counter
057       * @param start True if this counter is to be implicitly started
058       * when <code>startAll()</code> is called (otherwise the counter
059       * must be explicitly started).
060       */
061      public SizeCounter(String name, boolean start) {
062        this(name, start, false);
063      }
064    
065      /**
066       * Constructor
067       *
068       * @param name The name to be associated with this counter
069       * @param start True if this counter is to be implicitly started
070       * when <code>startAll()</code> is called (otherwise the counter
071       * must be explicitly started).
072       * @param mergephases True if this counter does not separately
073       * report GC and Mutator phases.
074       */
075      public SizeCounter(String name, boolean start, boolean mergephases) {
076        units = new EventCounter(name, start, mergephases);
077        volume = new EventCounter(name + "Volume", start, mergephases);
078      }
079    
080      /****************************************************************************
081       *
082       * Counter-specific methods
083       */
084    
085      /**
086       * Increment the event counter by <code>value</code>
087       *
088       * @param value The amount by which the counter should be incremented.
089       */
090      public void inc(int value) {
091        units.inc();
092        volume.inc(value);
093      }
094    
095      /****************************************************************************
096       *
097       * Generic counter control methods: start, stop, print etc
098       */
099    
100      /**
101       * Start this counter
102       */
103      public void start() {
104        units.start();
105        volume.start();
106      }
107    
108      /**
109       * Stop this counter
110       */
111      public void stop() {
112        units.stop();
113        volume.stop();
114      }
115    
116      /**
117       * Print current (mid-phase) units
118       */
119      public void printCurrentUnits() {
120        units.printCurrent();
121      }
122    
123      /**
124       * Print (mid-phase) volume
125       */
126      public void printCurrentVolume() {
127        volume.printCurrent();
128      }
129    
130      /**
131       * Print units
132       */
133      public void printUnits() {
134        units.printTotal();
135      }
136    
137      /**
138       * Print volume
139       */
140      public void printVolume() {
141        volume.printTotal();
142      }
143    }