Integrate Babeltrace CTF tests and fix parsing problems
[deliverable/tracecompass.git] / org.eclipse.linuxtools.ctf.core / src / org / eclipse / linuxtools / ctf / core / trace / CTFTraceReader.java
index 2632eeaf6468ae9625ffcd27863418d7581e89ce..615efdb773083042771e4cf3d4cf9302977a8b14 100644 (file)
@@ -1,13 +1,14 @@
 /*******************************************************************************
- * Copyright (c) 2011-2012 Ericsson, Ecole Polytechnique de Montreal and others
+ * Copyright (c) 2011, 2013 Ericsson, Ecole Polytechnique de Montreal and others
  *
  * All rights reserved. This program and the accompanying materials are made
  * available under the terms of the Eclipse Public License v1.0 which
  * accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
- * Contributors: Matthew Khouzam - Initial API and implementation
- * Contributors: Alexandre Montplaisir - Initial API and implementation
+ * Contributors:
+ *     Matthew Khouzam - Initial API and implementation
+ *     Alexandre Montplaisir - Initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.linuxtools.ctf.core.trace;
@@ -19,11 +20,15 @@ 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.StreamInputReaderTimestampComparator;
+
 /**
- * Reads the events of a trace.
+ * A CTF trace reader. Reads the events of a trace.
+ *
+ * @version 1.0
+ * @author Matthew Khouzam
+ * @author Alexandre Montplaisir
  */
-
 public class CTFTraceReader {
 
     // ------------------------------------------------------------------------
@@ -48,7 +53,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,13 +65,6 @@ public class CTFTraceReader {
      */
     private long endTime;
 
-    /**
-     * Current event index
-     */
-    private long index;
-
-    private final long startIndex[];
-
     // ------------------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------------------
@@ -76,10 +74,10 @@ public class CTFTraceReader {
      *
      * @param trace
      *            The trace to read from.
-     * @throws CTFReaderException
      */
     public CTFTraceReader(CTFTrace trace) {
         this.trace = trace;
+        streamInputReaders.clear();
 
         /**
          * Create the trace file readers.
@@ -92,29 +90,43 @@ 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);
         }
     }
 
     /**
      * Copy constructor
+     *
+     * @return The new CTFTraceReader
      */
     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;
     }
 
+    /**
+     * Dispose the CTFTraceReader
+     * @since 2.0
+     */
+    public void dispose() {
+        for (StreamInputReader reader : streamInputReaders) {
+            if (reader != null) {
+                reader.dispose();
+            }
+        }
+        streamInputReaders.clear();
+    }
+
     // ------------------------------------------------------------------------
     // Getters/Setters/Predicates
     // ------------------------------------------------------------------------
@@ -129,12 +141,16 @@ public class CTFTraceReader {
     }
 
     /**
-     * @return the index
+     * Set the trace's end time
+     *
+     * @param endTime
+     *            The end time to use
      */
-    public long getIndex() {
-        return index;
+    protected void setEndTime(long endTime) {
+        this.endTime = endTime;
     }
 
+
     // ------------------------------------------------------------------------
     // Operations
     // ------------------------------------------------------------------------
@@ -171,7 +187,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()];
     }
 
     /**
@@ -194,6 +210,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);
 
@@ -238,7 +255,6 @@ public class CTFTraceReader {
         if (top == null) {
             return false;
         }
-
         /*
          * Read the next event of this reader.
          */
@@ -247,24 +263,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 = this.trace.timestampCyclesToNanos(top.getCurrentEvent().getTimestamp());
+            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) {
-                int n = this.streamInputReaders.indexOf(top);
-                StreamInputPacketIndexEntry currentPacket = packetReader
-                        .getCurrentPacket();
-                currentPacket.setIndexBegin(startIndex[n]);
-                currentPacket.setIndexEnd(index);
-                startIndex[n] = index + 1;
+
+            if (top.getCurrentEvent() != null) {
+                this.endTime = Math.max(top.getCurrentEvent().getTimestamp(),
+                        this.endTime);
             }
         }
         /*
@@ -276,21 +281,11 @@ public class CTFTraceReader {
 
     /**
      * Go to the last event in 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();
         }
     }
 
@@ -310,13 +305,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.
@@ -326,52 +319,34 @@ 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;
-        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);
-
-        }
-        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);
             }
         }
-        /*
-         * advance for offset
-         */
-        while( (prio.peek().getCurrentEvent().timestamp < tempTimestamp) && hasMoreEvents() )
-        {
-            this.advance();
-        }
-        long pos = tempIndex;
-        for (pos = tempIndex; (pos < index) && hasMoreEvents(); pos++) {
-            this.advance();
-        }
-        this.index = pos;
         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;
+//    }
+
+    /**
+     * gets the stream with the oldest event
+     *
+     * @return the stream with the oldest event
+     */
     public StreamInputReader getTopStream() {
         return this.prio.peek();
     }
@@ -404,32 +379,37 @@ 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$
-            Activator.getDefault().log(sb.toString());
+            Activator.log(sb.toString());
         }
     }
 
+    /**
+     * gets the last event timestamp that was read. This is NOT necessarily the
+     * last event in a trace, just the last one read so far.
+     *
+     * @return the last event
+     */
     public long getEndTime() {
         return this.endTime;
     }
@@ -438,11 +418,8 @@ 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());
+        result = (prime * result) + streamInputReaders.hashCode();
         result = (prime * result) + ((trace == null) ? 0 : trace.hashCode());
         return result;
     }
@@ -455,21 +432,11 @@ 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;
-            }
-        } else if (!streamInputReaders.equals(other.streamInputReaders)) {
+        if (!streamInputReaders.equals(other.streamInputReaders)) {
             return false;
         }
         if (trace == null) {
@@ -482,17 +449,17 @@ public class CTFTraceReader {
         return true;
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see java.lang.Object#toString()
-     */
     @Override
     public String toString() {
         /* Only for debugging, shouldn't be externalized */
         return "CTFTraceReader [trace=" + trace + ']'; //$NON-NLS-1$
     }
 
+    /**
+     * Gets the parent trace
+     *
+     * @return the parent trace
+     */
     public CTFTrace getTrace() {
         return trace;
     }
This page took 0.08492 seconds and 5 git commands to generate.