/* * 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.vm.gcspy; import org.mmtk.utility.Log; import org.mmtk.utility.gcspy.Color; import org.mmtk.utility.gcspy.StreamConstants; import org.mmtk.utility.gcspy.drivers.AbstractDriver; import org.mmtk.vm.VM; import org.vmmagic.pragma.*; import org.vmmagic.unboxed.Address; /** * * Abstract class for a GCspy Stream. * Implementing classes will mostly forward calls * to the gcspy C library */ @Uninterruptible public abstract class Stream { /**************************************************************************** * * Instance variables */ /** * The address of the C stream, gcspy_gc_stream_t *stream, used in all calls * to the C library */ protected Address stream; /** The owning GCspy space */ protected ServerSpace serverSpace; /** The stream's ID */ protected int streamId; /** * A summary has 1 or 2 values depending on presentation style * (PERCENT* styles require 2 values). */ protected int summaryLen; /** The first summary value */ protected int summary0; /** The second summary value (if any) */ protected int summary1; private int min; // The minimum value for tiles private int max; // The maximum value for tiles /** use summaries? */ protected boolean summaryEnabled; /** the presentation style */ protected int presentation; protected static final boolean DEBUG = false; /** * Construct a new GCspy stream. * * @param driver The AbstractDriver that owns this Stream * @param dataType The stream's data type, one of BYTE_TYPE, SHORT_TYPE or INT_TYPE * @param name The name of the stream (e.g. "Used space") * @param minValue The minimum value for any item in this stream. Values less than * this will be represented as "minValue-" * @param maxValue The maximum value for any item in this stream. Values greater than * this will be represented as "maxValue+" * @param zeroValue The zero value for this stream * @param defaultValue The default value for this stream * @param stringPre A string to prefix values (e.g. "Used: ") * @param stringPost A string to suffix values (e.g. " bytes.") * @param presentation How a stream value is to be presented. * @param paintStyle How the value is to be painted. * @param indexMaxStream The index for the maximum stream if the presentation is *_VAR. * @param colour The default colour for tiles of this stream * @param summary Is a summary enabled? */ protected Stream( AbstractDriver driver, int dataType, String name, int minValue, int maxValue, int zeroValue, int defaultValue, String stringPre, String stringPost, int presentation, int paintStyle, int indexMaxStream, Color colour, boolean summary) { serverSpace = driver.getServerSpace(); summaryEnabled = summary; this.presentation = presentation; if (summary) setupSummary(presentation); min = minValue; max = maxValue; driver.addStream(this); if (DEBUG) { Log.write("Adding stream "); Log.write(name); Log.writeln(" id=", streamId); } } /** * Set the stream address and id (called by AbstractDriver.addStream). * @param id the id * @param str the address of the gcspy C gcspy_gc_stream_t *stream */ public void setStream(int id, Address str) { streamId = id; stream = str; } /** * Return the minimum value expected for this stream. * @return the minimum value */ public int getMinValue() { return min; } /** * Return the maximum value expected for this stream. * @return the maximum value */ public int getMaxValue() { return max; } /** * Setup the summary array. * @param presentation the presentation style */ @Interruptible private void setupSummary(int presentation) { switch (presentation) { case StreamConstants.PRESENTATION_PLAIN: case StreamConstants.PRESENTATION_PLUS: case StreamConstants.PRESENTATION_MAX_VAR: case StreamConstants.PRESENTATION_ENUM: summaryLen = 1; break; case StreamConstants.PRESENTATION_PERCENT: case StreamConstants.PRESENTATION_PERCENT_VAR: summaryLen = 2; break; default: VM.assertions._assert(false); } } /** * Set the summary value for presentation styles with just one value * @param value0 the value */ public void setSummary(int value0) { if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(presentation != StreamConstants.PRESENTATION_PERCENT && presentation != StreamConstants.PRESENTATION_PERCENT_VAR); summary0 = value0; } /** * Set the summary values for presentation styles with two values (i.e. * PRESENTATION_PERCENT and PRESENTATION_PERCENT_VAR). * @param value0 the numerator value * @param value1 the denominator value */ public void setSummary(int value0, int value1) { if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(presentation == StreamConstants.PRESENTATION_PERCENT || presentation == StreamConstants.PRESENTATION_PERCENT_VAR); summary0 = value0; summary1 = value1; } /** * Send the data for this stream. * @param event the event. * @param numTiles the number of tiles to send. */ public abstract void send(int event, int numTiles); /** * Send the summary data for this stream. */ public void sendSummary() { if (summaryEnabled) { serverSpace.summary(streamId, summaryLen); serverSpace.summaryValue(summary0); if (summaryLen == 2) serverSpace.summaryValue(summary1); serverSpace.summaryEnd(); } } }