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=0de9104e6c92713235edf4046d6ae6a3e8f5544d;hpb=769f614a5d69f6585575a91e3a191412f513fd78;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 0de9104e6c..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,9 @@ 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.StreamInputPacketIndexEntry; +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. @@ -49,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 @@ -61,12 +63,10 @@ public class CTFTraceReader { */ private long endTime; - /** - * Current event index - */ - private long index; - private final long startIndex[]; + protected void setEndTime(long endTime) { + this.endTime = endTime; + } // ------------------------------------------------------------------------ // Constructors @@ -81,6 +81,7 @@ public class CTFTraceReader { */ public CTFTraceReader(CTFTrace trace) { this.trace = trace; + streamInputReaders.clear(); /** * Create the trace file readers. @@ -93,14 +94,13 @@ 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; - startIndex = new long[prio.size()]; - for (int i = 0; i < prio.size(); i++) { - startIndex[i] = 0; + this.startTime = 0;// prio.peek().getPacketReader().getCurrentPacket().getTimestampBegin(); + if (hasMoreEvents()) { + this.startTime = prio.peek().getCurrentEvent().getTimestamp(); + this.setEndTime(this.startTime); } } @@ -112,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; } @@ -129,13 +129,6 @@ public class CTFTraceReader { return this.startTime; } - /** - * @return the index - */ - public long getIndex() { - return index; - } - // ------------------------------------------------------------------------ // Operations // ------------------------------------------------------------------------ @@ -156,6 +149,7 @@ public class CTFTraceReader { * For each trace file of the stream. */ for (StreamInput streamInput : streamInputs) { + streamInput.getIndex().getEntries().clear(); /* * Create a reader. */ @@ -172,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()]; } /** @@ -195,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); @@ -239,21 +234,6 @@ public class CTFTraceReader { if (top == null) { return false; } - /* - * index if needed - */ - if (hasMoreEvents()) { - StreamInputPacketReader packetReader = top.getPacketReader(); - boolean packetHasMoreEvents = packetReader.hasMoreEvents(); - StreamInputPacketIndexEntry currentPacket = packetReader - .getCurrentPacket(); - if (!packetHasMoreEvents) { - int n = this.streamInputReaders.indexOf(top); - currentPacket.setIndexBegin(startIndex[n]); - currentPacket.setIndexEnd(index); - startIndex[n] = index + 1; - } - } /* * Read the next event of this reader. */ @@ -262,21 +242,20 @@ 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()]++; - /* - * increment the index - */ - index++; - } - boolean hasMoreEvents = hasMoreEvents(); + if (top.getCurrentEvent() != null) { + this.endTime = Math.max(top.getCurrentEvent().getTimestamp(), + this.endTime); + } + } /* * If there is no reader in the queue, it means the trace reader reached * the end of the trace. */ - return hasMoreEvents; + return hasMoreEvents(); } /** @@ -284,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(); } } @@ -315,13 +286,11 @@ public class CTFTraceReader { * Remove all the trace readers from the priority queue */ this.prio.clear(); - index = 0; - long offset = 0; for (StreamInputReader streamInputReader : this.streamInputReaders) { /* * Seek the trace reader. */ - offset += streamInputReader.seek(timestamp); + streamInputReader.seek(timestamp); /* * Add it to the priority queue if there is a current event. @@ -331,71 +300,27 @@ public class CTFTraceReader { for (StreamInputReader streamInputReader : this.streamInputReaders) { if (streamInputReader.getCurrentEvent() != null) { this.prio.add(streamInputReader); - index = Math.max(index, streamInputReader.getPacketReader() - .getCurrentPacket().getIndexBegin() - + offset); + } } return hasMoreEvents(); } - public boolean seekIndex(long index) { - this.prio.clear(); - - long tempIndex = Long.MIN_VALUE; - long tempTimestamp = Long.MIN_VALUE; - try { - for (StreamInputReader streamInputReader : this.streamInputReaders) { - /* - * Seek the trace reader. - */ - final long streamIndex = streamInputReader.seekIndex(index); - tempIndex = Math.max(tempIndex, streamIndex); - tempTimestamp = Math.max(tempTimestamp, - streamInputReader.getCurrentEvent().timestamp); - - } - } catch (CTFReaderException e) { - /* - * Important, if it failed, it's because it's not yet indexed, so we - * have to manually advance to the right value. - */ - for (StreamInputReader streamInputReader : this.streamInputReaders) { - /* - * Seek the trace reader. - */ - streamInputReader.seek(0); - } - tempIndex = 0; - } + /** + * Go to the first entry of a trace + * + * @return 0, the first index. + */ + private long goToZero() { + long tempIndex; for (StreamInputReader streamInputReader : this.streamInputReaders) { /* - * Add it to the priority queue if there is a current event. - */ - - if (streamInputReader.getCurrentEvent() != null) { - this.prio.add(streamInputReader); - } - } - if (tempIndex == Long.MAX_VALUE) { - tempIndex = 0; - } - long pos = tempIndex; - if (index > tempIndex) { - /* - * advance for offset + * Seek the trace reader. */ - while ((prio.peek().getCurrentEvent().timestamp < tempTimestamp) - && hasMoreEvents()) { - this.advance(); - } - - for (pos = tempIndex; (pos < index) && hasMoreEvents(); pos++) { - this.advance(); - } + streamInputReader.seek(0); } - this.index = pos; - return hasMoreEvents(); + tempIndex = 0; + return tempIndex; } public StreamInputReader getTopStream() { @@ -430,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(' '); } @@ -464,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 @@ -481,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;