Fix ranks in CtfTmfTrace as part of bug #389051
[deliverable/tracecompass.git] / org.eclipse.linuxtools.ctf.core / src / org / eclipse / linuxtools / ctf / core / trace / CTFTraceReader.java
index 9117fc52b94fe1fde6405464c037d53b1105a284..08f9d181abd47ae95454cb1f7923544de96d338f 100644 (file)
@@ -17,8 +17,12 @@ import java.util.PriorityQueue;
 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.
  */
@@ -47,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
@@ -59,6 +63,11 @@ public class CTFTraceReader {
      */
     private long endTime;
 
+
+    protected void setEndTime(long endTime) {
+        this.endTime = endTime;
+    }
+
     // ------------------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------------------
@@ -72,6 +81,7 @@ public class CTFTraceReader {
      */
     public CTFTraceReader(CTFTrace trace) {
         this.trace = trace;
+        streamInputReaders.clear();
 
         /**
          * Create the trace file readers.
@@ -84,23 +94,25 @@ 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.startTime = 0;// prio.peek().getPacketReader().getCurrentPacket().getTimestampBegin();
+        if (hasMoreEvents()) {
+            this.startTime = prio.peek().getCurrentEvent().getTimestamp();
+            this.setEndTime(this.startTime);
+        }
     }
 
     /**
      * Copy constructor
-     *
-     * @return
      */
     public CTFTraceReader copyFrom() {
         CTFTraceReader newReader = null;
 
         newReader = new CTFTraceReader(this.trace);
         newReader.startTime = this.startTime;
-        newReader.endTime = this.endTime;
+        newReader.setEndTime(this.endTime);
         return newReader;
     }
 
@@ -111,7 +123,7 @@ public class CTFTraceReader {
     /**
      * Return the start time of this trace (== timestamp of the first event)
      *
-     * @return
+     * @return the trace start time
      */
     public long getStartTime() {
         return this.startTime;
@@ -137,6 +149,7 @@ public class CTFTraceReader {
              * For each trace file of the stream.
              */
             for (StreamInput streamInput : streamInputs) {
+                streamInput.getIndex().getEntries().clear();
                 /*
                  * Create a reader.
                  */
@@ -153,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()];
     }
 
     /**
@@ -176,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);
 
@@ -195,7 +209,7 @@ public class CTFTraceReader {
      *         of the trace.
      */
     public EventDefinition getCurrentEventDef() {
-        StreamInputReader top = this.prio.peek();
+        StreamInputReader top = getTopStream();
 
         return (top != null) ? top.getCurrentEvent() : null;
     }
@@ -206,6 +220,9 @@ public class CTFTraceReader {
      * @return True if an event was read.
      */
     public boolean advance() {
+        /*
+         * Index the
+         */
         /*
          * Remove the reader from the top of the priority queue.
          */
@@ -217,7 +234,6 @@ public class CTFTraceReader {
         if (top == null) {
             return false;
         }
-
         /*
          * Read the next event of this reader.
          */
@@ -226,11 +242,15 @@ 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 (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.
@@ -243,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();
         }
     }
 
@@ -267,14 +279,13 @@ public class CTFTraceReader {
      *
      * @param timestamp
      *            the timestamp to seek to
-     * @return
+     * @return true if the trace has more events following the timestamp
      */
     public boolean seek(long timestamp) {
         /*
          * Remove all the trace readers from the priority queue
          */
         this.prio.clear();
-
         for (StreamInputReader streamInputReader : this.streamInputReaders) {
             /*
              * Seek the trace reader.
@@ -284,14 +295,38 @@ public class CTFTraceReader {
             /*
              * 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?
      *
@@ -320,29 +355,28 @@ 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(' ');
             }
 
             sb.append("]\t" + this.eventCountPerTraceFile[se.getName()] + " Events"); //$NON-NLS-1$//$NON-NLS-2$
-            CtfCorePlugin.getDefault().log(sb.toString());
+            Activator.getDefault().log(sb.toString());
         }
     }
 
@@ -354,11 +388,10 @@ 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.hashCode());
+                + ((streamInputReaders == null) ? 0 : streamInputReaders
+                        .hashCode());
         result = (prime * result) + ((trace == null) ? 0 : trace.hashCode());
         return result;
     }
@@ -371,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;
This page took 0.028719 seconds and 5 git commands to generate.