recovery added
[IRC.git] / Robust / TransSim / Executor.java
1 import java.util.Random;
2
3 public class Executor {
4   int numThreads;
5   int numTrans;
6   int deltaTrans;
7   int numObjects;
8   int numAccesses;
9   int deltaAccesses;
10   int delay;
11   int deltaDelay;
12   int nonTrans;
13   int deltaNonTrans;
14   int readPercent;
15   Random r;
16   ThreadClass[] threads;
17   int splitobjects;
18   int splitaccesses;
19   int readPercentSecond;
20
21   public String toString() {
22     String s="";
23     for(int i=0;i<numThreads;i++)
24       s+=threads[i].toString();
25
26     return s;
27   }
28
29   public Executor(int numThreads, int numTrans, int deltaTrans, int numObjects, int numAccesses, int deltaAccesses, int readPercent, int delay, int deltaDelay, int nonTrans, int deltaNonTrans) {
30     this(numThreads, numTrans, deltaTrans, numObjects, numAccesses, deltaAccesses, readPercent, delay, deltaDelay, nonTrans, deltaNonTrans, 100, 100, 0);
31   }
32
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, int splitobjects, int splitaccesses, int readPercentSecond) {
34     this.numThreads=numThreads;
35     this.numTrans=numTrans;
36     this.deltaTrans=deltaTrans;
37     this.numObjects=numObjects;
38     this.numAccesses=numAccesses;
39     this.deltaAccesses=deltaAccesses;
40     this.readPercent=readPercent;
41     this.delay=delay;
42     this.deltaDelay=deltaDelay;
43     this.nonTrans=nonTrans;
44     this.deltaNonTrans=deltaNonTrans;
45     this.splitobjects=splitobjects;
46     this.splitaccesses=splitaccesses;
47     this.readPercentSecond=readPercentSecond;
48     r=new Random();
49     threads=new ThreadClass[numThreads];
50     generateThreads();
51   }
52
53   public int maxTime() {
54     int maxtime=0;
55     for(int i=0;i<numThreads;i++) {
56       int time=0;
57       for(int j=0;j<getThread(i).numTransactions();j++) {
58         Transaction trans=getThread(i).getTransaction(j);
59         time+=trans.getTime(trans.numEvents()-1);
60       }
61       if (time>maxtime)
62         maxtime=time;
63     }
64     return maxtime;
65   }
66
67   public int numObjects() {
68     return numObjects;
69   }
70
71   public int numThreads() {
72     return numThreads;
73   }
74
75   public int numEvents() {
76     int events=0;
77     for(int i=0;i<numThreads();i++) {
78       events+=getThread(i).numTransactions();
79     }
80     return events;
81   }
82
83   public int maxEvents() {
84     int events=0;
85     for(int i=0;i<numThreads();i++) {
86       if (events<getThread(i).numTransactions())
87         events=getThread(i).numTransactions();
88     }
89     return events;
90   }
91
92   public ThreadClass getThread(int i) {
93     return threads[i];
94   }
95
96   private int getRandom(int base, int delta) {
97     return base+delta-r.nextInt(2*delta+1);
98   }
99   
100   public void generateThreads() {
101     for(int i=0;i<numThreads;i++) {
102       threads[i]=generateThread();
103     }
104   }
105
106   private Transaction generateTransaction() {
107     int accesses=getRandom(numAccesses, deltaAccesses);
108     Transaction t=new Transaction(accesses);
109     int time=0;
110     int splitpoint=(numObjects*splitobjects)/100;
111     for(int i=0;i<(accesses-1); i++) {
112       if (r.nextInt(100)<splitaccesses) {
113         boolean isRead=r.nextInt(100)<readPercent;
114         time+=getRandom(delay, deltaDelay);
115         int object=r.nextInt(splitpoint);
116         t.setObject(i, object);
117         t.setTime(i, time);
118         if (isRead)
119           t.setEvent(i, Transaction.READ);
120         else
121           t.setEvent(i, Transaction.WRITE);
122       } else {
123         boolean isRead=r.nextInt(100)<readPercentSecond;
124         time+=getRandom(delay, deltaDelay);
125         int object=r.nextInt(numObjects-splitpoint)+splitpoint;
126         t.setObject(i, object);
127         t.setTime(i, time);
128         if (isRead)
129           t.setEvent(i, Transaction.READ);
130         else
131           t.setEvent(i, Transaction.WRITE);
132       }
133     }
134     t.setEvent(accesses-1, Transaction.DELAY);
135     t.setObject(accesses-1, Transaction.DELAY);
136     time+=getRandom(delay, deltaDelay);
137     t.setTime(accesses-1, time);
138
139     return t;
140   }
141
142   private ThreadClass generateThread() {
143     int numTransactions=getRandom(numTrans, deltaTrans);
144     ThreadClass t=new ThreadClass(numTransactions*2);
145     for(int i=0;i<numTransactions;i++) {
146       Transaction trans=generateTransaction();
147       t.setTransaction(i*2, trans);
148       Transaction transdelay=new Transaction(1);
149       transdelay.setObject(0,Transaction.DELAY);
150       transdelay.setEvent(0,Transaction.DELAY);
151       transdelay.setTime(0, getRandom(nonTrans, deltaNonTrans));
152       t.setTransaction(i*2+1, transdelay);
153     }
154     return t;
155   }
156 }