package edu.uoregon.tau.paraprof; import jargs.gnu.CmdLineParser; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.swing.ToolTipManager; import edu.uoregon.tau.common.TauScripter; import edu.uoregon.tau.paraprof.interfaces.EclipseHandler; import edu.uoregon.tau.paraprof.script.ParaProfScript; import edu.uoregon.tau.paraprof.sourceview.SourceManager; import edu.uoregon.tau.perfdmf.*; /** * ParaProf This is the 'main' for paraprof * *

* CVS $Id: ParaProf.java,v 1.35 2009/11/09 21:34:30 wspear Exp $ *

* * @author Robert Bell, Alan Morris * @version $Revision: 1.35 $ */ public class ParaProf implements ActionListener { // This class handles uncaught throwables on the AWT-EventQueue thread static public class XThrowableHandler { public XThrowableHandler() {} public void handle(Throwable t) throws Throwable { if (t instanceof Exception) { ParaProfUtils.handleException((Exception) t); } else { System.err.println("Uncaught Throwable: " + t.fillInStackTrace()); } } } private final static String VERSION = "Mon Nov 9 13:33:15 PST 2009"; public static int defaultNumberPrecision = 6; public static File paraProfHomeDirectory; public static Preferences preferences = new Preferences(); public static ColorChooser colorChooser; public static ColorMap colorMap = new ColorMap(); public static ParaProfManagerWindow paraProfManagerWindow; public static ApplicationManager applicationManager = new ApplicationManager(); private static HelpWindow helpWindow; public static PreferencesWindow preferencesWindow; public static Runtime runtime; private static int numWindowsOpen = 0; private static int fileType = DataSource.TAUPROFILE; private static File sourceFiles[] = new File[0]; private static boolean fixNames = false; private static boolean monitorProfiles; private static String configFile; public static boolean demoMode; public static boolean usePathNameInTrial = false; public static FunctionBarChartWindow theComparisonWindow; public static boolean JNLP = false; public static List scripts = new ArrayList(); public static String scriptFile; public static boolean insideEclipse; public static EclipseHandler eclipseHandler; public static SourceManager directoryManager; public static String jarLocation; public static String schemaLocation; // static initializer block static { ParaProf.runtime = Runtime.getRuntime(); } public static HelpWindow getHelpWindow() { if (helpWindow == null) { helpWindow = new HelpWindow(); } return helpWindow; } public static SourceManager getDirectoryManager() { if (directoryManager == null) { directoryManager = new SourceManager(ParaProf.preferences.getSourceLocations()); } return directoryManager; } public static void registerScript(ParaProfScript pps) { scripts.add(pps); } public ParaProf() {} private static void usage() { System.err.println("Usage: paraprof [--pack ] [--dump] [--dumprank ] [-p] [-m] [-i] [-f ] \n\n" + "try `paraprof --help` for more information"); } private static void outputHelp() { System.err.println("Usage: paraprof [options] \n\n" + "Options:\n\n" + " -f, --filetype Specify type of performance data, options are:\n" + " profiles (default), pprof, dynaprof, mpip,\n" + " gprof, psrun, hpm, packed, cube, hpc, ompp\n" + " snap, perixml, gptl, ipm\n" + " -h, --help Display this help message\n" + "\n" + "The following options will run only from the console (no GUI will launch):\n" + "\n" + " --merge Merges snapshot profiles\n" + " --pack Pack the data into packed (.ppk) format\n" + " --dump Dump profile data to TAU profile format\n" + " --dumprank Dump profile data for to TAU profile format\n" + " --overwrite Allow overwriting of profiles\n" + " -o, --oss Print profile data in OSS style text output\n" + " -s, --summary Print only summary statistics\n" + " (only applies to OSS output)\n" + "\n" + "Notes:\n" + " For the TAU profiles type, you can specify either a specific set of profile\n" + "files on the commandline, or you can specify a directory (by default the current\n" + "directory). The specified directory will be searched for profile.*.*.* files,\n" + "or, in the case of multiple counters, directories named MULTI_* containing\n" + "profile data.\n\n"); } public static void incrementNumWindows() { numWindowsOpen++; //System.out.println ("incrementing: now " + numWindowsOpen); } public static void decrementNumWindows() { numWindowsOpen--; //System.out.println ("decrementing: now " + numWindowsOpen); if (numWindowsOpen <= 0) { exitParaProf(0); } } public static void loadDefaultTrial() { // Create a default application. ParaProfApplication app = ParaProf.applicationManager.addApplication(); app.setName("Default App"); // Create a default experiment. ParaProfExperiment experiment = app.addExperiment(); experiment.setName("Default Exp"); ParaProf.paraProfManagerWindow.setVisible(true); try { if (fileType == DataSource.PPK) { for (int i = 0; i < sourceFiles.length; i++) { File files[] = new File[1]; files[0] = sourceFiles[i]; paraProfManagerWindow.addTrial(app, experiment, files, fileType, fixNames, monitorProfiles); } } else { paraProfManagerWindow.addTrial(app, experiment, sourceFiles, fileType, fixNames, monitorProfiles); } } catch (java.security.AccessControlException ace) { // running as Java Web Start without permission } } public static void initialize() { try { if (System.getProperty("jnlp.running") != null) { ParaProf.JNLP = true; } } catch (java.security.AccessControlException ace) { // if we get this security exception, we are definitely in JNLP ParaProf.JNLP = true; } if (ParaProf.JNLP == false) { // Establish the presence of a .ParaProf directory. This is located // by default in the user's home directory. ParaProf.paraProfHomeDirectory = new File(System.getProperty("user.home") + "/.ParaProf"); if (paraProfHomeDirectory.exists()) { // try to load preferences try { FileInputStream savedPreferenceFIS = new FileInputStream(ParaProf.paraProfHomeDirectory.getPath() + "/ParaProf.conf"); ObjectInputStream inSavedPreferencesOIS = new ObjectInputStream(savedPreferenceFIS); ParaProf.preferences = (Preferences) inSavedPreferencesOIS.readObject(); colorChooser = new ColorChooser(ParaProf.preferences); } catch (Exception e) { if (e instanceof FileNotFoundException) { //System.out.println("No preference file present, using defaults!"); } else { System.out.println("Error while trying to read the ParaProf preferences file, using defaults"); //System.out.println("Please delete this file, or replace it with a valid one!"); //System.out.println("Note: Deleting the file will cause ParaProf to restore the default preferences"); } } ParaProf.colorMap.setMap(preferences.getAssignedColors()); ParaProf.preferences.setDatabasePassword(null); // try to load perfdmf.cfg. File perfDMFcfg = new File(ParaProf.paraProfHomeDirectory.getPath() + "/perfdmf.cfg"); if (perfDMFcfg.exists()) { ParaProf.preferences.setDatabaseConfigurationFile(ParaProf.paraProfHomeDirectory.getPath() + "/perfdmf.cfg"); } } else { System.out.println("Did not find ParaProf home directory... creating..."); paraProfHomeDirectory.mkdir(); System.out.println("Done creating ParaProf home directory!"); } } else { // ParaProf.JNLP == true // Java Web Start //URL url = ParaProf.class.getResource("/perfdmf.cfg"); //throw new ParaProfException("URL = " + url); // URL url = ParaProf.class.getResource("/perfdmf.cfg"); // String path = URLDecoder.decode(url.getPath()); // ParaProf.preferences.setDatabaseConfigurationFile(path); preferences = new Preferences(); } if (colorChooser == null) { // we create one if ParaProf.conf wasn't properly read ParaProf.colorChooser = new ColorChooser(null); } ParaProf.preferencesWindow = new PreferencesWindow(preferences); DataSource.setMeanIncludeNulls(!preferences.getComputeMeanWithoutNulls()); // Set the default exception handler for AWT // This avoids the mess of having to put a try/catch around every AWT entry point try { System.setProperty("sun.awt.exception.handler", XThrowableHandler.class.getName()); } catch (java.security.AccessControlException ace) { // running as Java Web Start without permission } // Initialize, but do not show the manager window //System.out.println("creating Manager window with: " + configFile); ParaProf.paraProfManagerWindow = new ParaProfManagerWindow(configFile); } public static void loadScripts() { if (ParaProf.JNLP == false) { ParaProf.scripts.clear(); ParaProf.scriptFile = System.getProperty("user.home") + "/.ParaProf/ParaProf.py"; if (new File(scriptFile).exists()) { try { TauScripter.execfile(System.getProperty("user.home") + "/.ParaProf/ParaProf.py"); } catch (Exception e) { new ParaProfErrorDialog("Exception while executing script: ", e); } } } } public void actionPerformed(ActionEvent evt) { Object EventSrc = evt.getSource(); if (EventSrc instanceof javax.swing.Timer) { System.out.println("------------------------"); System.out.println("The amount of memory used by the system is: " + runtime.totalMemory()); System.out.println("The amount of memory free to the system is: " + runtime.freeMemory()); } } public static String getInfoString() { //long memUsage = (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024; DecimalFormat f = new DecimalFormat("#.## MB"); String memUsage = "Free: " + f.format(java.lang.Runtime.getRuntime().freeMemory() / 1000000.0) + "\nTotal: " + f.format(java.lang.Runtime.getRuntime().totalMemory() / 1000000.0) + "\nMax: " + f.format(java.lang.Runtime.getRuntime().maxMemory() / 1000000.0); String message = "ParaProf\n" + getVersionString() + "\nJVM Memory stats:\n" + memUsage + "\n" + "http://www.cs.uoregon.edu/research/tau\n"; return message; } public static String getVersionString() { return new String(VERSION); } public static void loadPreferences(File file) throws FileNotFoundException, IOException, ClassNotFoundException { FileInputStream savedPreferenceFIS = new FileInputStream(file); //If here, means that no exception was thrown, and there is a preference file present. //Create ObjectInputStream and try to read it in. ObjectInputStream inSavedPreferencesOIS = new ObjectInputStream(savedPreferenceFIS); ParaProf.preferences = (Preferences) inSavedPreferencesOIS.readObject(); colorChooser = new ColorChooser(ParaProf.preferences); ParaProf.colorMap.setMap(ParaProf.preferences.getAssignedColors()); List trials = ParaProf.paraProfManagerWindow.getLoadedTrials(); for (Iterator it = trials.iterator(); it.hasNext();) { ParaProfTrial ppTrial = (ParaProfTrial) it.next(); ParaProf.colorChooser.setColors(ppTrial, -1); ppTrial.updateRegisteredObjects("colorEvent"); ppTrial.updateRegisteredObjects("prefEvent"); } } // This method is reponsible for any cleanup required in ParaProf // before an exit takes place. public static void exitParaProf(int exitValue) { try { savePreferences(new File(ParaProf.paraProfHomeDirectory.getPath() + "/ParaProf.conf")); } catch (Exception e) { // we'll get an exception here if running under Java Web Start } if (!insideEclipse) { // never call System.exit when invoked by the eclipse plugin, it will close the whole JVM, including the user's eclipse! System.exit(exitValue); } } public static boolean savePreferences(File file) { ParaProf.colorChooser.setSavedColors(); ParaProf.preferences.setAssignedColors(ParaProf.colorMap.getMap()); ParaProf.preferences.setManagerWindowPosition(ParaProf.paraProfManagerWindow.getLocation()); ParaProf.preferences.setSourceLocations(getDirectoryManager().getCurrentElements()); try { ObjectOutputStream prefsOut = new ObjectOutputStream(new FileOutputStream(file)); prefsOut.writeObject(ParaProf.preferences); prefsOut.close(); } catch (Exception e) { System.err.println("An error occured while trying to save ParaProf preferences."); //e.printStackTrace(); return false; } return true; } // Main entry point static public void main(String[] args) { // Set the tooltip delay to 20 seconds ToolTipManager.sharedInstance().setDismissDelay(20000); // Process command line arguments CmdLineParser parser = new CmdLineParser(); CmdLineParser.Option helpOpt = parser.addBooleanOption('h', "help"); CmdLineParser.Option configfileOpt = parser.addStringOption('g', "configfile"); CmdLineParser.Option typeOpt = parser.addStringOption('f', "filetype"); CmdLineParser.Option fixOpt = parser.addBooleanOption('i', "fixnames"); CmdLineParser.Option mergeOpt = parser.addStringOption('a', "merge"); CmdLineParser.Option packOpt = parser.addStringOption('a', "pack"); CmdLineParser.Option unpackOpt = parser.addBooleanOption('u', "dump"); CmdLineParser.Option unpackRankOpt = parser.addStringOption('r', "dumprank"); CmdLineParser.Option ossOpt = parser.addBooleanOption('o', "oss"); CmdLineParser.Option overwriteOpt = parser.addBooleanOption('w', "overwrite"); CmdLineParser.Option summaryOpt = parser.addBooleanOption('s', "summary"); CmdLineParser.Option monitorOpt = parser.addBooleanOption('m', "monitor"); CmdLineParser.Option demoOpt = parser.addBooleanOption('z', "demo"); CmdLineParser.Option jarLocationOpt = parser.addStringOption('j', "jardir"); CmdLineParser.Option schemaLocationOpt = parser.addStringOption('c', "schemadir"); try { parser.parse(args); } catch (CmdLineParser.OptionException e) { System.err.println("paraprof: " + e.getMessage()); ParaProf.usage(); System.exit(-1); } configFile = (String) parser.getOptionValue(configfileOpt); Boolean help = (Boolean) parser.getOptionValue(helpOpt); String fileTypeString = (String) parser.getOptionValue(typeOpt); Boolean fixNames = (Boolean) parser.getOptionValue(fixOpt); String merge = (String) parser.getOptionValue(mergeOpt); String pack = (String) parser.getOptionValue(packOpt); Boolean unpack = (Boolean) parser.getOptionValue(unpackOpt); Boolean overwrite = (Boolean) parser.getOptionValue(overwriteOpt); String unpackrank = (String) parser.getOptionValue(unpackRankOpt); if (unpackrank != null) { unpack = Boolean.TRUE; } Boolean oss = (Boolean) parser.getOptionValue(ossOpt); Boolean summary = (Boolean) parser.getOptionValue(summaryOpt); Boolean monitor = (Boolean) parser.getOptionValue(monitorOpt); Boolean demo = (Boolean) parser.getOptionValue(demoOpt); ParaProf.jarLocation = (String) parser.getOptionValue(jarLocationOpt); ParaProf.schemaLocation = (String) parser.getOptionValue(schemaLocationOpt); demoMode = demo != null && demo.booleanValue(); if (configFile != "") { //System.out.println("commandline db config: " + configFile); ParaProf.preferences.setDatabaseConfigurationFile(configFile); } if (monitor != null) { monitorProfiles = monitor.booleanValue(); } if (pack != null && unpack != null) { System.err.println("--pack and --dump are mutually exclusive"); System.exit(-1); } if (help != null && help.booleanValue()) { ParaProf.outputHelp(); System.exit(-1); } String sourceFilenames[] = parser.getRemainingArgs(); sourceFiles = new File[sourceFilenames.length]; for (int i = 0; i < sourceFilenames.length; i++) { sourceFiles[i] = new File(sourceFilenames[i]); } if (fixNames != null) ParaProf.fixNames = fixNames.booleanValue(); if (fileTypeString != null) { if (fileTypeString.equals("profiles")) { ParaProf.fileType = DataSource.TAUPROFILE; } else if (fileTypeString.equals("pprof")) { ParaProf.fileType = DataSource.PPROF; } else if (fileTypeString.equals("dynaprof")) { ParaProf.fileType = DataSource.DYNAPROF; } else if (fileTypeString.equals("mpip")) { ParaProf.fileType = DataSource.MPIP; } else if (fileTypeString.equals("hpm")) { ParaProf.fileType = DataSource.HPM; } else if (fileTypeString.equals("gprof")) { ParaProf.fileType = DataSource.GPROF; } else if (fileTypeString.equals("psrun")) { ParaProf.fileType = DataSource.PSRUN; } else if (fileTypeString.equals("packed")) { ParaProf.fileType = DataSource.PPK; } else if (fileTypeString.equals("cube")) { ParaProf.fileType = DataSource.CUBE; } else if (fileTypeString.equals("hpc")) { ParaProf.fileType = DataSource.HPCTOOLKIT; } else if (fileTypeString.equals("snapshot")) { ParaProf.fileType = DataSource.SNAP; } else if (fileTypeString.equals("snap")) { ParaProf.fileType = DataSource.SNAP; } else if (fileTypeString.equals("ompp")) { ParaProf.fileType = DataSource.OMPP; } else if (fileTypeString.equals("perixml")) { ParaProf.fileType = DataSource.PERIXML; } else if (fileTypeString.equals("gptl")) { ParaProf.fileType = DataSource.GPTL; } else if (fileTypeString.equals("paraver")) { ParaProf.fileType = DataSource.PARAVER; } else if (fileTypeString.equals("ipm")) { ParaProf.fileType = DataSource.IPM; } else { System.err.println("Please enter a valid file type."); ParaProf.usage(); System.exit(-1); } } else { if (sourceFilenames.length >= 1) { ParaProf.fileType = UtilFncs.identifyData(sourceFiles[0]); } } if (merge != null) { try { if (sourceFiles.length == 0) { FileList fl = new FileList(); sourceFiles = fl.helperFindSnapshots(System.getProperty("user.dir")); } if (sourceFiles.length == 0) { System.err.println("No snapshots found\n"); System.exit(-1); } for (int i = 0; i < sourceFiles.length; i++) { if (DataSource.SNAP != UtilFncs.identifyData(sourceFiles[i])) { System.err.println("Error: File '" + sourceFiles[i] + "' is not a snapshot profile\n"); System.exit(-1); } } // merge and write UtilFncs.mergeSnapshots(sourceFiles, merge); } catch (Exception e) { e.printStackTrace(); } System.exit(0); } if (oss != null) { try { boolean doSummary = false; if (summary != null) { doSummary = true; } DataSource dataSource = UtilFncs.initializeDataSource(sourceFiles, fileType, ParaProf.fixNames); dataSource.load(); OSSWriter.writeOSS(dataSource, doSummary); } catch (Exception e) { e.printStackTrace(); } System.exit(0); } if (pack != null) { try { DataSource dataSource = UtilFncs.initializeDataSource(sourceFiles, fileType, ParaProf.fixNames); System.out.println("Loading data..."); dataSource.load(); System.out.println("Packing data..."); DataSourceExport.writePacked(dataSource, new File(pack)); } catch (Exception e) { e.printStackTrace(); } System.exit(0); } if (unpack != null && unpack.booleanValue()) { try { FileList fl = new FileList(); List v = fl.helperFindProfiles("."); if (overwrite == null) { if (v.size() != 0) { System.err.println("Error: profiles found in current directory, please remove first"); return; } } DataSource dataSource = UtilFncs.initializeDataSource(sourceFiles, fileType, ParaProf.fixNames); System.out.println("Loading data..."); dataSource.load(); System.out.println("Creating TAU Profile data..."); if (unpackrank != null) { int rank = Integer.parseInt(unpackrank); Node node = dataSource.getNode(rank); DataSourceExport.writeProfiles(dataSource, new File("."), node.getThreads()); } else { DataSourceExport.writeProfiles(dataSource, new File(".")); } } catch (Exception e) { e.printStackTrace(); } System.exit(0); } javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { try { ParaProf.initialize(); ParaProf.loadScripts(); ParaProf.loadDefaultTrial(); } catch (Exception e) { ParaProfUtils.handleException(e); } } }); } }