001 package edu.rice.cs.cunit.instrumentors;
002
003 import edu.rice.cs.cunit.instrumentors.util.CompoundStrategy;
004 import edu.rice.cs.cunit.instrumentors.delay.*;
005
006 import java.util.List;
007
008 /**
009 * Compound instrumentor for executing programs with inserted random yields.
010 * @author Mathias Ricken
011 */
012 public class CompoundYieldStrategy extends CompoundStrategy {
013 /**
014 * Create a new compound instrumentor for instrumenting regular classes.
015 * @param parameters parameters for the instrumentors
016 */
017 public CompoundYieldStrategy(List<String> parameters) {
018 super(parameters);
019 getCombined().add(new SynchronizedMethodToBlockStrategy()); // convert synchronized methods to blocks
020 getCombined().add(new CallOnThreadStartStrategy("edu/rice/cs/cunit/SyncPointBuffer", "yieldThreadStart",
021 "edu/rice/cs/cunit/SyncPointBuffer", "RANDOM_YIELD_THREAD_START")); // instrument java.lang.Thread.start for yields
022 getCombined().add(new CallOnThreadExitStrategy("edu/rice/cs/cunit/SyncPointBuffer", "yieldThreadExit",
023 "edu/rice/cs/cunit/SyncPointBuffer", "RANDOM_YIELD_THREAD_EXIT")); // instrument java.lang.Thread.exit for yields
024 getCombined().add(new CallOnThreadRunStrategy("edu/rice/cs/cunit/SyncPointBuffer", "randomYield",
025 "edu/rice/cs/cunit/SyncPointBuffer", "RANDOM_YIELD_THREAD_RUN")); // instrument java.lang.Thread.run for yields
026 getCombined().add(new CallOnThreadJoinStrategy("edu/rice/cs/cunit/SyncPointBuffer", "randomYield",
027 "edu/rice/cs/cunit/SyncPointBuffer", "RANDOM_YIELD_THREAD_JOIN")); // instrument java.lang.Thread.join for yields
028 getCombined().add(new CallOnObjectNotifyStrategy("edu/rice/cs/cunit/SyncPointBuffer", "randomYield",
029 "edu/rice/cs/cunit/SyncPointBuffer", "RANDOM_YIELD_PRE_NOTIFY",
030 "edu/rice/cs/cunit/SyncPointBuffer", "RANDOM_YIELD_POST_NOTIFY")); // add yields before calls to java.lang.Object.notify/notifyAll
031 getCombined().add(new CallOnObjectWaitStrategy("edu/rice/cs/cunit/SyncPointBuffer", "randomYield",
032 "edu/rice/cs/cunit/SyncPointBuffer", "RANDOM_YIELD_PRE_WAIT",
033 "edu/rice/cs/cunit/SyncPointBuffer", "RANDOM_YIELD_POST_WAIT")); // add yields before calls to java.lang.Object.wait
034 getCombined().add(new CallOnSynchronizedBlockStrategy("edu/rice/cs/cunit/SyncPointBuffer", "randomYield",
035 "edu/rice/cs/cunit/SyncPointBuffer", "RANDOM_YIELD_PRE_MONITOR",
036 "edu/rice/cs/cunit/SyncPointBuffer", "RANDOM_YIELD_POST_MONITOR")); // instrument monitorenter for yields
037 }
038 }