/*******************************************************************************
* Copyright (c) 2004, 2008, 2009 Red Hat, Inc.
* (C) Copyright 2010 IBM Corp. 2010
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Keith Seitz <keiths@redhat.com> - initial API and implementation
* Kent Sebastian <ksebasti@redhat.com>
* Thavidu Ranatunga (IBM) - Derived and modified code from
* org.eclipse.linuxtools.oprofile.core.OprofileCorePlugin
*******************************************************************************/
package org.eclipse.linuxtools.internal.perf;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URI;
import java.util.List;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.linuxtools.internal.perf.model.TreeParent;
import org.eclipse.linuxtools.profiling.launch.IRemoteFileProxy;
import org.eclipse.linuxtools.profiling.launch.RemoteProxyManager;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
/**
* The activator class controls the plug-in life cycle
*/
public class PerfPlugin extends AbstractUIPlugin {
// The plug-in ID
public static final String PLUGIN_ID = "org.eclipse.linuxtools.perf"; //$NON-NLS-1$
// View ID
public static final String VIEW_ID = "org.eclipse.linuxtools.perf.ui.ProfileView"; //$NON-NLS-1$
public static final String SOURCE_DISASSEMBLY_VIEW_ID = "org.eclipse.linuxtools.perf.ui.SourceDisassemblyView"; //$NON-NLS-1$
public static final String STAT_VIEW_ID = "org.eclipse.linuxtools.perf.ui.StatView"; //$NON-NLS-1$
public static final String STAT_DIFF_VIEW_ID = "org.eclipse.linuxtools.perf.ui.StatViewDiff"; //$NON-NLS-1$
public static final String REPORT_DIFF_VIEW_ID = "org.eclipse.linuxtools.perf.ui.ReportViewDiff"; //$NON-NLS-1$
// Launch Config ID
public static final String LAUNCHCONF_ID = "org.eclipse.linuxtools.perf.launch.profile"; //$NON-NLS-1$
//Perf Options tab attribs.
public static final String ATTR_Kernel_Location = "org.eclipse.linuxtools.internal.perf.attr.Kernel.Location"; //$NON-NLS-1$
public static final String ATTR_Kernel_Location_default = ""; //$NON-NLS-1$
public static final String ATTR_Record_Realtime = "org.eclipse.linuxtools.internal.perf.attr.Record.Realtime"; //$NON-NLS-1$
public static final boolean ATTR_Record_Realtime_default = false;
public static final String ATTR_Record_Realtime_Priority = "org.eclipse.linuxtools.internal.perf.attr.Record.Realtime.Priority"; //$NON-NLS-1$
public static final int ATTR_Record_Realtime_Priority_default = 1;
public static final String ATTR_Record_Verbose = "org.eclipse.linuxtools.internal.perf.attr.Record.Verbose"; //$NON-NLS-1$
public static final boolean ATTR_Record_Verbose_default = false;
public static final String ATTR_SourceLineNumbers = "org.eclipse.linuxtools.internal.perf.attr.SourceLineNumbers"; //$NON-NLS-1$
public static final boolean ATTR_SourceLineNumbers_default = true;
public static final String ATTR_Kernel_SourceLineNumbers = "org.eclipse.linuxtools.internal.perf.attr.Kernel.SourceLineNumbers"; //$NON-NLS-1$
public static final boolean ATTR_Kernel_SourceLineNumbers_default = false;
public static final String ATTR_Multiplex = "org.eclipse.linuxtools.internal.perf.attr.Multiplex"; //$NON-NLS-1$
public static final boolean ATTR_Multiplex_default = false;
public static final String ATTR_ModuleSymbols = "org.eclipse.linuxtools.internal.perf.attr.ModuleSymbols"; //$NON-NLS-1$
public static final boolean ATTR_ModuleSymbols_default = false;
public static final String ATTR_HideUnresolvedSymbols = "org.eclipse.linuxtools.internal.perf.attr.HideUnresolvedSymbols"; //$NON-NLS-1$
public static final boolean ATTR_HideUnresolvedSymbols_default = true;
public static final String ATTR_ShowSourceDisassembly = "org.eclipse.linuxtools.internal.perf.attr.ShowSourceDisassembly"; //$NON-NLS-1$
public static final boolean ATTR_ShowSourceDisassembly_default = false;
public static final String ATTR_ShowStat = "org.eclipse.linuxtools.internal.perf.attr.ShowStat"; //$NON-NLS-1$
public static final boolean ATTR_ShowStat_default = false;
public static final String ATTR_StatRunCount = "org.eclipse.linuxtools.internal.perf.attr.StatRunCount"; //$NON-NLS-1$
public static final int ATTR_StatRunCount_default = 1;
//Perf Events tab attribs.
public static final String ATTR_DefaultEvent = "org.eclipse.linuxtools.internal.perf.attr.DefaultEvent"; //$NON-NLS-1$
public static final boolean ATTR_DefaultEvent_default = true;
public static final String ATTR_MultipleEvents = "org.eclipse.linuxtools.internal.perf.attr.MultipleEvents"; //$NON-NLS-1$
public static final boolean ATTR_MultipleEvents_default = false;
public static final String ATTR_SelectedEvents = "org.eclipse.linuxtools.internal.perf.attr.SelectedEvents"; //$NON-NLS-1$
public static final List<String> ATTR_SelectedEvents_default = null;
public static final String ATTR_RawHwEvents = "org.eclipse.linuxtools.internal.perf.attr.RawHwEvents"; //$NON-NLS-1$
public static final List<String> ATTR_RawHwEvents_default = null;
public static final String ATTR_HwBreakpointEvents = "org.eclipse.linuxtools.internal.perf.attr.HwBreakpointEvents"; //$NON-NLS-1$
public static final List<String> ATTR_HwBreakpointEvents_default = null;
//Strings
public static final String STRINGS_Kernel_Location = "Location of kernel image file (optional): "; //$NON-NLS-1$
public static final String STRINGS_Record_Realtime = "Record with realtime priority (RT SCHED_FIFO)"; //$NON-NLS-1$
public static final String STRINGS_Record_Verbose = "Record with verbose output"; //$NON-NLS-1$
public static final String STRINGS_ModuleSymbols = "Load Module Symbols"; //$NON-NLS-1$
public static final String STRINGS_HideUnresolvedSymbols = "Hide Unresolved Symbols"; //$NON-NLS-1$
public static final String STRINGS_SourceLineNumbers = "Obtain source line numbers from profile data"; //$NON-NLS-1$
public static final String STRINGS_Kernel_SourceLineNumbers = "Obtain kernel source line numbers from profile data (Warning: May be very slow)"; //$NON-NLS-1$
public static final String STRINGS_Multiplex = "Multiplex counter output in a single channel"; //$NON-NLS-1$
public static final String STRINGS_RAWHWEvents = "Raw hardware event descriptor"; //$NON-NLS-1$
public static final String STRINGS_HWBREAKPOINTS = "Hardware breakpoint"; //$NON-NLS-1$
public static final String STRINGS_UnfiledSymbols = "Unfiled Symbols"; //$NON-NLS-1$
public static final String STRINGS_MultipleFilesForSymbol = "Symbols conflicting in multiple files"; //$NON-NLS-1$
public static final String STRINGS_ShowSourceDisassembly = "Show Source Disassembly View"; //$NON-NLS-1$
public static final String STRINGS_ShowStat = "Show Stat View"; //$NON-NLS-1$
public static final String STRINGS_SearchSourceDisassembly = "Search Source Disassembly"; //$NON-NLS-1$
public static final String PERF_COMMAND = "perf"; //$NON-NLS-1$
public static final String PERF_DEFAULT_DATA = "perf.data"; //$NON-NLS-1$
public static final String PERF_DEFAULT_STAT= "perf.stat"; //$NON-NLS-1$
public static final String PERF_DEAFULT_OLD_STAT = "perf.old.stat"; //$NON-NLS-1$
public static final boolean DEBUG_ON = false; //Spew debug messages or not.
// The shared instance
private static PerfPlugin plugin;
// Model Root
private TreeParent _modelRoot;
// Source Disassembly Data
private IPerfData sourceDisassemblyData;
// Stat Data
private IPerfData statData;
// Current profile data
private IPath curProfileData;
// Current working directory
private IPath curWorkingDir;
// The last profiled project
private IProject profiledProject;
public TreeParent getModelRoot() {
return _modelRoot;
}
public IPerfData getSourceDisassemblyData () {
return sourceDisassemblyData;
}
public IPerfData getStatData () {
return statData;
}
public IPath getPerfProfileData() {
return curProfileData;
}
public IPath getWorkingDir(){
return curWorkingDir;
}
/**
* Get the working directory.
* @return the URI of the working directory or null.
*/
public URI getWorkingDirURI() {
try {
IRemoteFileProxy fileProxy = RemoteProxyManager.getInstance().getFileProxy(getProfiledProject());
IPath wd = getWorkingDir();
if(wd == null || fileProxy == null) {
return null;
}
IFileStore fs = fileProxy.getResource(wd.toOSString());
return fs.toURI();
} catch (CoreException e) {
return null;
}
}
/**
* Get perf file with specified name under the current profiled project.
*
* @param fileName file name.
* @return File corresponding to given file or null if no working directory
* has been set.
*/
public IPath getPerfFile(String fileName) {
if (curWorkingDir != null) {
return curWorkingDir.append(fileName);
}
return null;
}
/**
* Return cleared model root.
* @return TreeParent cleared model root.
*/
public TreeParent clearModelRoot(){
if (_modelRoot == null) {
_modelRoot = new TreeParent(""); //$NON-NLS-1$
} else {
_modelRoot.clear();
}
return _modelRoot;
}
public void setModelRoot(TreeParent rootnode) {
this._modelRoot = rootnode;
}
public void setSourceDisassemblyData (IPerfData sourceDisassemblyData) {
this.sourceDisassemblyData = sourceDisassemblyData;
}
public void setStatData (IPerfData statData) {
this.statData = statData;
}
public void setPerfProfileData(IPath perfProfileData) {
this.curProfileData = perfProfileData;
}
public void setWorkingDir(IPath workingDir){
curWorkingDir = workingDir;
}
/**
* The constructor
*/
public PerfPlugin() {
}
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
}
@Override
public void stop(BundleContext context) throws Exception {
plugin = null;
super.stop(context);
}
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static PerfPlugin getDefault() {
return plugin;
}
/**
* 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 imageDescriptorFromPlugin(PLUGIN_ID, path);
}
/**
* Log the given exception and display the message/reason in an error
* message box. (From org.eclipse.linuxtools.packagekit.ui.Activator)
*
* @param ex the given exception to display
* @since 2.0
*/
public void openError(Exception ex, final String title) {
StringWriter writer = new StringWriter();
ex.printStackTrace(new PrintWriter(writer));
final String message = ex.getMessage();
final String formattedMessage = PLUGIN_ID + " : " + message; //$NON-NLS-1$
final Status status = new Status(IStatus.ERROR, PLUGIN_ID, formattedMessage, new Throwable(writer.toString()));
getLog().log(status);
Display.getDefault().asyncExec(() -> ErrorDialog.openError(Display.getDefault().getActiveShell(),
title, message, status));
}
/**
* Get the project to be profiled
*
* @return project
*/
public IProject getProfiledProject() {
return profiledProject;
}
/**
* Set the project to be profiled
*
* @param project
*/
public void setProfiledProject(IProject project) {
profiledProject = project;
}
}