diff -r 5b9d4d8641ce -r ae255c9aa552 sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi.graphicsmemory/src/com/nokia/carbide/cpp/pi/graphicsmemory/GraphicsMemoryPlugin.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi.graphicsmemory/src/com/nokia/carbide/cpp/pi/graphicsmemory/GraphicsMemoryPlugin.java Wed Jun 23 15:05:09 2010 +0300 @@ -0,0 +1,562 @@ +/* + * Copyright (c) 2010 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.pi.graphicsmemory; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Hashtable; + +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.action.Separator; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.osgi.framework.BundleContext; + +import com.nokia.carbide.cpp.internal.pi.analyser.NpiInstanceRepository; +import com.nokia.carbide.cpp.internal.pi.analyser.ProfileReader; +import com.nokia.carbide.cpp.internal.pi.analyser.ProfileVisualiser; +import com.nokia.carbide.cpp.internal.pi.model.GenericTrace; +import com.nokia.carbide.cpp.internal.pi.model.ParsedTraceData; +import com.nokia.carbide.cpp.internal.pi.plugin.model.AbstractPiPlugin; +import com.nokia.carbide.cpp.internal.pi.plugin.model.IClassReplacer; +import com.nokia.carbide.cpp.internal.pi.plugin.model.IEventListener; +import com.nokia.carbide.cpp.internal.pi.plugin.model.IReportable; +import com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace; +import com.nokia.carbide.cpp.internal.pi.plugin.model.IViewMenu; +import com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable; +import com.nokia.carbide.cpp.internal.pi.visual.GenericTraceGraph; +import com.nokia.carbide.cpp.internal.pi.visual.GraphDrawRequest; +import com.nokia.carbide.cpp.internal.pi.visual.PIEvent; +import com.nokia.carbide.cpp.pi.editors.PIPageEditor; + +/** + * The main plugin class to be used in the desktop. + */ +public class GraphicsMemoryPlugin extends AbstractPiPlugin implements + IViewMenu, ITrace, IClassReplacer, IVisualizable, IEventListener, + IReportable { + private static final String HELP_CONTEXT_ID = PIPageEditor.PI_ID + + ".graphicsmemory"; //$NON-NLS-1$ + public static final String HELP_CONTEXT_ID_MAIN_PAGE = HELP_CONTEXT_ID + + ".graphicsMemoryPageContext"; //$NON-NLS-1$ + + public static final String PLUGIN_ID = "com.nokia.carbide.cpp.pi.graphicsmemory"; //$NON-NLS-1$ + + // There will be 1 graph for editor page 0 + // This code may assume that page 0 has the threads graph + private final static int GRAPH_COUNT = 3; + + // The shared instance. + private static GraphicsMemoryPlugin plugin; + + private static void setPlugin(GraphicsMemoryPlugin newPlugin) { + plugin = newPlugin; + } + + /** + * The constructor. + */ + public GraphicsMemoryPlugin() { + super(); + setPlugin(this); + } + + /** + * This method is called upon plug-in activation + */ + public void start(BundleContext context) throws Exception { + super.start(context); + } + + /** + * This method is called when the plug-in is stopped + */ + public void stop(BundleContext context) throws Exception { + super.stop(context); + setPlugin(null); + } + + /** + * Returns the shared instance. + */ + public static GraphicsMemoryPlugin getDefault() { + return plugin; + } + + /** + * Update menu items + */ + public void updateMenuItems() { + int uid = NpiInstanceRepository.getInstance().activeUid(); + ProfileReader.getInstance().setTraceMenus( + NpiInstanceRepository.getInstance().getPlugins(uid), uid); + } + + /** + * Returns an image descriptor for the image file at the given plug-in + * relative path. + * + * @param path + * the path + * @return the image descriptor + */ + public static ImageDescriptor getImageDescriptor(String path) { + return AbstractPiPlugin.imageDescriptorFromPlugin( + GraphicsMemoryPlugin.PLUGIN_ID, path); //$NON-NLS-1$ + } + + @SuppressWarnings("unchecked") + public Class getTraceClass() { + return GraphicsMemoryTrace.class; + } + + @SuppressWarnings("unchecked") + public Class getReplacedClass(String className) { + if (className.indexOf(GraphicsMemoryPlugin.PLUGIN_ID + + ".GraphicsMemoryTrace") != -1)//$NON-NLS-1$ + { + return GraphicsMemoryTrace.class; + } else if (className.indexOf(GraphicsMemoryPlugin.PLUGIN_ID + + ".GraphicsMemorySample") != -1)//$NON-NLS-1$ + { + return GraphicsMemorySample.class; + } else if (className + .indexOf("[L" + GraphicsMemoryPlugin.PLUGIN_ID + ".GraphicsMemoryProcess") != -1)//$NON-NLS-1$ //$NON-NLS-2$ + { + return GraphicsMemoryProcess[].class; + } else if (className.indexOf(GraphicsMemoryPlugin.PLUGIN_ID + + ".GraphicsMemoryProcess") != -1)//$NON-NLS-1$ + { + return GraphicsMemoryProcess.class; + } else + return null; + } + + public void initialiseTrace(GenericTrace trace) { + if (!(trace instanceof GraphicsMemoryTrace)) + return; + + GraphicsMemoryTrace memTrace = (GraphicsMemoryTrace) trace; + + NpiInstanceRepository.getInstance().activeUidAddTrace( + GraphicsMemoryPlugin.PLUGIN_ID, trace); //$NON-NLS-1$ + + memTrace.gatherDrawData(); + + System.out.println(Messages + .getString("GraphicsMemoryPlugin.traceProcessed")); //$NON-NLS-1$ + } + + public String getTraceName() { + return "GraphicsMemory"; //$NON-NLS-1$ + } + + /* + * (non-Javadoc) + * + * @see + * com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#getTraceTitle() + */ + public String getTraceTitle() { + return Messages.getString("GraphicsMemoryPlugin.1"); //$NON-NLS-1$ + } + + public int getTraceId() { + return 14; + } + + /* + * (non-Javadoc) + * + * @see + * com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#parseTraceFiles + * (java.io.File[]) + */ + public ParsedTraceData parseTraceFiles(File[] files) throws Exception { + throw new UnsupportedOperationException(); + } + + public ParsedTraceData parseTraceFile(File file) throws Exception { + ParsedTraceData traceData = null; + try { + GraphicsMemoryTraceParser memParser = new GraphicsMemoryTraceParser(); + traceData = memParser.parse(file); + return traceData; + } catch (IOException e) { + e.printStackTrace(); + throw e; + } + } + + public MenuManager getViewOptionManager() { + if (NpiInstanceRepository.getInstance().activeUidGetTrace( + GraphicsMemoryPlugin.PLUGIN_ID) == null) //$NON-NLS-1$ + return null; // no trace, so no MenuManager + + boolean showPrivate = true; + boolean showShared = true; + + // if there is a showPrivate value associated with the current Analyser + // tab, then use it + Object obj; + obj = NpiInstanceRepository.getInstance().activeUidGetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showPrivate"); //$NON-NLS-1$ + if ((obj != null) && (obj instanceof Boolean)) + // retrieve the current value + showPrivate = (Boolean) obj; + else + // set the initial value + NpiInstanceRepository + .getInstance() + .activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showPrivate", showPrivate); //$NON-NLS-1$ + + // if there is a showShared value associated with the current + // Analyser tab, then use it + obj = NpiInstanceRepository.getInstance().activeUidGetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showShared"); //$NON-NLS-1$ + if ((obj != null) && (obj instanceof Boolean)) + // retrieve the current value + showShared = (Boolean) obj; + else + // set the initial value + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showShared", showShared); //$NON-NLS-1$ + + Action action; + + MenuManager manager = new MenuManager(Messages + .getString("GraphicsMemoryPlugin.graphicsMemoryGraph")); //$NON-NLS-1$ + + action = new Action( + Messages.getString("GraphicsMemoryPlugin.memoryStats"), Action.AS_PUSH_BUTTON) { //$NON-NLS-1$ + public void run() { + new GraphicsMemoryStatisticsDialog(Display.getCurrent()); + } + }; + + action.setToolTipText(Messages + .getString("GraphicsMemoryPlugin.memoryStatsTooltip")); //$NON-NLS-1$ + manager.add(action); + + manager.add(new Separator()); + + action = new Action( + Messages.getString("GraphicsMemoryPlugin.showPrivate"), Action.AS_RADIO_BUTTON) { //$NON-NLS-1$ + public void run() { + if (this.isChecked()) + receiveSelectionEvent("private_on"); //$NON-NLS-1$ + } + }; + action.setChecked(showPrivate && !showShared); + action.setToolTipText(Messages + .getString("GraphicsMemoryPlugin.showPrivateTooltip")); //$NON-NLS-1$ + manager.add(action); + + action = new Action( + Messages.getString("GraphicsMemoryPlugin.showShared"), Action.AS_RADIO_BUTTON) { //$NON-NLS-1$ + public void run() { + if (this.isChecked()) + receiveSelectionEvent("shared_on"); //$NON-NLS-1$ + } + }; + action.setChecked(showShared && !showPrivate); + action.setToolTipText(Messages + .getString("GraphicsMemoryPlugin.showSharedTooltip")); //$NON-NLS-1$ + manager.add(action); + + action = new Action( + Messages.getString("GraphicsMemoryPlugin.showAll"), Action.AS_RADIO_BUTTON) { //$NON-NLS-1$ + public void run() { + if (this.isChecked()) + receiveSelectionEvent("private_shared_on"); //$NON-NLS-1$ + } + }; + action.setChecked(showPrivate && showShared); + action.setToolTipText(Messages + .getString("GraphicsMemoryPlugin.showAllTooltip")); //$NON-NLS-1$ + manager.add(action); + + manager.add(new Separator()); + + boolean rescale = false; + + // if there is a rescale value associated with the current Analyser tab, + // then use it + obj = NpiInstanceRepository.getInstance().activeUidGetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".rescale"); //$NON-NLS-1$ + if ((obj != null) && (obj instanceof Boolean)) + // retrieve the current value + rescale = (Boolean) obj; + else + // set the initial value + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".rescale", rescale); //$NON-NLS-1$ + + action = new Action( + Messages.getString("GraphicsMemoryPlugin.dynamicRescale"), Action.AS_CHECK_BOX) { //$NON-NLS-1$ + public void run() { + if (this.isChecked()) + receiveSelectionEvent("rescale_on"); //$NON-NLS-1$ + else + receiveSelectionEvent("rescale_off"); //$NON-NLS-1$ + } + }; + action.setChecked(rescale); + action.setToolTipText(Messages + .getString("GraphicsMemoryPlugin.dynamicRescaleTooltip")); //$NON-NLS-1$ + manager.add(action); + + boolean showMemoryUsageLine = true; + // if there is a show memory usage value associated with the current + // Analyser tab, then use it + obj = NpiInstanceRepository.getInstance().activeUidGetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showMemoryUsage"); //$NON-NLS-1$ + if ((obj != null) && (obj instanceof Boolean)) + // retrieve the current value + showMemoryUsageLine = (Boolean) obj; + else + // set the initial value + NpiInstanceRepository + .getInstance() + .activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showMemoryUsage", showMemoryUsageLine); //$NON-NLS-1$ + + action = new Action( + Messages + .getString("GraphicsMemoryTraceGraph.showTotalMemoryUsage"), Action.AS_CHECK_BOX) { //$NON-NLS-1$ + public void run() { + if (this.isChecked()) + receiveSelectionEvent("memory_usage_line_on"); //$NON-NLS-1$ + else + receiveSelectionEvent("memory_usage_line_off"); //$NON-NLS-1$ + } + }; + action.setChecked(showMemoryUsageLine); + action.setToolTipText(Messages + .getString("GraphicsMemoryPlugin.showTotalMemoryUsageToolTip")); //$NON-NLS-1$ + manager.add(action); + + return manager; + } + + public void receiveEvent(String actionString, Event event) { + GraphicsMemoryTrace trace = (GraphicsMemoryTrace) NpiInstanceRepository + .getInstance() + .activeUidGetTrace(GraphicsMemoryPlugin.PLUGIN_ID); //$NON-NLS-1$ + + if (trace == null) + return; + + if (actionString.equals("private_on") //$NON-NLS-1$ + || actionString.equals("shared_on") //$NON-NLS-1$ + || actionString.equals("private_shared_on") //$NON-NLS-1$ + || actionString.equals("rescale_on") //$NON-NLS-1$ + || actionString.equals("rescale_off")) //$NON-NLS-1$ + { + ((GraphicsMemoryTraceGraph) trace + .getTraceGraph(PIPageEditor.THREADS_PAGE)) + .action(actionString); + ((GraphicsMemoryTraceGraph) trace + .getTraceGraph(PIPageEditor.BINARIES_PAGE)) + .action(actionString); + ((GraphicsMemoryTraceGraph) trace + .getTraceGraph(PIPageEditor.FUNCTIONS_PAGE)) + .action(actionString); + } else if (actionString.equals("scroll")) //$NON-NLS-1$ + { + PIEvent be = new PIEvent(event, PIEvent.SCROLLED); + + ((GraphicsMemoryTraceGraph) trace + .getTraceGraph(PIPageEditor.THREADS_PAGE)) + .piEventReceived(be); + ((GraphicsMemoryTraceGraph) trace + .getTraceGraph(PIPageEditor.BINARIES_PAGE)) + .piEventReceived(be); + ((GraphicsMemoryTraceGraph) trace + .getTraceGraph(PIPageEditor.FUNCTIONS_PAGE)) + .piEventReceived(be); + } + } + + public void receiveSelectionEvent(String actionString) { + if (actionString == null) + return; + + if (actionString.equals("private_on")) { //$NON-NLS-1$ + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showPrivate", true); //$NON-NLS-1$ + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showShared", false); //$NON-NLS-1$ + } else if (actionString.equals("shared_on")) { //$NON-NLS-1$ + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showPrivate", false); //$NON-NLS-1$ + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showShared", true); //$NON-NLS-1$ + } else if (actionString.equals("private_shared_on")) { //$NON-NLS-1$ + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showPrivate", true); //$NON-NLS-1$ + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showShared", true); //$NON-NLS-1$ + } else if (actionString.equals("rescale_on")) { //$NON-NLS-1$ + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".rescale", true); //$NON-NLS-1$ + } else if (actionString.equals("rescale_off")) { //$NON-NLS-1$ + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".rescale", false); //$NON-NLS-1$ + } else if (actionString.equals("memory_usage_line_on")) { //$NON-NLS-1$ + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showMemoryUsage", true); //$NON-NLS-1$ + } else if (actionString.equals("memory_usage_line_off")) { //$NON-NLS-1$ + NpiInstanceRepository.getInstance().activeUidSetPersistState( + GraphicsMemoryPlugin.PLUGIN_ID + ".showMemoryUsage", false); //$NON-NLS-1$ + } else { + return; + } + + ((GraphicsMemoryTraceGraph) this + .getTraceGraph(PIPageEditor.THREADS_PAGE)).action(actionString); + ((GraphicsMemoryTraceGraph) this + .getTraceGraph(PIPageEditor.BINARIES_PAGE)) + .action(actionString); + ((GraphicsMemoryTraceGraph) this + .getTraceGraph(PIPageEditor.FUNCTIONS_PAGE)) + .action(actionString); + } + + public GenericTraceGraph getTraceGraph(int graphIndex) { + GraphicsMemoryTrace trace = (GraphicsMemoryTrace) NpiInstanceRepository + .getInstance() + .activeUidGetTrace(GraphicsMemoryPlugin.PLUGIN_ID); //$NON-NLS-1$ + + if (trace != null) + return trace.getTraceGraph(graphIndex); + else + return null; + } + + public Integer getLastSample(int graphIndex) { + GraphicsMemoryTrace trace = (GraphicsMemoryTrace) NpiInstanceRepository + .getInstance() + .activeUidGetTrace(GraphicsMemoryPlugin.PLUGIN_ID); //$NON-NLS-1$ + + if (trace != null) + return Integer.valueOf(trace.getLastSampleNumber()); + else + return null; + } + + public Hashtable getSummaryTable(double start, double end) { + return null; + } + + public String getGeneralInfo() { + return null; + } + + public ArrayList getColumnNames() { + ArrayList names = new ArrayList(); + names.add(Messages.getString("GraphicsMemoryPlugin.namesProcess")); //$NON-NLS-1$ + names.add(Messages.getString("GraphicsMemoryPlugin.namesAvgPrivate")); //$NON-NLS-1$ + names.add(Messages.getString("GraphicsMemoryPlugin.namesAvgShared")); //$NON-NLS-1$ + names.add(Messages.getString("GraphicsMemoryPlugin.namesTotal")); //$NON-NLS-1$ + return names; + } + + public ArrayList getColumnSortTypes() { + ArrayList sortTypes = new ArrayList(); + sortTypes.add(SORT_BY_NAME); + sortTypes.add(SORT_BY_NUMBER); + sortTypes.add(SORT_BY_NUMBER); + sortTypes.add(SORT_BY_NUMBER); + return sortTypes; + } + + public String getActiveInfo(Object arg0, double startTime, double endTime) { + return null; + } + + public MenuManager getReportGeneratorManager() { + return null; + } + + public GraphDrawRequest getDrawRequest(int graphIndex) { + return null; + } + + public int getGraphCount() { + return GRAPH_COUNT; + } + + public int getPageNumber(int graphIndex) { + // Assumes page 0 has the threads graph, 1 has the binaries, and 2 has + // the functions + if (graphIndex == 0) + return PIPageEditor.THREADS_PAGE; + else if (graphIndex == 1) + return PIPageEditor.BINARIES_PAGE; + else if (graphIndex == 2) + return PIPageEditor.FUNCTIONS_PAGE; + + return PIPageEditor.NEXT_AVAILABLE_PAGE; + } + + // return whether this plugin's editor pages have been created + public boolean arePagesCreated() { + return false; + } + + public void setPagesCreated(boolean pagesCreated) { + return; + } + + public int getCreatePageCount() { + return 0; + } + + public int getCreatePageIndex(int index) { + return 0; + } + + public ProfileVisualiser createPage(int index) { + return null; + } + + public void setPageIndex(int index, int pageIndex) { + return; + } + + /* + * (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#isMandatory() + */ + public boolean isMandatory() { + return false; + } + + /* + * (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#getTraceDescription() + */ + public String getTraceDescription() { + return getTraceTitle(); + } +}