001 package edu.rice.cs.cunit.instrumentors.threadCheck;
002
003 import edu.rice.cs.cunit.instrumentors.util.CompoundStrategy;
004 import edu.rice.cs.cunit.instrumentors.util.ConditionalStrategy;
005 import edu.rice.cs.cunit.instrumentors.SynchronizedMethodToBlockStrategy;
006 import edu.rice.cs.cunit.classFile.ClassFile;
007 import edu.rice.cs.cunit.util.Debug;
008
009 import java.util.List;
010
011 /**
012 * Compound instrumentor for the Thread Check strategies.
013 * @author Mathias Ricken
014 */
015 public class CompoundThreadCheckStrategy extends CompoundStrategy {
016 /**
017 * Parameter that enables conversion of synchronized methods to methods containing synchronized blocks.
018 */
019 public static final String CONVERT_SYNC_METHODS_PARAM = "convert-sync-methods";
020
021 /**
022 * Create a new compound instrumentor for the Thread Check strategies.
023 * @param parameters parameters for the instrumentors
024 */
025 public CompoundThreadCheckStrategy(List<String> parameters) {
026 super(parameters);
027 AThreadCheckStrategy.SharedData sharedData =
028 new AThreadCheckStrategy.SharedData(parameters);
029 AAddThreadCheckStrategy.SharedAddData sharedAddData =
030 new AAddThreadCheckStrategy.SharedAddData(parameters,sharedData);
031 boolean found = false;
032 for (String s: parameters) {
033 if (s.equalsIgnoreCase(CONVERT_SYNC_METHODS_PARAM)) {
034 found = true;
035 Debug.out.println("Converting synchronized methods to methods with synchronized blocks.");
036 break;
037 }
038 }
039 final boolean convertSynchronizedMethod = found;
040
041 getCombined().add(sharedData); // collects warnings from AThreadCheckStrategy instances
042 getCombined().add(sharedAddData); // collects warnings from AAddThreadCheckStrategy instances
043 getCombined().add(new ConditionalStrategy(new SynchronizedMethodToBlockStrategy()) {
044 public boolean apply(ClassFile cf) {
045 return convertSynchronizedMethod;
046 }
047 });
048 getCombined().add(new AddThreadCheckStrategy(parameters,
049 sharedData,
050 sharedAddData)); // add primitive thread checks
051 getCombined().add(new AddPredicateThreadCheckStrategy(parameters,
052 sharedData,
053 sharedAddData)); // add predicate thread checks
054 }
055 }