/******************************************************************************* * Copyright (c) 2009 STMicroelectronics. * 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: * Xavier Raynaud <xavier.raynaud@st.com> - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.internal.gprof.utils; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import org.eclipse.cdt.utils.spawner.ProcessFactory; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.linuxtools.internal.gprof.Messages; import org.eclipse.ui.PlatformUI; /** * Gives support to aggregate gmon files * * @author Xavier Raynaud <xavier.raynaud@st.com> */ public class Aggregator { /** * Aggregates the given gmon files in the given directory * * @param gprof2use * typically gprof, but can be something else (cross-development tools like sh4gprof, st200gprof, ...) * @param binaryFile * @param gmons * @param directory * @return the location of generated gmon.sum */ public static File aggregate(String gprof2use, String binaryFile, java.util.List<String> gmons, File directory) { String[] cmd = new String[gmons.size() + 3]; cmd[0] = gprof2use; cmd[1] = "-s"; //$NON-NLS-1$ cmd[2] = binaryFile; int i = 3; for (String string : gmons) { cmd[i++] = string; } String errorMessage = null; try { final Process p = ProcessFactory.getFactory().exec(cmd, null, directory); ProcessReader pr = new ProcessReader(p); pr.start(); int ret = p.waitFor(); if (ret != 0) { errorMessage = Messages.Aggregator_ERROR_COMMON_PREFIX; errorMessage += pr.errorMessage; } } catch (Exception e) { errorMessage = Messages.Aggregator_ERROR_COMMON_PREFIX; errorMessage += e.getMessage(); } File ret = new File(directory, "gmon.sum"); //$NON-NLS-1$ if (!ret.isFile() && errorMessage == null) { errorMessage = Messages.Aggregator_ERROR_COMMON_PREFIX; errorMessage += ret.getName(); errorMessage += Messages.Aggregator_NOT_FOUND; } if (errorMessage != null) { final String finalErrorMessage = errorMessage; PlatformUI.getWorkbench().getDisplay().asyncExec(() -> MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.Aggregator_GPROF_ERROR, finalErrorMessage)); return null; } return ret; } final static class ProcessReader extends Thread { private final Process p; private String errorMessage = ""; //$NON-NLS-1$ ProcessReader(Process p) { this.p = p; } @Override public void run() { try { LineNumberReader lnr = new LineNumberReader(new InputStreamReader(p.getErrorStream())); do { String s = lnr.readLine(); if (s == null) break; errorMessage += s + "\n"; //$NON-NLS-1$ } while (true); } catch (IOException e) { // do nothing } } } }