diff -r 615035072f7e -r 844b047e260d sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi.perfcounters/src/com/nokia/carbide/cpp/pi/perfcounters/PecPlugin.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysperfana/perfinvestigator/com.nokia.carbide.cpp.pi.perfcounters/src/com/nokia/carbide/cpp/pi/perfcounters/PecPlugin.java Wed Apr 21 15:14:16 2010 +0300 @@ -0,0 +1,319 @@ +package com.nokia.carbide.cpp.pi.perfcounters; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.swt.widgets.Event; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; + +import com.nokia.carbide.cpp.internal.pi.analyser.NpiInstanceRepository; +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.IEventListener; +import com.nokia.carbide.cpp.internal.pi.plugin.model.IFinalizeTrace; +import com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace; +import com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable; +import com.nokia.carbide.cpp.internal.pi.visual.GraphDrawRequest; +import com.nokia.carbide.cpp.pi.editors.PIPageEditor; +import com.nokia.carbide.cpp.pi.internal.perfcounters.PecGuiManager; +import com.nokia.carbide.cpp.pi.internal.perfcounters.PecSample; +import com.nokia.carbide.cpp.pi.internal.perfcounters.PecTrace; +import com.nokia.carbide.cpp.pi.internal.perfcounters.PecTraceParser; +import com.nokia.carbide.cpp.pi.visual.IGenericTraceGraph; +import com.nokia.carbide.cpp.internal.pi.plugin.model.IClassReplacer; +/** + * The activator class controls the plug-in life cycle + */ +public class PecPlugin extends AbstractPiPlugin implements ITrace, IEventListener, IVisualizable, IFinalizeTrace, IClassReplacer { + + /** number of graphs created (one on each page)*/ + public static final int GRAPH_COUNT = 3; + + /** The plug-in ID */ + public static final String PLUGIN_ID = "com.nokia.carbide.cpp.pi.perfcounters"; //$NON-NLS-1$ + + private static final String HELP_CONTEXT_ID = PIPageEditor.PI_ID + ".perfcounters"; //$NON-NLS-1$ + /** context help id of the main page */ + public static final String HELP_CONTEXT_ID_MAIN_PAGE = HELP_CONTEXT_ID + ".pecPageContext"; //$NON-NLS-1$ + + /** the trace id for PEC traces */ + private static final int PEC_TRACE_ID = 10; + + /** Persistable preference for the performance counter trace draw mode (show single graph or all graphs) */ + public static final String PECTRACE_DRAWMODE = "com.nokia.carbide.cpp.pi.perfcounters.drawmode";//$NON-NLS-1$ + /** draw mode for showing all graphs */ + public static final String PECTRACE_DRAWMODE_SHOW_ALL = "ShowAll";//$NON-NLS-1$ + + // The shared instance + private static PecPlugin plugin; + + private static final Map guiManagerMap = new HashMap(); + + /** + * The constructor + */ + public PecPlugin() { + super(); + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) + */ + @Override + public void start(BundleContext context) throws Exception { + super.start(context); + plugin = this; + } + + /* + * (non-Javadoc) + * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) + */ + @Override + public void stop(BundleContext context) throws Exception { + plugin = null; + super.stop(context); + } + + /** + * Returns the shared instance + * + * @return the shared instance + */ + public static PecPlugin getDefault() { + return plugin; + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#getTraceClass() + */ + public Class getTraceClass() { + return PecTrace.class; + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#initialiseTrace(com.nokia.carbide.cpp.internal.pi.model.GenericTrace) + */ + public void initialiseTrace(GenericTrace trace) { + if (!(trace instanceof PecTrace)){ + throw new IllegalArgumentException(); + } + + PecTrace parsedTrace = (PecTrace)trace; + + int samplingInterval = 1; //in milliseconds + if (parsedTrace.samples.size() > 2) { + samplingInterval = (int) ((parsedTrace.samples.get(1)).sampleSynchTime - (parsedTrace.samples.get(0)).sampleSynchTime); + } + parsedTrace.setSamplingInterval(samplingInterval); + + + NpiInstanceRepository.getInstance().activeUidAddTrace(PLUGIN_ID, trace); + + //create the GUI class which manages the graphs + int uid = NpiInstanceRepository.getInstance().activeUid(); + guiManagerMap.put(uid, new PecGuiManager(uid, parsedTrace, GRAPH_COUNT, Messages.PecPlugin_0)); + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#getTraceName() + */ + public String getTraceName() { + return "PEC"; //$NON-NLS-1$ + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#getTraceTitle() + */ + public String getTraceTitle() { + return Messages.PecPlugin_1; + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#getTraceId() + */ + public int getTraceId() { + return PEC_TRACE_ID; + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.ITrace#parseTraceFile(java.io.File) + */ + public ParsedTraceData parseTraceFile(File file) throws Exception { + PecTraceParser p = new PecTraceParser(true); + ParsedTraceData ptd = p.parse(file); + + return ptd; + } + + /* (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(); + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IEventListener#receiveEvent(java.lang.String, org.eclipse.swt.widgets.Event) + */ + public void receiveEvent(String action, Event event) { + //no-op + + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable#arePagesCreated() + */ + public boolean arePagesCreated() { + return false; //PEC traces add graphs to existing pages + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable#createPage(int) + */ + public ProfileVisualiser createPage(int index) { + return null; //PEC traces add graphs to existing pages + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable#getCreatePageCount() + */ + public int getCreatePageCount() { + return 0; //PEC traces don't create pages + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable#getCreatePageIndex(int) + */ + public int getCreatePageIndex(int index) { + throw new UnsupportedOperationException(); //PEC traces don't create pages + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable#getDrawRequest(int) + */ + public GraphDrawRequest getDrawRequest(int graphIndex) { + return null; + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable#getGraphCount() + */ + public int getGraphCount() { + return GRAPH_COUNT; + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable#getLastSample(int) + */ + public Integer getLastSample(int graphIndex) { + PecTrace trace = (PecTrace) NpiInstanceRepository.getInstance().activeUidGetTrace(PLUGIN_ID); + if(trace == null){ + return 0; + } + + return trace.getLastSampleNumber(); + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable#getPageNumber(int) + */ + public int getPageNumber(int graphIndex) { + 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; + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable#getTraceGraph(int) + */ + public IGenericTraceGraph getTraceGraph(int graphIndex) { + int uid = NpiInstanceRepository.getInstance().activeUid(); + PecGuiManager guiManager = guiManagerMap.get(uid); + + if (guiManager != null){ + return guiManager.getTraceGraph(graphIndex, HELP_CONTEXT_ID_MAIN_PAGE); + } + + throw new IllegalStateException(); + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable#setPageIndex(int, int) + */ + public void setPageIndex(int index, int pageIndex) { + //no-op + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IVisualizable#setPagesCreated(boolean) + */ + public void setPagesCreated(boolean pagesCreated) { + //no-op + } + + /** + * Returns a File corresponding to the given bundle relative path. + * @param path the bundle relative path to resource to locate + * @return the File corresponding to the given bundle relative path, or null + * @throws IOException + */ + public File locateFileInBundle(final String path) throws IOException { + Bundle myBundle= getDefault().getBundle(); + IPath ppath= new Path(path); + ppath= ppath.makeRelative(); + URL[] urls= FileLocator.findEntries(myBundle, ppath); + if(urls.length != 1) { + return null; + } + return new File(FileLocator.toFileURL(urls[0]).getFile()); + } + + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IFinalizeTrace#runOnDispose() + */ + public void runOnDispose() { + // called when editor closes + + // Do any cleanup work here when the editor closes + int uid = NpiInstanceRepository.getInstance().activeUid(); + guiManagerMap.remove(uid); + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IFinalizeTrace#runOnPartOpened() + */ + public void runOnPartOpened() { + //no-op + } + + /* (non-Javadoc) + * @see com.nokia.carbide.cpp.internal.pi.plugin.model.IClassReplacer#getReplacedClass(java.lang.String) + */ + public Class getReplacedClass(String className) { + if (className.startsWith("com.nokia.carbide.cpp.pi.internal.perfcounters.PecTrace")){ //$NON-NLS-1$ + return PecTrace.class; + } else if (className.startsWith("com.nokia.carbide.cpp.pi.internal.perfcounters.PecSample")){//$NON-NLS-1$ + return PecSample.class; + } + return null; + } + +}