blob: 48ce8d97e61fd42ac466ed51c7f30c8a08448b8a [file] [log] [blame]
/****************************************************************************
* Tuning and Analysis Utilities
* http://www.cs.uoregon.edu/research/paracomp/tau
****************************************************************************
* Copyright (c) 1997-2006
* Department of Computer and Information Science, University of Oregon
* Advanced Computing Laboratory, Los Alamos National Laboratory
* Research Center Juelich, ZAM Germany
*
* 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:
* Wyatt Spear - initial API and implementation
****************************************************************************/
package org.eclipse.ptp.etfw.tau.selinst;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.IFunctionDeclaration;
/**
* Manages reading, writing and adding/removing commands to selective instrumentation files
* @author wspear
*
*/
public class Selector {
private LinkedHashSet<String> routInc;
private LinkedHashSet<String> routEx;
private LinkedHashSet<String> fileInc;
private LinkedHashSet<String> fileEx;
private LinkedHashSet<String> instSec;
private String selString;
/**
* Initializes a new selector object
* @param path path to the selective instrumentation file to be used or created
*/
public Selector(String path){
routInc=new LinkedHashSet<String>();
routEx=new LinkedHashSet<String>();
fileInc=new LinkedHashSet<String>();
fileEx=new LinkedHashSet<String>();
instSec=new LinkedHashSet<String>();
selString=path+File.separator+"tau.selective";
readSelFile();
}
public static String getRoutine(IFunctionDeclaration fun)
{
return "routine=\""+getFullSigniture(fun)+"\"";
}
public static String getFullSigniture(IFunctionDeclaration fun)
{
String returntype = Selector.fixStars(fun.getReturnType());
String signature;
try {
signature = Selector.fixStars(fun.getSignature());
return returntype+" "+signature+"#";
} catch (CModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "";
}
/**
* Spaces out star (*) characters so function signatures can be read by TAU's selective instrumentation file parser
* @param signature function signature
* @return corrected function signature
*/
public static String fixStars(String signature){
int star = signature.indexOf('*');
while(star>=1){
if(signature.charAt(star-1)!='*')
{
signature=signature.substring(0,star)+" "+signature.substring(star);
star++;
}
star=signature.indexOf('*', star+1);
}
return signature;
}
/**
* Adds the given set of files to the include list of this object's selective instrumentation
* file and removes them from its exclude list if they are present
* @param incfiles The set of routines to be included
*/
public void includeFile(HashSet<String> incfiles){
fileInc.addAll(incfiles);
fileEx.removeAll(incfiles);
writeSelFile();
}
/**
* Adds the given set of files to the exclude list of this object's selective instrumentation
* file and removes them from its include list if they are present
* @param exfiles The set of routines to be excluded
*/
public void excludeFile(HashSet<String> exfiles){
fileEx.addAll(exfiles);
fileInc.removeAll(exfiles);
writeSelFile();
}
/**
* Adds the given set of routines to the include list of this object's selective instrumentation
* file and removes them from its exclude list if they are present
* @param incrouts The set of routines to be included
*/
public void includeRout(HashSet<String> incrouts){
routInc.addAll(incrouts);
routEx.removeAll(incrouts);
writeSelFile();
}
/**
* Adds the given set of routines to the exclude list of this object's selective instrumentation
* file and removes them from its include list if they are present
* @param exrouts The set of routines to be excluded
*/
public void excludeRout(HashSet<String> exrouts){
routEx.addAll(exrouts);
routInc.removeAll(exrouts);
writeSelFile();
}
/**
* Adds the given list of instrumentation commands to this object's selective instrumentation file
* @param instlines The list of instrument commands to add
*/
public void addInst(HashSet<String> instlines){
instSec.addAll(instlines);
writeSelFile();
}
/**
* Removes the given set of 'instrument' and/or 'exclude' file commands from this Selector's selective instrumentation file
* @param remfile The set of 'instrument' and/or 'eclude' file commands to be removed
*/
public void clearFile(HashSet<String> remfile){
fileInc.removeAll(remfile);
fileEx.removeAll(remfile);
writeSelFile();
}
/**
* Removes the given set of 'instrument' and/or 'exclude' routine commands from this Selector's selective instrumentation file
* @param remrouts The set of 'instrument' and/or 'eclude' routine commands to be removed
*/
public void clearRout(HashSet<String> remrouts){
routInc.removeAll(remrouts);
routEx.removeAll(remrouts);
writeSelFile();
}
public void clearInstrumentSection(HashSet<String> elementNames)
{
Iterator<String> elementIt=elementNames.iterator();
Iterator<String> selectiveIt;
HashSet<String> toRemove=new HashSet<String>();
String curElement="";
String curSelLine="";
while(elementIt.hasNext())
{
curElement=(String)elementIt.next();
selectiveIt=instSec.iterator();
while(selectiveIt.hasNext())
{
curSelLine=selectiveIt.next();
if(curSelLine.indexOf(curElement)>=0)
{
toRemove.add(curSelLine);
}
}
}
instSec.removeAll(toRemove);
writeSelFile();
}
/**
* Removes the indicated selective instrumentation commands from the
* 'selective instrumentation' section from this Selector's selective instrumentation file
* @param remlines The set of selective instrumentation commands to be removed
*/
public void clearGenInst(HashSet<String> remlines){
try{
Iterator<String> remit = remlines.iterator();
Iterator<String> removal;
HashSet<String> removethese=new HashSet<String>();
String remtem ="";
String remcan = "";
while(remit.hasNext())
{
remtem = ((String)remit.next());
removal = instSec.iterator();
while(removal.hasNext())
{
remcan=removal.next();
if(remcan.indexOf(remtem)==0)
{
removethese.add(remcan);
}
}
}
instSec.removeAll(removethese);
writeSelFile();
}catch(Exception e){e.printStackTrace();}
}
/**
* Removes the given set of 'instrument' commands from this Selector's selective instrumentation file
* @param remlines The set of 'instrument' commands to be removed
*/
public void remInst(HashSet<String> remlines){
instSec.removeAll(remlines);
writeSelFile();
}
/**
* Reads a complete selective instrumentation file, with individual selection types being placed in their respective sets
*
*/
private void readSelFile()
{
try
{
//WorkspaceDescription.
File selfile = new File(selString);
if(!selfile.exists())
{
return;
}
BufferedReader in = new BufferedReader (new FileReader(selfile));
String ourline=in.readLine();
while(ourline!=null)
{
if(ourline.equals("BEGIN_EXCLUDE_LIST"))
{
ourline=in.readLine();
while(!ourline.equals("END_EXCLUDE_LIST")&&!ourline.equals(null))
{
routEx.add(ourline);
ourline=in.readLine();
}
}
if(ourline.equals("BEGIN_INCLUDE_LIST"))
{
ourline=in.readLine();
while(!ourline.equals("END_INCLUDE_LIST")&&!ourline.equals(null))
{
routInc.add(ourline);
ourline=in.readLine();
}
}
if(ourline.equals("BEGIN_FILE_INCLUDE_LIST"))
{
ourline=in.readLine();
while(!ourline.equals("END_FILE_INCLUDE_LIST")&&!ourline.equals(null))
{
fileInc.add(ourline);
ourline=in.readLine();
}
}
if(ourline.equals("BEGIN_FILE_EXCLUDE_LIST"))
{
ourline=in.readLine();
while(!ourline.equals("END_FILE_EXCLUDE_LIST")&&!ourline.equals(null))
{
fileEx.add(ourline);
ourline=in.readLine();
}
}
if(ourline.equals("BEGIN_INSTRUMENT_SECTION"))
{
ourline=in.readLine();
while(!ourline.equals("END_INSTRUMENT_SECTION")&&!ourline.equals(null))
{
instSec.add(ourline);
ourline=in.readLine();
}
}
ourline=in.readLine();
}
}
catch(IOException e){e.printStackTrace();}
}
/**
* Writes a complete selective instrumentation file, with section content provided by the individual sets provided
*
*/
private void writeSelFile()
{
try
{
BufferedWriter out = new BufferedWriter(new FileWriter(selString));
out.write("#Generated by the TAU PTP plugin\n");
if(routEx.size()>0)
{
out.write("BEGIN_EXCLUDE_LIST\n");
Iterator<String> routExIt=routEx.iterator();
while(routExIt.hasNext())
out.write(routExIt.next()+"\n");
out.write("END_EXCLUDE_LIST\n");
}
if(routInc.size()>0)
{
out.write("BEGIN_INCLUDE_LIST\n");
Iterator<String> routIncIt = routInc.iterator();
while(routIncIt.hasNext())
out.write(routIncIt.next()+"\n");
out.write("END_INCLUDE_LIST\n");
}
if(fileEx.size()>0)
{
out.write("BEGIN_FILE_EXCLUDE_LIST\n");
Iterator<String> fileExIt = fileEx.iterator();
while(fileExIt.hasNext())
out.write(fileExIt.next()+"\n");
out.write("END_FILE_EXCLUDE_LIST\n");
}
if(fileInc.size()>0)
{
out.write("BEGIN_FILE_INCLUDE_LIST\n");
Iterator<String> fileIncIt = fileInc.iterator();
while(fileIncIt.hasNext())
out.write(fileIncIt.next()+"\n");
out.write("END_FILE_INCLUDE_LIST\n");
}
if(instSec.size()>0)
{
out.write("BEGIN_INSTRUMENT_SECTION\n");
Iterator<String> instSecIt=instSec.iterator();
while(instSecIt.hasNext())
out.write(instSecIt.next()+"\n");
out.write("END_INSTRUMENT_SECTION\n");
}
out.close();
}
catch (IOException e) {e.printStackTrace();}
}
}