X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=org.eclipse.linuxtools.ctf.core%2Fsrc%2Forg%2Feclipse%2Flinuxtools%2Fctf%2Fcore%2Ftrace%2FCTFTraceReader.java;h=08f9d181abd47ae95454cb1f7923544de96d338f;hb=4a1108602318db28683d50e17642d73074a10c1b;hp=deabd946f39643a89ad5d548900639e9c15f670a;hpb=0665602195cc8deee433b92234b136464a1813ce;p=deliverable%2Ftracecompass.git diff --git a/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFTraceReader.java b/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFTraceReader.java index deabd946f3..08f9d181ab 100644 --- a/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFTraceReader.java +++ b/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFTraceReader.java @@ -19,7 +19,10 @@ import java.util.Vector; import org.eclipse.linuxtools.ctf.core.event.EventDefinition; import org.eclipse.linuxtools.internal.ctf.core.Activator; - +import org.eclipse.linuxtools.internal.ctf.core.trace.Stream; +import org.eclipse.linuxtools.internal.ctf.core.trace.StreamInput; +import org.eclipse.linuxtools.internal.ctf.core.trace.StreamInputReaderTimestampComparator; + /** * Reads the events of a trace. */ @@ -48,7 +51,7 @@ public class CTFTraceReader { /** * Array to count the number of event per trace file. */ - private int[] eventCountPerTraceFile; + private long[] eventCountPerTraceFile; /** * Timestamp of the first event in the trace @@ -60,12 +63,10 @@ public class CTFTraceReader { */ private long endTime; - /** - * Current event index - */ - private long index; - private long startIndex; + protected void setEndTime(long endTime) { + this.endTime = endTime; + } // ------------------------------------------------------------------------ // Constructors @@ -80,6 +81,7 @@ public class CTFTraceReader { */ public CTFTraceReader(CTFTrace trace) { this.trace = trace; + streamInputReaders.clear(); /** * Create the trace file readers. @@ -92,11 +94,14 @@ public class CTFTraceReader { populateStreamInputReaderHeap(); /** - * Get the start Time of this trace + * Get the start Time of this trace bear in mind that the trace could be + * empty. */ - this.startTime = prio.peek().getCurrentEvent().timestamp; - this.endTime = this.startTime; - this.index = 0; + this.startTime = 0;// prio.peek().getPacketReader().getCurrentPacket().getTimestampBegin(); + if (hasMoreEvents()) { + this.startTime = prio.peek().getCurrentEvent().getTimestamp(); + this.setEndTime(this.startTime); + } } /** @@ -107,7 +112,7 @@ public class CTFTraceReader { newReader = new CTFTraceReader(this.trace); newReader.startTime = this.startTime; - newReader.endTime = this.endTime; + newReader.setEndTime(this.endTime); return newReader; } @@ -124,13 +129,6 @@ public class CTFTraceReader { return this.startTime; } - /** - * @return the index - */ - public long getIndex() { - return index; - } - // ------------------------------------------------------------------------ // Operations // ------------------------------------------------------------------------ @@ -151,6 +149,7 @@ public class CTFTraceReader { * For each trace file of the stream. */ for (StreamInput streamInput : streamInputs) { + streamInput.getIndex().getEntries().clear(); /* * Create a reader. */ @@ -167,7 +166,7 @@ public class CTFTraceReader { /* * Create the array to count the number of event per trace file. */ - this.eventCountPerTraceFile = new int[this.streamInputReaders.size()]; + this.eventCountPerTraceFile = new long[this.streamInputReaders.size()]; } /** @@ -190,6 +189,7 @@ public class CTFTraceReader { * Add each trace file reader in the priority queue, if we are able * to read an event from it. */ + reader.setParent(this); if (reader.readNextEvent()) { this.prio.add(reader); @@ -234,7 +234,6 @@ public class CTFTraceReader { if (top == null) { return false; } - /* * Read the next event of this reader. */ @@ -243,23 +242,13 @@ public class CTFTraceReader { * Add it back in the queue. */ this.prio.add(top); - final long topEnd = top.getCurrentEvent().timestamp; - this.endTime = Math.max(topEnd, this.endTime); + final long topEnd = top.getCurrentEvent().getTimestamp() + this.getTrace().getOffset(); + this.setEndTime( Math.max(topEnd, this.getEndTime())); this.eventCountPerTraceFile[top.getName()]++; - } - if(hasMoreEvents()) - { - /* - * increment the index - */ - index++; - StreamInputPacketReader packetReader = top.getPacketReader(); - if (packetReader.hasMoreEvents() == false) { - StreamInputPacketIndexEntry currentPacket = packetReader - .getCurrentPacket(); - currentPacket.indexBegin = startIndex; - currentPacket.rankEnd = index; - startIndex = index + 1; + + if (top.getCurrentEvent() != null) { + this.endTime = Math.max(top.getCurrentEvent().getTimestamp(), + this.endTime); } } /* @@ -274,18 +263,10 @@ public class CTFTraceReader { * * @throws CTFReaderException */ - public void goToLastEvent() throws CTFReaderException { - - this.seek(0); - for (StreamInputReader streamInputReader : this.streamInputReaders) { - /* - * Seek the trace reader. - */ - streamInputReader.goToLastEvent(); - } - int count = prio.size(); - for (int i = 0; i < (count); i++) { - advance(); + public void goToLastEvent() { + seek(this.getEndTime()); + while (this.prio.size() > 1) { + this.advance(); } } @@ -305,52 +286,41 @@ public class CTFTraceReader { * Remove all the trace readers from the priority queue */ this.prio.clear(); - index = 0; for (StreamInputReader streamInputReader : this.streamInputReaders) { /* * Seek the trace reader. */ - long offset = streamInputReader.seek(timestamp); + streamInputReader.seek(timestamp); /* * Add it to the priority queue if there is a current event. */ + + } + for (StreamInputReader streamInputReader : this.streamInputReaders) { if (streamInputReader.getCurrentEvent() != null) { this.prio.add(streamInputReader); - index = Math.max(index, streamInputReader.getPacketReader() - .getCurrentPacket().indexBegin + offset); + } } - return hasMoreEvents(); } - public boolean seekIndex( long index ) - { - this.prio.clear(); - this.index = index; - long tempIndex = Long.MAX_VALUE; + /** + * Go to the first entry of a trace + * + * @return 0, the first index. + */ + private long goToZero() { + long tempIndex; for (StreamInputReader streamInputReader : this.streamInputReaders) { /* * Seek the trace reader. */ - tempIndex = Math.min(tempIndex, streamInputReader.seekBeforeIndex(index)); - - /* - * Add it to the priority queue if there is a current event. - */ - if (streamInputReader.getCurrentEvent() != null) { - this.prio.add(streamInputReader); - } - } - /* - * advance for offset - */ - for( long pos = tempIndex; (pos < index) && hasMoreEvents(); pos++){ - this.advance(); + streamInputReader.seek(0); } - - return hasMoreEvents(); + tempIndex = 0; + return tempIndex; } public StreamInputReader getTopStream() { @@ -385,24 +355,23 @@ public class CTFTraceReader { return; } - for (int i : this.eventCountPerTraceFile) { + for (long i : this.eventCountPerTraceFile) { numEvents += i; } for (int j = 0; j < this.eventCountPerTraceFile.length; j++) { StreamInputReader se = this.streamInputReaders.get(j); - int len = (width * this.eventCountPerTraceFile[se.getName()]) + long len = (width * this.eventCountPerTraceFile[se.getName()]) / numEvents; - StringBuilder sb = new StringBuilder(se.getStreamInput() - .getFilename() + "\t["); //$NON-NLS-1$ + StringBuilder sb = new StringBuilder(se.getFilename() + "\t["); //$NON-NLS-1$ for (int i = 0; i < len; i++) { sb.append('+'); } - for (int i = len; i < width; i++) { + for (long i = len; i < width; i++) { sb.append(' '); } @@ -419,7 +388,6 @@ public class CTFTraceReader { public int hashCode() { final int prime = 31; int result = 1; - result = (prime * result) + (int) (endTime ^ (endTime >>> 32)); result = (prime * result) + (int) (startTime ^ (startTime >>> 32)); result = (prime * result) + ((streamInputReaders == null) ? 0 : streamInputReaders @@ -436,16 +404,10 @@ public class CTFTraceReader { if (obj == null) { return false; } - if (getClass() != obj.getClass()) { + if (!(obj instanceof CTFTraceReader)) { return false; } CTFTraceReader other = (CTFTraceReader) obj; - if (endTime != other.endTime) { - return false; - } - if (startTime != other.startTime) { - return false; - } if (streamInputReaders == null) { if (other.streamInputReaders != null) { return false;