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;
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 System.out.println("Loading thread "+i+" of "+numThreads);
84 threads[i]=readThread(bir);
85 long inittime=threads[i].trans[0].getTime(0);
86 if (earliest==-1||earliest>inittime) {
90 for(int i=0;i<numThreads;i++) {
91 long inittime=threads[i].trans[0].getTime(0);
92 assert(threads[i].trans[0].numEvents()==1);
93 threads[i].trans[0].setTime(0, inittime-earliest);
97 public static final int EV_THREAD=0;
98 public static final int EV_ENTERBARRIER=1;
99 public static final int EV_READ=2;
100 public static final int EV_WRITE=3;
101 public static final int EV_START=4;
102 public static final int EV_COMMIT=5;
103 public static final int EV_ABORT=6;
104 public static final int EV_ARRAYREAD=7;
105 public static final int EV_ARRAYWRITE=8;
106 public static final int EV_EXITBARRIER=9;
108 private Transaction createTransaction(Vector<TEvent> v, boolean started) {
109 Transaction t=new Transaction(v.size(),started);
110 for(int i=0;i<v.size();i++) {
113 t.setEvent(i,e.type);
114 t.setObject(i,e.oid);
115 t.setIndex(i,e.index);
120 private ThreadClass readThread(InputStream is) {
121 int numEvents=readInt(is);
124 boolean started=false;
125 Vector<Transaction> transactions=new Vector<Transaction>();
126 Vector<TEvent> currtrans=null;
130 for(int i=0;i<numEvents;i++) {
131 int eventType=readInt(is);
137 object=readInt(is);i++;
141 object=readInt(is);i++;
142 index=readInt(is);i++;
147 long time=readLong(is);i+=2;
148 if (low==-1||time<low)
150 if (high==-1||time>high)
152 //create dummy first transaction
154 Transaction t=new Transaction(1,started);
155 t.setEvent(0, Transaction.DELAY);
163 //have read all data in
167 currtrans=new Vector<TEvent>();
169 if (lasttime!=-1&&lasttime!=time) {
170 Transaction t=new Transaction(1,started);
171 t.setEvent(0, Transaction.DELAY);
172 t.setTime(0, time-lasttime);
180 long delta=time-starttime;
181 TEvent ev=new TEvent(Transaction.READ, delta, object, index);
186 case EV_ARRAYWRITE: {
187 long delta=time-starttime;
188 TEvent ev=new TEvent(Transaction.WRITE, delta, object, index);
193 long delta=time-starttime;
194 TEvent ev=new TEvent(Transaction.DELAY, delta);
197 transactions.add(createTransaction(currtrans, started));
201 //No need to generate new delay transaction
205 //No need to do anything
207 case EV_ENTERBARRIER: {
209 Transaction t=new Transaction(1, started);
210 t.setEvent(0, Transaction.BARRIER);
212 t.setTime(0, time-lasttime);
220 case EV_EXITBARRIER: {
227 ThreadClass tc=new ThreadClass(transactions.size());
228 for(int i=0;i<transactions.size();i++) {
229 tc.setTransaction(i,transactions.get(i));
231 System.out.println(low+" "+high);
235 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) {
236 this.numThreads=numThreads;
237 this.numTrans=numTrans;
238 this.deltaTrans=deltaTrans;
239 this.numObjects=numObjects;
240 this.numAccesses=numAccesses;
241 this.deltaAccesses=deltaAccesses;
242 this.readPercent=readPercent;
244 this.deltaDelay=deltaDelay;
245 this.nonTrans=nonTrans;
246 this.deltaNonTrans=deltaNonTrans;
247 this.splitobjects=splitobjects;
248 this.splitaccesses=splitaccesses;
249 this.readPercentSecond=readPercentSecond;
251 threads=new ThreadClass[numThreads];
255 public long maxTime() {
257 for(int i=0;i<numThreads;i++) {
259 boolean started=false;
260 for(int j=0;j<getThread(i).numTransactions();j++) {
261 Transaction trans=getThread(i).getTransaction(j);
265 time+=trans.getTime(trans.numEvents()-1);
273 public int numObjects() {
277 public int numThreads() {
281 public int numEvents() {
283 for(int i=0;i<numThreads();i++) {
284 events+=getThread(i).numTransactions();
289 public int maxEvents() {
291 for(int i=0;i<numThreads();i++) {
292 if (events<getThread(i).numTransactions())
293 events=getThread(i).numTransactions();
298 public ThreadClass getThread(int i) {
302 private int getRandom(int base, int delta) {
303 return base+delta-r.nextInt(2*delta+1);
306 public void generateThreads() {
307 for(int i=0;i<numThreads;i++) {
308 threads[i]=generateThread();
312 private Transaction generateTransaction() {
313 int accesses=getRandom(numAccesses, deltaAccesses);
314 Transaction t=new Transaction(accesses,true);
316 int splitpoint=(numObjects*splitobjects)/100;
317 for(int i=0;i<(accesses-1); i++) {
318 if (r.nextInt(100)<splitaccesses) {
319 boolean isRead=r.nextInt(100)<readPercent;
320 time+=getRandom(delay, deltaDelay);
321 int object=r.nextInt(splitpoint);
322 t.setObject(i, object);
325 t.setEvent(i, Transaction.READ);
327 t.setEvent(i, Transaction.WRITE);
329 boolean isRead=r.nextInt(100)<readPercentSecond;
330 time+=getRandom(delay, deltaDelay);
331 int object=r.nextInt(numObjects-splitpoint)+splitpoint;
332 t.setObject(i, object);
335 t.setEvent(i, Transaction.READ);
337 t.setEvent(i, Transaction.WRITE);
340 t.setEvent(accesses-1, Transaction.DELAY);
341 t.setObject(accesses-1, Transaction.DELAY);
342 time+=getRandom(delay, deltaDelay);
343 t.setTime(accesses-1, time);
348 private ThreadClass generateThread() {
349 int numTransactions=getRandom(numTrans, deltaTrans);
350 ThreadClass t=new ThreadClass(numTransactions*2);
351 for(int i=0;i<numTransactions;i++) {
352 Transaction trans=generateTransaction();
353 t.setTransaction(i*2, trans);
354 Transaction transdelay=new Transaction(1,true);
355 transdelay.setObject(0,Transaction.DELAY);
356 transdelay.setEvent(0,Transaction.DELAY);
357 transdelay.setTime(0, getRandom(nonTrans, deltaNonTrans));
358 t.setTransaction(i*2+1, transdelay);