import java.util.Set;
import java.util.Vector;
-import org.eclipse.linuxtools.ctf.core.CtfCorePlugin;
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.
*/
/**
* Array to count the number of event per trace file.
*/
- private int[] eventCountPerTraceFile;
+ private long[] eventCountPerTraceFile;
/**
* Timestamp of the first event in the trace
*/
private long endTime;
+
+ protected void setEndTime(long endTime) {
+ this.endTime = endTime;
+ }
+
// ------------------------------------------------------------------------
// Constructors
// ------------------------------------------------------------------------
*/
public CTFTraceReader(CTFTrace trace) {
this.trace = trace;
+ streamInputReaders.clear();
/**
* Create the trace file readers.
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.startTime = 0;// prio.peek().getPacketReader().getCurrentPacket().getTimestampBegin();
+ if (hasMoreEvents()) {
+ this.startTime = prio.peek().getCurrentEvent().getTimestamp();
+ this.setEndTime(this.startTime);
+ }
}
/**
newReader = new CTFTraceReader(this.trace);
newReader.startTime = this.startTime;
- newReader.endTime = this.endTime;
+ newReader.setEndTime(this.endTime);
return newReader;
}
* For each trace file of the stream.
*/
for (StreamInput streamInput : streamInputs) {
+ streamInput.getIndex().getEntries().clear();
/*
* Create a reader.
*/
/*
* 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()];
}
/**
* 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);
* of the trace.
*/
public EventDefinition getCurrentEventDef() {
- StreamInputReader top = this.prio.peek();
+ StreamInputReader top = getTopStream();
return (top != null) ? top.getCurrentEvent() : null;
}
* @return True if an event was read.
*/
public boolean advance() {
+ /*
+ * Index the
+ */
/*
* Remove the reader from the top of the priority queue.
*/
if (top == null) {
return false;
}
-
/*
* Read the next event of this reader.
*/
* 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 (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.
*
* @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();
}
}
* Remove all the trace readers from the priority queue
*/
this.prio.clear();
-
for (StreamInputReader streamInputReader : this.streamInputReaders) {
/*
* Seek the trace reader.
/*
* 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);
+
}
}
-
return hasMoreEvents();
}
+ /**
+ * 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.
+ */
+ streamInputReader.seek(0);
+ }
+ tempIndex = 0;
+ return tempIndex;
+ }
+
+ public StreamInputReader getTopStream() {
+ return this.prio.peek();
+ }
+
/**
* Does the trace have more events?
*
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(' ');
}
sb.append("]\t" + this.eventCountPerTraceFile[se.getName()] + " Events"); //$NON-NLS-1$//$NON-NLS-2$
- CtfCorePlugin.getDefault().log(sb.toString());
+ Activator.getDefault().log(sb.toString());
}
}
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.hashCode());
+ + ((streamInputReaders == null) ? 0 : streamInputReaders
+ .hashCode());
result = (prime * result) + ((trace == null) ? 0 : trace.hashCode());
return result;
}
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;