1 import java.io.FileInputStream;
2 import java.io.InputStream;
3 import java.io.BufferedInputStream;
4 import java.util.Vector;
5 import java.util.Hashtable;
6 import java.util.Iterator;
13 Hashtable<Integer, Counter> getcounter[];
14 Hashtable<Integer, String> eventnames=new Hashtable<Integer, String>();
16 public static final int STACKMAX=512;
20 eventnames.put(CP_MAIN, "MAIN ");
21 eventnames.put(CP_RUNMALLOC,"RUNMALLOC");
22 eventnames.put(CP_RUNFREE, "RUNFREE ");
25 public void printStats() {
26 for(int i=0;i<numThreads;i++) {
27 System.out.println("Thread "+i);
28 for(Iterator<Integer> evit=getcounter[i].keySet().iterator();evit.hasNext();) {
29 Integer event=evit.next();
30 Counter c=getcounter[i].get(event);
31 String eventname=eventnames.containsKey(event)?eventnames.get(event):Integer.toString(event);
32 System.out.println("Event: "+eventname+" self time="+c.selftime+" total time="+c.totaltime+" count="+c.count);
34 System.out.println("-------------------------------------------------------------");
38 public static int readInt(InputStream is) {
44 int retval=(b4<<24)|(b3<<16)|(b2<<8)|b1;
48 } catch (Exception e) {
53 public static long readLong(InputStream is) {
63 long retval=(b8<<56)|(b7<<48)|(b6<<40)|(b5<<32)|
64 (b4<<24)|(b3<<16)|(b2<<8)|b1;
68 } catch (Exception e) {
73 int readHeader(BufferedInputStream bir) {
76 int version=readInt(bir);
78 throw new Error("Unsupported Version");
80 //Second read number of threads
82 numThreads=readInt(bir);
84 //Third read event counts for each Thread
85 eventCounts=new int[numThreads];
86 eventstack=new Event[numThreads][STACKMAX];
87 for(int i=0;i<numThreads;i++) {
88 eventCounts[i]=readInt(bir);
94 BufferedInputStream threads[];
96 public Trace(String filename) {
98 BufferedInputStream bir=null;
101 bir=new BufferedInputStream(new FileInputStream(filename));
102 offset=readHeader(bir);
104 } catch (Exception e) {
108 threads=new BufferedInputStream[numThreads];
109 getcounter=new Hashtable[numThreads];
111 for(int i=0;i<numThreads;i++) {
112 getcounter[i]=new Hashtable<Integer,Counter>();
114 threads[i]=new BufferedInputStream(new FileInputStream(filename));
117 skip-=threads[i].skip(skip);
119 offset+=4*eventCounts[i];
120 } catch (Exception e) {
127 public void readThreads() {
128 for(int i=0;i<numThreads;i++)
132 public void readThread(int t) {
133 BufferedInputStream bis=threads[t];
134 int numevents=eventCounts[t];
135 Event[] stack=eventstack[t];
136 Hashtable<Integer, Counter> countertab=getcounter[t];
141 int event=readInt(bis);
143 int baseevent=event>>CP_BASE_SHIFT;
144 i+=3; //time and event
146 switch(event&CP_MASK) {
148 enqueue(stack, depth, baseevent, time, countertab);
153 Event e=stack[depth];
154 long elapsedtime=time-e.time;
156 c.totaltime+=elapsedtime;
157 c.selftime+=elapsedtime;
159 Counter cn=stack[depth-1].counter;
160 cn.selftime-=elapsedtime;
165 Counter counter=countertab.get(event);
167 Counter c=new Counter();
168 countertab.put(event, c);
177 //get rid of last item also
179 Event e=stack[depth];
180 long elapsedtime=time-e.time;
182 c.totaltime+=elapsedtime;
183 c.selftime+=elapsedtime;
185 Counter cn=stack[depth-1].counter;
186 cn.selftime-=elapsedtime;
191 public static void enqueue(Event[] stack, int depth, int event, long time, Hashtable<Integer, Counter> getcounter) {
192 Counter counter=getcounter.get(event);
194 Counter c=new Counter();
195 getcounter.put(event, c);
199 if (stack[depth]==null) {
200 stack[depth]=new Event(time,event);
201 stack[depth].counter=counter;
203 stack[depth].time=time;
204 stack[depth].event=event;
205 stack[depth].counter=counter;
209 public static final int CP_BEGIN=0;
210 public static final int CP_END=1;
211 public static final int CP_EVENT=2;
212 public static final int CP_MASK=3;
213 public static final int CP_BASE_SHIFT=2;
215 public static final int CP_MAIN=0;
216 public static final int CP_RUNMALLOC=1;
217 public static final int CP_RUNFREE=2;
218 public static void main(String x[]) {
219 Trace t=new Trace(x[0]);