1 import java.util.Random;
2 import java.io.FileInputStream;
3 import java.io.InputStream;
4 import java.io.BufferedInputStream;
5 import java.util.Vector;
7 public class Executor {
20 ThreadClass[] threads;
23 int readPercentSecond;
25 public String toString() {
27 for(int i=0;i<numThreads;i++)
28 s+=threads[i].toString();
33 public Executor(int numThreads, int numTrans, int deltaTrans, int numObjects, int numAccesses, int deltaAccesses, int readPercent, int delay, int deltaDelay, int nonTrans, int deltaNonTrans) {
34 this(numThreads, numTrans, deltaTrans, numObjects, numAccesses, deltaAccesses, readPercent, delay, deltaDelay, nonTrans, deltaNonTrans, 100, 100, 0);
37 public static int readInt(InputStream is) {
43 int retval=(b1<<24)|(b2<<16)|(b3<<8)|b4;
47 } catch (Exception e) {
52 public static long readLong(InputStream is) {
62 long retval=(b1<<56)|(b2<<48)|(b3<<40)|(b4<<32)|
63 (b5<<24)|(b6<<16)|(b7<<8)|b8;
67 } catch (Exception e) {
72 public Executor(String filename) {
73 BufferedInputStream bir;
75 bir=new BufferedInputStream(new FileInputStream(filename));
76 } catch (Exception e) {
79 numThreads=readInt(bir);
80 threads=new ThreadClass[numThreads];
82 for(int i=0;i<numThreads;i++) {
83 threads[i]=readThread(bir);
84 long inittime=threads[i].trans[0].getTime(0);
85 if (earliest==-1||earliest>inittime) {
89 for(int i=0;i<numThreads;i++) {
90 long inittime=threads[i].trans[0].getTime(0);
91 assert(threads[i].trans[0].numEvents()==1);
92 threads[i].trans[0].setTime(0, inittime-earliest);
96 public static final int EV_THREAD=0;
97 public static final int EV_ENTERBARRIER=1;
98 public static final int EV_READ=2;
99 public static final int EV_WRITE=3;
100 public static final int EV_START=4;
101 public static final int EV_COMMIT=5;
102 public static final int EV_ABORT=6;
103 public static final int EV_ARRAYREAD=7;
104 public static final int EV_ARRAYWRITE=8;
105 public static final int EV_EXITBARRIER=9;
107 private Transaction createTransaction(Vector<TEvent> v) {
108 Transaction t=new Transaction(v.size());
109 for(int i=0;i<v.size();i++) {
112 t.setEvent(i,e.type);
113 t.setObject(i,e.oid);
114 t.setIndex(i,e.index);
119 private ThreadClass readThread(InputStream is) {
120 int numEvents=readInt(is);
121 Vector<Transaction> transactions=new Vector<Transaction>();
122 Vector<TEvent> currtrans=null;
126 for(int i=0;i<numEvents;i++) {
127 int eventType=readInt(is);
143 long time=readLong(is);
144 //create dummy first transaction
146 Transaction t=new Transaction(1);
153 //have read all data in
157 currtrans=new Vector<TEvent>();
159 Transaction t=new Transaction(1);
160 t.setEvent(0, Transaction.DELAY);
161 t.setTime(0, time-lasttime);
169 long delta=time-starttime;
170 TEvent ev=new TEvent(Transaction.READ, delta, object, index);
175 case EV_ARRAYWRITE: {
176 long delta=time-starttime;
177 TEvent ev=new TEvent(Transaction.WRITE, delta, object, index);
182 long delta=time-starttime;
183 TEvent ev=new TEvent(Transaction.DELAY, delta);
186 transactions.add(createTransaction(currtrans));
190 //No need to generate new delay transaction
194 //No need to do anything
196 case EV_ENTERBARRIER: {
199 Transaction t=new Transaction(1);
200 t.setEvent(0, Transaction.DELAY);
201 t.setTime(0, time-lasttime);
206 transactions.add(Transaction.getBarrier());
209 case EV_EXITBARRIER: {
216 ThreadClass tc=new ThreadClass(transactions.size());
217 for(int i=0;i<transactions.size();i++) {
218 tc.setTransaction(i,transactions.get(i));
223 public Executor(int numThreads, int numTrans, int deltaTrans, int numObjects, int numAccesses, int deltaAccesses, int readPercent, int delay, int deltaDelay, int nonTrans, int deltaNonTrans, int splitobjects, int splitaccesses, int readPercentSecond) {
224 this.numThreads=numThreads;
225 this.numTrans=numTrans;
226 this.deltaTrans=deltaTrans;
227 this.numObjects=numObjects;
228 this.numAccesses=numAccesses;
229 this.deltaAccesses=deltaAccesses;
230 this.readPercent=readPercent;
232 this.deltaDelay=deltaDelay;
233 this.nonTrans=nonTrans;
234 this.deltaNonTrans=deltaNonTrans;
235 this.splitobjects=splitobjects;
236 this.splitaccesses=splitaccesses;
237 this.readPercentSecond=readPercentSecond;
239 threads=new ThreadClass[numThreads];
243 public int maxTime() {
245 for(int i=0;i<numThreads;i++) {
247 for(int j=0;j<getThread(i).numTransactions();j++) {
248 Transaction trans=getThread(i).getTransaction(j);
249 time+=trans.getTime(trans.numEvents()-1);
257 public int numObjects() {
261 public int numThreads() {
265 public int numEvents() {
267 for(int i=0;i<numThreads();i++) {
268 events+=getThread(i).numTransactions();
273 public int maxEvents() {
275 for(int i=0;i<numThreads();i++) {
276 if (events<getThread(i).numTransactions())
277 events=getThread(i).numTransactions();
282 public ThreadClass getThread(int i) {
286 private int getRandom(int base, int delta) {
287 return base+delta-r.nextInt(2*delta+1);
290 public void generateThreads() {
291 for(int i=0;i<numThreads;i++) {
292 threads[i]=generateThread();
296 private Transaction generateTransaction() {
297 int accesses=getRandom(numAccesses, deltaAccesses);
298 Transaction t=new Transaction(accesses);
300 int splitpoint=(numObjects*splitobjects)/100;
301 for(int i=0;i<(accesses-1); i++) {
302 if (r.nextInt(100)<splitaccesses) {
303 boolean isRead=r.nextInt(100)<readPercent;
304 time+=getRandom(delay, deltaDelay);
305 int object=r.nextInt(splitpoint);
306 t.setObject(i, object);
309 t.setEvent(i, Transaction.READ);
311 t.setEvent(i, Transaction.WRITE);
313 boolean isRead=r.nextInt(100)<readPercentSecond;
314 time+=getRandom(delay, deltaDelay);
315 int object=r.nextInt(numObjects-splitpoint)+splitpoint;
316 t.setObject(i, object);
319 t.setEvent(i, Transaction.READ);
321 t.setEvent(i, Transaction.WRITE);
324 t.setEvent(accesses-1, Transaction.DELAY);
325 t.setObject(accesses-1, Transaction.DELAY);
326 time+=getRandom(delay, deltaDelay);
327 t.setTime(accesses-1, time);
332 private ThreadClass generateThread() {
333 int numTransactions=getRandom(numTrans, deltaTrans);
334 ThreadClass t=new ThreadClass(numTransactions*2);
335 for(int i=0;i<numTransactions;i++) {
336 Transaction trans=generateTransaction();
337 t.setTransaction(i*2, trans);
338 Transaction transdelay=new Transaction(1);
339 transdelay.setObject(0,Transaction.DELAY);
340 transdelay.setEvent(0,Transaction.DELAY);
341 transdelay.setTime(0, getRandom(nonTrans, deltaNonTrans));
342 t.setTransaction(i*2+1, transdelay);