/*******************************************************************************
* Copyright (c) 2013 Red Hat Inc.
* 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:
* Red Hat Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.perf;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.filesystem.EFS;
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.jface.dialogs.MessageDialog;
import org.eclipse.linuxtools.internal.perf.handlers.PerfSaveStatsHandler;
import org.eclipse.linuxtools.profiling.launch.IRemoteFileProxy;
import org.eclipse.linuxtools.profiling.launch.RemoteProxyManager;
import org.eclipse.swt.widgets.Display;
/**
* This class handles the execution of the perf stat command
* and stores the resulting data.
*/
public class StatData extends AbstractDataManipulator {
private String prog;
private String [] args;
private int runCount;
private String [] events;
public StatData(String title, IPath workDir, String prog, String [] args, int runCount, String[] events, IProject project) {
super(title, workDir, project);
this.prog = prog;
this.args = args;
this.runCount = runCount;
this.events = events;
}
@Override
public void parse() {
String file;
try {
String prefix = PerfPlugin.PERF_DEFAULT_STAT.replace('.', '-');
file = Files.createTempFile(prefix, "").toString(); //$NON-NLS-1$
String [] cmd = getCommand(this.prog, this.args, file);
performCommand(cmd, file);
} catch (IOException e) {
}
}
protected String [] getCommand(String prog, String [] args, String file) {
List<String> ret = new ArrayList<>(Arrays.asList(
new String[] {"perf", "stat" })); //$NON-NLS-1$ //$NON-NLS-2$
if (runCount > 1) {
ret.add("-r"); //$NON-NLS-1$
ret.add(String.valueOf(runCount));
}
if (events != null) {
for (String event : events) {
ret.add("-e"); //$NON-NLS-1$
ret.add(event);
}
}
ret.add("-o"); //$NON-NLS-1$
ret.add(file);
ret.add(prog);
ret.addAll(Arrays.asList(args));
return ret.toArray(new String [0]);
}
protected String getProgram () {
return prog;
}
protected String [] getArguments () {
return args;
}
/**
* Save latest perf stat result under $workingDirectory/perf.stat. If file
* already exists rename it to perf.old.stat, in order to keep a reference
* to the previous session and be consistent with the way perf handles perf
* report data files.
*/
public void updateStatData() {
// build file name format
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(PerfPlugin.PERF_COMMAND);
stringBuilder.append("%s."); //$NON-NLS-1$
stringBuilder.append(PerfSaveStatsHandler.DATA_EXT);
String statNameFormat = stringBuilder.toString();
// get current stat file
IPath workingDir = getWorkDir();
String curStatName = String.format(statNameFormat, ""); //$NON-NLS-1$
IPath curStatPath = workingDir.append(curStatName);
IRemoteFileProxy proxy = null;
try {
proxy = RemoteProxyManager.getInstance().getFileProxy(project);
IFileStore curFileStore = proxy.getResource(curStatPath.toOSString());
if (curFileStore.fetchInfo().exists()) {
// get previous stat file
String oldStatName = String.format(statNameFormat, ".old"); //$NON-NLS-1$
IPath oldStatPath = workingDir.append(oldStatName);
IFileStore oldFileStore = proxy.getResource(oldStatPath.toOSString());
if (oldFileStore.fetchInfo().exists()) {
oldFileStore.delete(EFS.NONE, null);
}
curFileStore.copy(oldFileStore, EFS.NONE, null);
curFileStore.delete(EFS.NONE, null);
}
PerfSaveStatsHandler saveStats = new PerfSaveStatsHandler();
saveStats.saveData(PerfPlugin.PERF_COMMAND);
} catch (CoreException e) {
MessageDialog.openError(Display.getCurrent().getActiveShell(), Messages.MsgProxyError, Messages.MsgProxyError);
}
}
}