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=(b4<<24)|(b3<<16)|(b2<<8)|b1;
47 } catch (Exception e) {
52 public static long readLong(InputStream is) {
62 long retval=(b8<<56)|(b7<<48)|(b6<<40)|(b5<<32)|
63 (b4<<24)|(b3<<16)|(b2<<8)|b1;
67 } catch (Exception e) {
72 public Executor(String filename) {
73 BufferedInputStream bir=null;
75 bir=new BufferedInputStream(new FileInputStream(filename));
76 } catch (Exception e) {
80 numThreads=readInt(bir);
81 threads=new ThreadClass[numThreads];
83 for(int i=0;i<numThreads;i++) {
84 System.out.println("Loading thread "+i+" of "+numThreads);
85 threads[i]=readThread(bir);
86 long inittime=threads[i].trans[0].getTime(0);
87 if (earliest==-1||earliest>inittime) {
91 for(int i=0;i<numThreads;i++) {
92 long inittime=threads[i].trans[0].getTime(0);
93 assert(threads[i].trans[0].numEvents()==1);
94 threads[i].trans[0].setTime(0, inittime-earliest);
98 public static final int EV_THREAD=0;
99 public static final int EV_ENTERBARRIER=1;
100 public static final int EV_READ=2;
101 public static final int EV_WRITE=3;
102 public static final int EV_START=4;
103 public static final int EV_COMMIT=5;
104 public static final int EV_ABORT=6;
105 public static final int EV_ARRAYREAD=7;
106 public static final int EV_ARRAYWRITE=8;
107 public static final int EV_EXITBARRIER=9;
109 private Transaction createTransaction(Vector<TEvent> v, boolean started) {
110 Transaction t=new Transaction(v.size(),started);
111 for(int i=0;i<v.size();i++) {
114 t.setEvent(i,e.type);
115 t.setObject(i,e.oid);
116 t.setIndex(i,e.index);
121 private ThreadClass readThread(InputStream is) {
122 int numEvents=readInt(is);
125 boolean started=false;
126 Vector<Transaction> transactions=new Vector<Transaction>();
127 Vector<TEvent> currtrans=null;
131 for(int i=0;i<numEvents;i++) {
132 int eventType=readInt(is);
138 object=readInt(is);i++;
142 object=readInt(is);i++;
143 index=readInt(is);i++;
148 long time=readLong(is);i+=2;
149 if (low==-1||time<low)
151 if (high==-1||time>high)
153 //create dummy first transaction
155 Transaction t=new Transaction(1,started);
156 t.setEvent(0, Transaction.DELAY);
164 //have read all data in
168 currtrans=new Vector<TEvent>();
170 if (lasttime!=-1&&lasttime!=time) {
171 Transaction t=new Transaction(1,started);
172 t.setEvent(0, Transaction.DELAY);
173 t.setTime(0, time-lasttime);
181 long delta=time-starttime;
182 TEvent ev=new TEvent(Transaction.READ, delta, object, index);
187 case EV_ARRAYWRITE: {
188 long delta=time-starttime;
189 TEvent ev=new TEvent(Transaction.WRITE, delta, object, index);
194 long delta=time-starttime;
195 TEvent ev=new TEvent(Transaction.DELAY, delta);
198 transactions.add(createTransaction(currtrans, started));
202 //No need to generate new delay transaction
206 //No need to do anything
208 case EV_ENTERBARRIER: {
210 Transaction t=new Transaction(1, started);
211 t.setEvent(0, Transaction.BARRIER);
213 t.setTime(0, time-lasttime);
221 case EV_EXITBARRIER: {
228 ThreadClass tc=new ThreadClass(transactions.size());
229 for(int i=0;i<transactions.size();i++) {
230 tc.setTransaction(i,transactions.get(i));
232 System.out.println(low+" "+high);
236 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) {
237 this.numThreads=numThreads;
238 this.numTrans=numTrans;
239 this.deltaTrans=deltaTrans;
240 this.numObjects=numObjects;
241 this.numAccesses=numAccesses;
242 this.deltaAccesses=deltaAccesses;
243 this.readPercent=readPercent;
245 this.deltaDelay=deltaDelay;
246 this.nonTrans=nonTrans;
247 this.deltaNonTrans=deltaNonTrans;
248 this.splitobjects=splitobjects;
249 this.splitaccesses=splitaccesses;
250 this.readPercentSecond=readPercentSecond;
252 threads=new ThreadClass[numThreads];
256 public long maxTime() {
258 for(int i=0;i<numThreads;i++) {
260 boolean started=false;
261 for(int j=0;j<getThread(i).numTransactions();j++) {
262 Transaction trans=getThread(i).getTransaction(j);
266 time+=trans.getTime(trans.numEvents()-1);
274 public int numObjects() {
278 public int numThreads() {
282 public int numEvents() {
284 for(int i=0;i<numThreads();i++) {
285 events+=getThread(i).numTransactions();
290 public int maxEvents() {
292 for(int i=0;i<numThreads();i++) {
293 if (events<getThread(i).numTransactions())
294 events=getThread(i).numTransactions();
299 public ThreadClass getThread(int i) {
303 private int getRandom(int base, int delta) {
304 return base+delta-r.nextInt(2*delta+1);
307 public void generateThreads() {
308 for(int i=0;i<numThreads;i++) {
309 threads[i]=generateThread();
313 private Transaction generateTransaction() {
314 int accesses=getRandom(numAccesses, deltaAccesses);
315 Transaction t=new Transaction(accesses,true);
317 int splitpoint=(numObjects*splitobjects)/100;
318 for(int i=0;i<(accesses-1); i++) {
319 if (r.nextInt(100)<splitaccesses) {
320 boolean isRead=r.nextInt(100)<readPercent;
321 time+=getRandom(delay, deltaDelay);
322 int object=r.nextInt(splitpoint);
323 t.setObject(i, object);
326 t.setEvent(i, Transaction.READ);
328 t.setEvent(i, Transaction.WRITE);
330 boolean isRead=r.nextInt(100)<readPercentSecond;
331 time+=getRandom(delay, deltaDelay);
332 int object=r.nextInt(numObjects-splitpoint)+splitpoint;
333 t.setObject(i, object);
336 t.setEvent(i, Transaction.READ);
338 t.setEvent(i, Transaction.WRITE);
341 t.setEvent(accesses-1, Transaction.DELAY);
342 t.setObject(accesses-1, Transaction.DELAY);
343 time+=getRandom(delay, deltaDelay);
344 t.setTime(accesses-1, time);
349 private ThreadClass generateThread() {
350 int numTransactions=getRandom(numTrans, deltaTrans);
351 ThreadClass t=new ThreadClass(numTransactions*2);
352 for(int i=0;i<numTransactions;i++) {
353 Transaction trans=generateTransaction();
354 t.setTransaction(i*2, trans);
355 Transaction transdelay=new Transaction(1,true);
356 transdelay.setObject(0,Transaction.DELAY);
357 transdelay.setEvent(0,Transaction.DELAY);
358 transdelay.setTime(0, getRandom(nonTrans, deltaNonTrans));
359 t.setTransaction(i*2+1, transdelay);