sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi/src/com/nokia/carbide/cpp/internal/pi/model/ProfiledGeneric.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi/src/com/nokia/carbide/cpp/internal/pi/model/ProfiledGeneric.java Thu Feb 11 15:32:31 2010 +0200
@@ -0,0 +1,462 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package com.nokia.carbide.cpp.internal.pi.model;
+
+import java.text.DecimalFormat;
+
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+
+import com.nokia.carbide.cpp.pi.util.ColorPalette;
+
+public abstract class ProfiledGeneric
+{
+ protected int index = -1;
+ private String nameString;
+ protected Color color;
+ protected int totalSampleCount;
+ protected int firstSample = -1;
+ protected int lastSample = -1;
+ private int recentSample = -1;
+ private int recentSampleCount = 0;
+ private int recentPercentage = -1;
+ protected int[] activityList;
+ private int[] sampleList;
+ private int[][] cumulativeList = new int[3][];
+
+ // since each instance may be used by table viewers for multiple graphs,
+ // keep per graph (for a maximum of 3 graphs):
+ // whether the thread/binary/function is currently enabled
+ // sample count in the selected graph area
+ // % load in the selected graph area
+ // string version of graph percent load
+ protected boolean[] enableValue = {true, true, true};
+ protected int[] graphSampleCount = { 0, 0, 0 };
+ protected float[] graphPercentLoad = { 0.0f, 0.0f, 0.0f };
+ private String[] averageLoadValueString = { "", "", "" }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+
+ private PointList[] pointList = {new PointList(), new PointList(), new PointList()};
+ protected int[] activityP = null;
+ private int[] activityT = null;
+ protected int activityIndx = 0;
+
+ public ProfiledGeneric()
+ {
+ // default to light gray
+ this.color = ColorPalette.getColor(new RGB(192, 192, 192));
+ }
+
+ public void setNameString(String nameString)
+ {
+ this.nameString = nameString;
+ }
+
+ public void addPointToPolyline(int graphIndex, int x, int y)
+ {
+ pointList[graphIndex].addPoint(x, y);
+ }
+
+ public void resetPolyline(int graphIndex)
+ {
+ pointList[graphIndex].removeAllPoints();
+ }
+
+ public PointList getPointList(int graphIndex)
+ {
+ return pointList[graphIndex];
+ }
+
+ public int getIndex()
+ {
+ return this.index;
+ }
+
+ public void setActivityMarkCount(int size)
+ {
+ this.activityP = new int[size];
+ this.activityT = new int[size];
+ }
+
+ // zero the samples of this profiled generic in the time range starting at the time stamp
+ public void zeroActivityMarkValues(int timeStamp)
+ {
+ addActivityMarkValues(timeStamp, 0, 0);
+ }
+
+ // set the samples of of this profiled generic in the time range starting at the time stamp
+ public void addActivityMarkValues(int timeStamp, int percentage, int sampleCount)
+ {
+ this.activityT[this.activityIndx] = timeStamp;
+ this.activityP[this.activityIndx] = percentage;
+
+ if (this.firstSample == -1 && percentage != 0)
+ {
+ this.firstSample = this.recentSample;
+ }
+
+ if (this.recentSampleCount > 0)
+ this.lastSample = timeStamp;
+
+ this.recentSample = timeStamp;
+ this.recentSampleCount = sampleCount;
+ this.recentPercentage = percentage;
+ this.activityIndx++;
+ }
+
+ public void addActivityMark(int timeStamp, int percentage)
+ {
+ this.activityT[this.activityIndx] = timeStamp;
+ this.activityP[this.activityIndx] = percentage;
+ this.activityIndx++;
+ }
+
+ public void setupCumulativeList(int graphIndex)
+ {
+ if (this.activityIndx != 0)
+ {
+ if (cumulativeList[graphIndex] == null)
+ cumulativeList[graphIndex] = new int[this.activityIndx];
+ else
+ {
+ for (int i = 0; i < cumulativeList[graphIndex].length; i++)
+ {
+ cumulativeList[graphIndex][i] = 0;
+ }
+ }
+ }
+ }
+
+ public int[] getCumulativeList(int graphIndex)
+ {
+ return this.cumulativeList[graphIndex];
+ }
+
+ public void setCumulativeValue(int graphIndex, int index, int value)
+ {
+ this.cumulativeList[graphIndex][index] = value;
+ }
+
+ //returns x-coordinates
+ public int[] getSampleList()
+ {
+ if (sampleList == null && this.activityIndx != 0)
+ {
+ sampleList = new int[this.activityIndx];
+
+ for (int i = 0; i < this.activityIndx; i++)
+ {
+ this.sampleList[i] = this.activityT[i];
+ }
+ this.activityT = null;
+ }
+ return this.sampleList;
+ }
+
+ // returns y-coordinates
+ public int[] getActivityList()
+ {
+ if (activityList == null && this.activityIndx != 0)
+ {
+ activityList = new int[this.activityIndx];
+
+ for (int i = 0; i < this.activityIndx; i++)
+ {
+ activityList[i] = this.activityP[i];
+ }
+ this.activityP = null;
+ }
+
+ return this.activityList;
+ }
+
+ public int getFirstSample()
+ {
+ if (this.firstSample == -1)
+ return 0;
+ else
+ return this.firstSample;
+ }
+
+ public int getRealFirstSample()
+ {
+ return this.firstSample;
+ }
+
+ public int getLastSample()
+ {
+ if (this.lastSample == -1)
+ return 0;
+ else
+ return this.lastSample;
+ }
+
+ public int getRealLastSample()
+ {
+ return this.lastSample;
+ }
+
+ public void setLastSample(int lastSample)
+ {
+ this.lastSample = lastSample;
+ }
+
+ private int findNearestSampleIndexFromStart(int sampleNum)
+ {
+ int i = 0;
+ while (i < this.sampleList.length && this.sampleList[i] < sampleNum)
+ {
+ i++;
+ }
+ return i;
+ }
+
+ private int findNearestSampleIndexFromEnd(int sampleNum)
+ {
+ int i = sampleList.length - 1;
+ while (this.sampleList[i] > sampleNum && i > 0)
+ {
+ i--;
+ }
+ return i;
+ }
+
+ public float getAverageLoad(double startTime, double endTime)
+ {
+ return getAverageLoad((int) startTime,(int) endTime);
+ }
+
+ public float getAverageLoad(int startSample,int endSample)
+ {
+ if (startSample == -1 || endSample == -1) return -666;
+ if (endSample < startSample) return -777;
+
+ if (this.activityList == null || this.sampleList == null) return -888;
+
+ int firstSampleIndx = 0;
+ int lastSampleIndx = 0;
+
+ firstSampleIndx = this.findNearestSampleIndexFromStart(startSample) + 1;
+ lastSampleIndx = this.findNearestSampleIndexFromEnd(endSample) + 1;
+
+ if (firstSampleIndx < 0)
+ firstSampleIndx = 0;
+ if (firstSampleIndx >= activityList.length)
+ firstSampleIndx = activityList.length - 1;
+
+ if (lastSampleIndx < 0)
+ lastSampleIndx = 0;
+ if (lastSampleIndx >= activityList.length)
+ lastSampleIndx = activityList.length - 1;
+
+ if (firstSampleIndx > lastSampleIndx)
+ {
+ int temp = firstSampleIndx;
+ firstSampleIndx = lastSampleIndx;
+ lastSampleIndx = temp;
+ }
+
+ int totalTime = sampleList[lastSampleIndx - 1] - sampleList[firstSampleIndx - 1];
+ int totalLoad = 0;
+
+ for (int i = firstSampleIndx; i < lastSampleIndx; i++)
+ {
+ totalLoad += this.activityList[i];
+ }
+
+ totalLoad *= (sampleList[1] - sampleList[0]);
+
+ if (totalTime == 0)
+ {
+ return 0;
+ }
+ else
+ {
+ return (float)(((float)totalLoad) / ((float)totalTime));
+ }
+ }
+
+ public int getTotalLoad(int startSample,int endSample)
+ {
+ if (startSample == -1 || endSample == -1) return -666;
+ if (endSample < startSample) return -777;
+
+ if (this.activityList == null || this.sampleList == null) return -888;
+
+ int firstSampleIndx = 0;
+ int lastSampleIndx = 0;
+
+ firstSampleIndx = this.findNearestSampleIndexFromStart(startSample) + 1;
+ lastSampleIndx = this.findNearestSampleIndexFromEnd(endSample) + 1;
+
+ if (firstSampleIndx < 0)
+ firstSampleIndx = 0;
+ if (firstSampleIndx >= activityList.length)
+ firstSampleIndx = activityList.length - 1;
+
+ if (lastSampleIndx < 0)
+ lastSampleIndx = 0;
+ if (lastSampleIndx >= activityList.length)
+ lastSampleIndx = activityList.length - 1;
+
+ if (firstSampleIndx > lastSampleIndx)
+ {
+ int temp = firstSampleIndx;
+ firstSampleIndx = lastSampleIndx;
+ lastSampleIndx = temp;
+ }
+
+ int totalTime = sampleList[lastSampleIndx - 1] - sampleList[firstSampleIndx - 1];
+ int totalLoad = 0;
+
+ for (int i = firstSampleIndx; i < lastSampleIndx; i++)
+ {
+ totalLoad += this.activityList[i];
+ }
+
+ if (totalTime == 0)
+ {
+ return 0;
+ }
+ else
+ {
+ return (int) totalLoad;
+ }
+ }
+
+ public void setIndex(int index)
+ {
+ this.index = index;
+ }
+
+ public void setAverageLoadValueString(int graphIndex, String valueString)
+ {
+ this.averageLoadValueString[graphIndex] = valueString;
+ }
+
+ public void setAverageLoadValueString(int graphIndex, float value)
+ {
+ this.averageLoadValueString[graphIndex] = (new DecimalFormat(Messages.getString("ProfiledGeneric.decimalFormat"))).format(value); //$NON-NLS-1$
+ }
+
+ public void setAverageLoadValueString(int graphIndex)
+ {
+ this.averageLoadValueString[graphIndex] = (new DecimalFormat(Messages.getString("ProfiledGeneric.decimalFormat"))).format(this.graphPercentLoad[graphIndex]); //$NON-NLS-1$
+ }
+
+ public String getAverageLoadValueString(int graphIndex)
+ {
+ return this.averageLoadValueString[graphIndex];
+ }
+
+ public void setColor(Color c)
+ {
+ this.color = c;
+ }
+
+ public void setEnabled(int graphIndex, boolean enableValue)
+ {
+ this.enableValue[graphIndex] = enableValue;
+ }
+
+ public boolean isEnabled(int graphIndex)
+ {
+ return enableValue[graphIndex];
+ }
+
+ public Color getColor()
+ {
+ return this.color;
+ }
+
+ public String getNameString()
+ {
+ return this.nameString;
+ }
+
+ public int getTotalSampleCount()
+ {
+ return this.totalSampleCount;
+ }
+
+ public void incTotalSampleCount()
+ {
+ this.totalSampleCount++;
+ }
+
+ public int getSampleCount(int graphIndex)
+ {
+ return this.graphSampleCount[graphIndex];
+ }
+
+ public void setSampleCount(int graphIndex, int sampleCount)
+ {
+ this.graphSampleCount[graphIndex] = sampleCount;
+ }
+
+ public void incSampleCount(int graphIndex)
+ {
+ this.graphSampleCount[graphIndex]++;
+ }
+
+ public void setSampleCounts(int sampleCount0, int sampleCount1, int sampleCount2)
+ {
+ this.graphSampleCount[0] = sampleCount0;
+ this.graphSampleCount[1] = sampleCount1;
+ this.graphSampleCount[2] = sampleCount2;
+ }
+
+ public float getPercentLoad(int graphIndex)
+ {
+ return this.graphPercentLoad[graphIndex];
+ }
+
+ public void setLoadAndString(int graphIndex, float percentLoad)
+ {
+ this.graphPercentLoad[graphIndex] = percentLoad;
+
+ // doesn't hurt to set the string here, too.
+ // you may not need to set the string when you set the float
+ if (percentLoad >= 0.005f)
+ this.averageLoadValueString[graphIndex] = (new DecimalFormat(Messages.getString("ProfiledGeneric.decimalFormat"))).format(percentLoad); //$NON-NLS-1$
+ else
+ this.averageLoadValueString[graphIndex] = Messages.getString("ProfiledGeneric.zeroFormat"); //$NON-NLS-1$
+ }
+
+ public void setPercentLoads(float percentLoad0, float percentLoad1, float percentLoad2)
+ {
+ this.graphPercentLoad[0] = percentLoad0;
+ this.graphPercentLoad[1] = percentLoad1;
+ this.graphPercentLoad[2] = percentLoad2;
+
+ // doesn't hurt to set the strings here, too
+ // you may not need to set the strings when you set the float
+ if (percentLoad0 >= 0.005f)
+ this.averageLoadValueString[0] = (new DecimalFormat(Messages.getString("ProfiledGeneric.decimalFormat"))).format(percentLoad0); //$NON-NLS-1$
+ else
+ this.averageLoadValueString[0] = Messages.getString("ProfiledGeneric.zeroFormat"); //$NON-NLS-1$
+ if (percentLoad1 >= 0.005f)
+ this.averageLoadValueString[1] = (new DecimalFormat(Messages.getString("ProfiledGeneric.decimalFormat"))).format(percentLoad1); //$NON-NLS-1$
+ else
+ this.averageLoadValueString[1] = Messages.getString("ProfiledGeneric.zeroFormat"); //$NON-NLS-1$
+ if (percentLoad2 >= 0.005f)
+ this.averageLoadValueString[2] = (new DecimalFormat(Messages.getString("ProfiledGeneric.decimalFormat"))).format(percentLoad2); //$NON-NLS-1$
+ else
+ this.averageLoadValueString[2] = Messages.getString("ProfiledGeneric.zeroFormat"); //$NON-NLS-1$
+ }
+}