aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Medeiros Teixeira2011-10-13 15:27:20 (EDT)
committerOtavio Pontes2011-12-06 14:26:02 (EST)
commitcba9b8bec9ddc7834969f649c06d5cd675ae01d5 (patch)
tree68daaf82aea897c436c7b351f55a784172ad81b1
parent9b50633473865b6bf96f461f22b34a31e4f56fa8 (diff)
downloadorg.eclipse.linuxtools-cba9b8bec9ddc7834969f649c06d5cd675ae01d5.zip
org.eclipse.linuxtools-cba9b8bec9ddc7834969f649c06d5cd675ae01d5.tar.gz
org.eclipse.linuxtools-cba9b8bec9ddc7834969f649c06d5cd675ae01d5.tar.bz2
oprofile: Modifications to use the linuxtools' path set for the project.
If there's a Linuxtools path defined for the project being profiled, the plugin will try to run opcontrol as root. If it doesn't work, user will be prompted to add this opcontrol in the sudoers file with NOPASSWD. If no path is defined for the project, the plugin will try to use the opcontrol link/wrapper created by the install scripts.
-rw-r--r--oprofile/org.eclipse.linuxtools.oprofile.core/META-INF/MANIFEST.MF4
-rw-r--r--oprofile/org.eclipse.linuxtools.oprofile.core/op_error_key3
-rw-r--r--oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/Oprofile.java53
-rw-r--r--oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/daemon/OpInfo.java1
-rw-r--r--oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/linux/LinuxOpcontrolProvider.java50
-rw-r--r--oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/linux/OpxmlRunner.java7
-rw-r--r--oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/oprofile.properties1
-rw-r--r--oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/opxml/EventIdCache.java4
-rw-r--r--oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/opxml/info/InfoAdapter.java4
-rw-r--r--oprofile/org.eclipse.linuxtools.oprofile.launch/src/org/eclipse/linuxtools/oprofile/launch/launching/AbstractOprofileLaunchConfigurationDelegate.java17
-rw-r--r--oprofile/org.eclipse.linuxtools.oprofile.launch/src/org/eclipse/linuxtools/oprofile/launch/launching/OprofileLaunchConfigurationDelegate.java7
-rw-r--r--profiling/org.eclipse.linuxtools.tools.launch.core/src/org/eclipse/linuxtools/tools/launch/core/factory/RuntimeProcessFactory.java46
12 files changed, 169 insertions, 28 deletions
diff --git a/oprofile/org.eclipse.linuxtools.oprofile.core/META-INF/MANIFEST.MF b/oprofile/org.eclipse.linuxtools.oprofile.core/META-INF/MANIFEST.MF
index 17fa6d8..93d5af1 100644
--- a/oprofile/org.eclipse.linuxtools.oprofile.core/META-INF/MANIFEST.MF
+++ b/oprofile/org.eclipse.linuxtools.oprofile.core/META-INF/MANIFEST.MF
@@ -6,7 +6,8 @@ Bundle-Version: 0.3.1.qualifier
Bundle-Activator: org.eclipse.linuxtools.oprofile.core.OprofileCorePlugin
Bundle-Vendor: %bundleProvider
Require-Bundle: org.eclipse.core.runtime;bundle-version="3.4.0",
- org.eclipse.ui;bundle-version="3.4.0"
+ org.eclipse.ui;bundle-version="3.4.0",
+ org.eclipse.linuxtools.tools.launch.core;bundle-version="0.8.0"
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Bundle-ClassPath: oprofile-core.jar
Bundle-ActivationPolicy: lazy
@@ -21,3 +22,4 @@ Export-Package: org.eclipse.linuxtools.oprofile.core,
org.eclipse.linuxtools.oprofile.core.opxml.sessions
Bundle-Localization: plugin
Eclipse-BundleShape: dir
+Import-Package: org.eclipse.core.resources
diff --git a/oprofile/org.eclipse.linuxtools.oprofile.core/op_error_key b/oprofile/org.eclipse.linuxtools.oprofile.core/op_error_key
index b9946f6..fe62b76 100644
--- a/oprofile/org.eclipse.linuxtools.oprofile.core/op_error_key
+++ b/oprofile/org.eclipse.linuxtools.oprofile.core/op_error_key
@@ -1,2 +1,3 @@
nmi_watchdog=opcontrolNmiWatchdog
-distinct=opcontrolDistinct \ No newline at end of file
+distinct=opcontrolDistinct
+sudo=opcontrolSudo
diff --git a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/Oprofile.java b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/Oprofile.java
index 0feb64a..f87a368 100644
--- a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/Oprofile.java
+++ b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/Oprofile.java
@@ -16,12 +16,14 @@ import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
+import org.eclipse.core.resources.IProject;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.linuxtools.oprofile.core.daemon.OpEvent;
import org.eclipse.linuxtools.oprofile.core.daemon.OpInfo;
import org.eclipse.linuxtools.oprofile.core.model.OpModelEvent;
import org.eclipse.linuxtools.oprofile.core.model.OpModelImage;
import org.eclipse.linuxtools.oprofile.core.opxml.checkevent.CheckEventsProcessor;
+import org.eclipse.linuxtools.tools.launch.core.properties.LinuxtoolsPathProperty;
/**
@@ -38,9 +40,14 @@ public class Oprofile
// Oprofile information
private static OpInfo _info;
+ // Project that will be profiled.
+ public static IProject _currentProject;
+
// Make sure that oprofile is ready to go
static {
- initializeOprofileModule();
+ if(_currentProject != null){
+ initializeOprofileModule();
+ }
}
/**
@@ -60,7 +67,7 @@ public class Oprofile
if (!isKernelModuleLoaded()) {
OprofileCorePlugin.showErrorDialog("oprofileInit", null); //$NON-NLS-1$
// throw new ExceptionInInitializerError(OprofileProperties.getString("fatal.kernelModuleNotLoaded")); //$NON-NLS-1$
- } else {
+ } else {
_initializeOprofileCore();
}
}
@@ -88,13 +95,15 @@ public class Oprofile
}
}
-
- // Initializes static data for oprofile.
+
+ // Initializes static data for oprofile.
private static void _initializeOprofileCore () {
- _info = OpInfo.getInfo();
-
- if (_info == null) {
- throw new ExceptionInInitializerError(OprofileProperties.getString("fatal.opinfoNotParsed")); //$NON-NLS-1$
+ if (isKernelModuleLoaded()){
+ _info = OpInfo.getInfo();
+
+ if (_info == null) {
+ throw new ExceptionInInitializerError(OprofileProperties.getString("fatal.opinfoNotParsed")); //$NON-NLS-1$
+ }
}
}
@@ -228,4 +237,32 @@ public class Oprofile
return image;
}
+
+ // Reloads oprofile modules by calling 'opcontrol --deinit' and 'opcontrol --init'
+ public static void setCurrentProject(IProject project){
+
+ if(_currentProject == null){
+ _currentProject = project;
+ initializeOprofileModule();
+ } else {
+
+ String currentPath = LinuxtoolsPathProperty.getLinuxtoolsPath(_currentProject);
+ String newPath = LinuxtoolsPathProperty.getLinuxtoolsPath(project);
+
+ if(!currentPath.equals(newPath)){
+ try {
+ OprofileCorePlugin.getDefault().getOpcontrolProvider().deinitModule();
+ _currentProject = project;
+ OprofileCorePlugin.getDefault().getOpcontrolProvider().initModule();
+ } catch (OpcontrolException e) {
+ OprofileCorePlugin.showErrorDialog("opcontrolProvider", e); //$NON-NLS-1$
+ }
+ _currentProject = project;
+ }
+ }
+ }
+
+ public static IProject getCurrentProject(){
+ return _currentProject;
+ }
}
diff --git a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/daemon/OpInfo.java b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/daemon/OpInfo.java
index 573643e..18d68a0 100644
--- a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/daemon/OpInfo.java
+++ b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/daemon/OpInfo.java
@@ -17,6 +17,7 @@ import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
+import org.eclipse.core.resources.IProject;
import org.eclipse.linuxtools.oprofile.core.OprofileCorePlugin;
import org.eclipse.linuxtools.oprofile.core.OpxmlException;
import org.eclipse.linuxtools.oprofile.core.linux.LinuxOpxmlProvider.OpInfoRunner;
diff --git a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/linux/LinuxOpcontrolProvider.java b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/linux/LinuxOpcontrolProvider.java
index 2952127..0c72593 100644
--- a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/linux/LinuxOpcontrolProvider.java
+++ b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/linux/LinuxOpcontrolProvider.java
@@ -18,6 +18,7 @@ import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
+import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
@@ -28,14 +29,19 @@ import org.eclipse.linuxtools.oprofile.core.OprofileCorePlugin;
import org.eclipse.linuxtools.oprofile.core.daemon.OprofileDaemonEvent;
import org.eclipse.linuxtools.oprofile.core.daemon.OprofileDaemonOptions;
import org.eclipse.linuxtools.oprofile.core.opxml.sessions.SessionManager;
+import org.eclipse.linuxtools.tools.launch.core.factory.RuntimeProcessFactory;
+import org.eclipse.linuxtools.tools.launch.core.properties.LinuxtoolsPathProperty;
/**
* A class which encapsulates running opcontrol.
*/
public class LinuxOpcontrolProvider implements IOpcontrolProvider {
+ private static final String _OPCONTROL_EXECUTABLE = "opcontrol";
+
// Location of opcontrol security wrapper
- private static final String _OPCONTROL_REL_PATH = "natives/linux/scripts/opcontrol"; //$NON-NLS-1$
- private final String OPCONTROL_PROGRAM;
+ private static final String _OPCONTROL_REL_PATH = "natives/linux/scripts/" + _OPCONTROL_EXECUTABLE; //$NON-NLS-1$
+
+ private final String _OPCONTROL_PROGRAM;
// Initialize the Oprofile kernel module and oprofilefs
private static final String _OPD_INIT_MODULE = "--init"; //$NON-NLS-1$
@@ -104,9 +110,9 @@ public class LinuxOpcontrolProvider implements IOpcontrolProvider {
public LinuxOpcontrolProvider() throws OpcontrolException {
- OPCONTROL_PROGRAM = _findOpcontrol();
+ _OPCONTROL_PROGRAM = _findOpcontrol();
}
-
+
/**
* Unload the kernel module and oprofilefs
* @throws OpcontrolException
@@ -242,8 +248,18 @@ public class LinuxOpcontrolProvider implements IOpcontrolProvider {
* this appears to currently be the only way we can tell if user correctly
* entered the password
*/
- private boolean _runOpcontrol(ArrayList<String> args) throws OpcontrolException {
- args.add(0, OPCONTROL_PROGRAM);
+ private boolean _runOpcontrol(ArrayList<String> args) throws OpcontrolException {
+ IProject project = Oprofile.getCurrentProject();
+
+
+ // If no linuxtools' toolchain is defined for this project, use the path for the
+ // link created by the installation script
+ if(project == null || LinuxtoolsPathProperty.getLinuxtoolsPath(project).equals("")){
+ args.add(0, _OPCONTROL_PROGRAM);
+ } else{
+ args.add(0, _OPCONTROL_EXECUTABLE);
+ }
+
// Verbosity hack. If --start or --start-daemon, add verbosity, if set
String cmd = (String) args.get(1);
if (_verbosity.length() > 0 && (cmd.equals (_OPD_START_COLLECTION) || cmd.equals(_OPD_START_DAEMON))) {
@@ -260,7 +276,11 @@ public class LinuxOpcontrolProvider implements IOpcontrolProvider {
Process p = null;
try {
- p = Runtime.getRuntime().exec(cmdArray);
+ if(project == null || LinuxtoolsPathProperty.getLinuxtoolsPath(project).equals("")){
+ p = Runtime.getRuntime().exec(cmdArray);
+ } else{
+ p = RuntimeProcessFactory.getFactory().sudoExec(cmdArray, project);
+ }
} catch (IOException ioe) {
throw new OpcontrolException(OprofileCorePlugin.createErrorStatus("opcontrolRun", ioe)); //$NON-NLS-1$
}
@@ -319,18 +339,24 @@ public class LinuxOpcontrolProvider implements IOpcontrolProvider {
}
private static String _findOpcontrol() throws OpcontrolException {
- URL url = FileLocator.find(Platform.getBundle(OprofileCorePlugin.getId()), new Path(_OPCONTROL_REL_PATH), null);
+ IProject project = Oprofile.getCurrentProject();
+ URL url = FileLocator.find(Platform.getBundle(OprofileCorePlugin
+ .getId()), new Path(_OPCONTROL_REL_PATH), null);
if (url != null) {
try {
return FileLocator.toFileURL(url).getPath();
- } catch (IOException ignore) { }
- } else {
- throw new OpcontrolException(OprofileCorePlugin.createErrorStatus("opcontrolProvider", null)); //$NON-NLS-1$
+ } catch (IOException ignore) {
+ }
+ // If no linuxtools' toolchain is defined for this project and oprofile is not
+ // installed, throw exception
+ } else if(project == null || LinuxtoolsPathProperty.getLinuxtoolsPath(project).equals("")){
+ throw new OpcontrolException(OprofileCorePlugin.createErrorStatus(
+ "opcontrolProvider", null)); //$NON-NLS-1$
}
return null;
- }
+ }
// Convert the event into arguments for opcontrol
private void _eventToArguments(ArrayList<String> args, OprofileDaemonEvent event) {
diff --git a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/linux/OpxmlRunner.java b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/linux/OpxmlRunner.java
index b873d00..3f1848d 100644
--- a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/linux/OpxmlRunner.java
+++ b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/linux/OpxmlRunner.java
@@ -29,6 +29,7 @@ import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import org.eclipse.core.runtime.Status;
+import org.eclipse.linuxtools.oprofile.core.Oprofile;
import org.eclipse.linuxtools.oprofile.core.OprofileCorePlugin;
import org.eclipse.linuxtools.oprofile.core.OprofileProperties;
import org.eclipse.linuxtools.oprofile.core.OpxmlException;
@@ -39,6 +40,7 @@ import org.eclipse.linuxtools.oprofile.core.opxml.checkevent.CheckEventAdapter;
import org.eclipse.linuxtools.oprofile.core.opxml.info.InfoAdapter;
import org.eclipse.linuxtools.oprofile.core.opxml.modeldata.ModelDataAdapter;
import org.eclipse.linuxtools.oprofile.core.opxml.sessions.SessionManager;
+import org.eclipse.linuxtools.tools.launch.core.factory.RuntimeProcessFactory;
import org.eclipse.osgi.util.NLS;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -55,6 +57,7 @@ import org.xml.sax.XMLReader;
*/
public class OpxmlRunner {
private OprofileSAXHandler _handler;
+
/**
* Returns the current XMLProcessor handling parsing of opxml output.
@@ -189,7 +192,7 @@ public class OpxmlRunner {
cmd.add("event:" + args[1]); //$NON-NLS-1$
}
String [] a = {};
- p = Runtime.getRuntime().exec(cmd.toArray(a));
+ p = RuntimeProcessFactory.getFactory().exec(cmd.toArray(a), Oprofile.getCurrentProject());
StringBuilder output = new StringBuilder();
StringBuilder errorOutput = new StringBuilder();
@@ -273,8 +276,8 @@ public class OpxmlRunner {
String [] ret = null;
try {
String cmd[] = {"opreport", "-X", "-d"};
- Process p = Runtime.getRuntime().exec(cmd);
+ Process p = RuntimeProcessFactory.getFactory().exec(cmd, Oprofile.getCurrentProject());
StringBuilder output = new StringBuilder();
StringBuilder errorOutput = new StringBuilder();
String s = null;
diff --git a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/oprofile.properties b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/oprofile.properties
index b306dc3..bb2ab7d 100644
--- a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/oprofile.properties
+++ b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/oprofile.properties
@@ -25,6 +25,7 @@ opcontrolNonZeroExitCodeExtraInfo.error.statusMessage=Exit code of opcontrol ind
opcontrolNonZeroExitCode.error.statusMessage=Exit code of opcontrol indicates failure.\nIf this system does not have /usr/bin/consolehelper, make sure you have added\nthe following line to /etc/sudoers:\n<username> ALL=(ALL) NOPASSWD: <path to opcontrol, e.g. /usr/bin/opcontrol>
opcontrolNmiWatchdog.error.statusMessage=Error: counter 0 not available\nnmi_watchdog using this resource?\nTry:\nopcontrol --deinit\necho 0 > /proc/sys/kernel/nmi_watchdog\nin a Terminal. Then try profiling your binary again.
opcontrolDistinct.error.statusMessage= Error: All events must be distinct.
+opcontrolSudo.error.statusMessage=Error: could not execute opcontrol using sudo without password.\nMake sure you have added the following line to /etc/sudoers:\n<username> ALL=(ALL) NOPASSWD: <path to opcontrol defined for current project, e.g. /usr/bin/opcontrol>
opcontrolProvider.error.statusMessage=Could not find an OpcontrolProvider, or no opcontrol binary exists.\n\nPlease ensure you have run the install script as the root user. The install script will be in the org.eclipse.linuxtools.oprofile.core plugin, which may be located in one of a few places. You can locate it with the following command (type in a terminal):\n\nfind <~/.eclipse OR the location from which you're running eclipse> \ \n-name 'org.eclipse.linuxtools.oprofile.core_*'\n\nWhen you have found the location of the plugin, as root, run the install script contained therein:\n\ncd <path to org.eclipse.linuxtools.oprofile.core>/natives/linux/scripts\nsh install.sh\n\nYou may need to set the script as executable before running this command; do this with:\n\nchmod u+x install.sh
diff --git a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/opxml/EventIdCache.java b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/opxml/EventIdCache.java
index ed8b35f..cf9a832 100644
--- a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/opxml/EventIdCache.java
+++ b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/opxml/EventIdCache.java
@@ -11,7 +11,9 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.linuxtools.oprofile.core.Oprofile;
import org.eclipse.linuxtools.oprofile.core.opxml.info.InfoAdapter;
+import org.eclipse.linuxtools.tools.launch.core.factory.RuntimeProcessFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -76,7 +78,7 @@ public class EventIdCache {
*/
private void readXML() {
try {
- Process p = Runtime.getRuntime().exec(OPHELP + " " + "-X");
+ Process p = RuntimeProcessFactory.getFactory().exec(OPHELP + " " + "-X", Oprofile.getCurrentProject());
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
try {
diff --git a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/opxml/info/InfoAdapter.java b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/opxml/info/InfoAdapter.java
index d66a34a..de564d4 100644
--- a/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/opxml/info/InfoAdapter.java
+++ b/oprofile/org.eclipse.linuxtools.oprofile.core/src/org/eclipse/linuxtools/oprofile/core/opxml/info/InfoAdapter.java
@@ -12,8 +12,10 @@ import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
+import org.eclipse.linuxtools.oprofile.core.Oprofile;
import org.eclipse.linuxtools.oprofile.core.opxml.AbstractDataAdapter;
import org.eclipse.linuxtools.oprofile.core.opxml.EventIdCache;
+import org.eclipse.linuxtools.tools.launch.core.factory.RuntimeProcessFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -82,7 +84,7 @@ public class InfoAdapter extends AbstractDataAdapter{
// In timer mode, we have no relevant XML generated by ophelp
createDOM(null);
}else{
- Process p = Runtime.getRuntime().exec("ophelp -X");
+ Process p = RuntimeProcessFactory.getFactory().exec("ophelp -X", Oprofile.getCurrentProject());
InputStream is = p.getInputStream();
createDOM(is);
}
diff --git a/oprofile/org.eclipse.linuxtools.oprofile.launch/src/org/eclipse/linuxtools/oprofile/launch/launching/AbstractOprofileLaunchConfigurationDelegate.java b/oprofile/org.eclipse.linuxtools.oprofile.launch/src/org/eclipse/linuxtools/oprofile/launch/launching/AbstractOprofileLaunchConfigurationDelegate.java
index 27a19ee..4011b83 100644
--- a/oprofile/org.eclipse.linuxtools.oprofile.launch/src/org/eclipse/linuxtools/oprofile/launch/launching/AbstractOprofileLaunchConfigurationDelegate.java
+++ b/oprofile/org.eclipse.linuxtools.oprofile.launch/src/org/eclipse/linuxtools/oprofile/launch/launching/AbstractOprofileLaunchConfigurationDelegate.java
@@ -19,7 +19,9 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
+import org.eclipse.cdt.debug.core.CDebugUtils;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
+import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -40,8 +42,11 @@ import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
public abstract class AbstractOprofileLaunchConfigurationDelegate extends ProfileLaunchConfigurationDelegate {
+
+ protected ILaunchConfiguration config;
+
public void launch(ILaunchConfiguration config, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException {
-
+ this.config = config;
LaunchOptions options = new LaunchOptions(); //default options created in the constructor
options.loadConfiguration(config);
IPath exePath = verifyProgramPath( config );
@@ -148,4 +153,14 @@ public abstract class AbstractOprofileLaunchConfigurationDelegate extends Profil
protected boolean oprofileStatus() throws OpcontrolException {
return OprofileCorePlugin.getDefault().getOpcontrolProvider().status();
}
+
+ protected IProject getProject(){
+ try{
+ IProject project = CDebugUtils.verifyCProject(config).getProject();
+ return project;
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
}
diff --git a/oprofile/org.eclipse.linuxtools.oprofile.launch/src/org/eclipse/linuxtools/oprofile/launch/launching/OprofileLaunchConfigurationDelegate.java b/oprofile/org.eclipse.linuxtools.oprofile.launch/src/org/eclipse/linuxtools/oprofile/launch/launching/OprofileLaunchConfigurationDelegate.java
index d68f4eb..4c1915e 100644
--- a/oprofile/org.eclipse.linuxtools.oprofile.launch/src/org/eclipse/linuxtools/oprofile/launch/launching/OprofileLaunchConfigurationDelegate.java
+++ b/oprofile/org.eclipse.linuxtools.oprofile.launch/src/org/eclipse/linuxtools/oprofile/launch/launching/OprofileLaunchConfigurationDelegate.java
@@ -16,7 +16,10 @@ import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.ILaunchesListener2;
import org.eclipse.linuxtools.oprofile.core.OpcontrolException;
+import org.eclipse.linuxtools.oprofile.core.Oprofile;
import org.eclipse.linuxtools.oprofile.core.OprofileCorePlugin;
+import org.eclipse.linuxtools.oprofile.core.OprofileProperties;
+import org.eclipse.linuxtools.oprofile.core.daemon.OpInfo;
import org.eclipse.linuxtools.oprofile.core.daemon.OprofileDaemonEvent;
import org.eclipse.linuxtools.oprofile.launch.configuration.LaunchOptions;
import org.eclipse.swt.widgets.Display;
@@ -27,6 +30,10 @@ public class OprofileLaunchConfigurationDelegate extends AbstractOprofileLaunchC
protected boolean preExec(LaunchOptions options, OprofileDaemonEvent[] daemonEvents) {
//set up and launch the oprofile daemon
try {
+ // Set current project to allow using the oprofile path that
+ // was chosen for the project
+ Oprofile.setCurrentProject(getProject());
+
if (!oprofileStatus())
return false;
diff --git a/profiling/org.eclipse.linuxtools.tools.launch.core/src/org/eclipse/linuxtools/tools/launch/core/factory/RuntimeProcessFactory.java b/profiling/org.eclipse.linuxtools.tools.launch.core/src/org/eclipse/linuxtools/tools/launch/core/factory/RuntimeProcessFactory.java
index 9f28d71..b45d26b 100644
--- a/profiling/org.eclipse.linuxtools.tools.launch.core/src/org/eclipse/linuxtools/tools/launch/core/factory/RuntimeProcessFactory.java
+++ b/profiling/org.eclipse.linuxtools.tools.launch.core/src/org/eclipse/linuxtools/tools/launch/core/factory/RuntimeProcessFactory.java
@@ -13,8 +13,11 @@ package org.eclipse.linuxtools.tools.launch.core.factory;
import java.io.BufferedReader;
import java.io.File;
-import java.io.InputStreamReader;
import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.core.resources.IProject;
@@ -43,6 +46,11 @@ public class RuntimeProcessFactory extends LinuxtoolsProcessFactory {
cmdarray[0] = whichCommand(cmdarray[0], envp);
return cmdarray;
}
+
+ private String[] fillPathSudoCommand(String[] cmdarray, String[] envp) throws IOException {
+ cmdarray[2] = whichCommand(cmdarray[2], envp);
+ return cmdarray;
+ }
public String whichCommand(String command, IProject project) throws IOException {
return whichCommand(command, updateEnvironment(null, project));
@@ -98,4 +106,40 @@ public class RuntimeProcessFactory extends LinuxtoolsProcessFactory {
return Runtime.getRuntime().exec(cmdarray, envp, dir);
}
+
+ public Process sudoExec(String cmd, IProject project) throws IOException {
+ return sudoExec(cmd, null, null, project);
+ }
+
+ public Process sudoExec(String cmd, String[] envp, IProject project) throws IOException {
+ return exec(cmd, envp, null, project);
+ }
+
+ public Process sudoExec(String cmd, String[] envp, File dir, IProject project)
+ throws IOException {
+ return sudoExec(tokenizeCommand(cmd), envp, dir, project);
+ }
+
+ public Process sudoExec(String[] cmdarray, IProject project) throws IOException {
+ return sudoExec(cmdarray, null, project);
+ }
+
+ public Process sudoExec(String[] cmdarray, String[] envp, IProject project) throws IOException {
+ return sudoExec(cmdarray, envp, null, project);
+ }
+
+ public Process sudoExec(String[] cmdarray, String[] envp, File dir, IProject project) throws IOException {
+ List<String> cmdList = Arrays.asList(cmdarray);
+ ArrayList<String> cmdArrayList = new ArrayList<String>(cmdList);
+ cmdArrayList.add(0, "sudo");
+ cmdArrayList.add(1, "-n");
+
+ String[] cmdArraySudo = new String[cmdArrayList.size()];
+ cmdArrayList.toArray(cmdArraySudo);
+
+ envp = updateEnvironment(envp, project);
+ cmdArraySudo = fillPathSudoCommand(cmdArraySudo, envp);
+
+ return Runtime.getRuntime().exec(cmdArraySudo, envp, dir);
+ }
}