ctf: Introduce IPacketReader
[deliverable/tracecompass.git] / ctf / org.eclipse.tracecompass.ctf.core / src / org / eclipse / tracecompass / ctf / core / trace / CTFTraceReader.java
index c9fc265407f5d81bfcd60870d9d4d1dfc68cb524..805c7a9a41a8ad5ba55cf9185ddc0d2df28e92aa 100644 (file)
@@ -13,6 +13,8 @@
 
 package org.eclipse.tracecompass.ctf.core.trace;
 
+import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -27,9 +29,6 @@ import org.eclipse.tracecompass.ctf.core.event.IEventDeclaration;
 import org.eclipse.tracecompass.internal.ctf.core.Activator;
 import org.eclipse.tracecompass.internal.ctf.core.trace.StreamInputReaderTimestampComparator;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSet.Builder;
-
 /**
  * A CTF trace reader. Reads the events of a trace.
  *
@@ -55,8 +54,7 @@ public class CTFTraceReader implements AutoCloseable {
     /**
      * Vector of all the trace file readers.
      */
-    private final List<CTFStreamInputReader> fStreamInputReaders =
-            Collections.synchronizedList(new ArrayList<CTFStreamInputReader>());
+    private final List<CTFStreamInputReader> fStreamInputReaders = Collections.synchronizedList(new ArrayList<CTFStreamInputReader>());
 
     /**
      * Priority queue to order the trace file readers by timestamp.
@@ -78,6 +76,11 @@ public class CTFTraceReader implements AutoCloseable {
      */
     private long fEndTime;
 
+    /**
+     * Boolean to indicate if the CTFTraceReader has been closed
+     */
+    private boolean fClosed = false;
+
     // ------------------------------------------------------------------------
     // Constructors
     // ------------------------------------------------------------------------
@@ -110,7 +113,7 @@ public class CTFTraceReader implements AutoCloseable {
          */
         fStartTime = 0;
         if (hasMoreEvents()) {
-            fStartTime = getTopStream().getCurrentEvent().getTimestamp();
+            fStartTime = checkNotNull(getTopStream().getCurrentEvent()).getTimestamp();
             setEndTime(fStartTime);
         }
     }
@@ -148,6 +151,8 @@ public class CTFTraceReader implements AutoCloseable {
             }
             fStreamInputReaders.clear();
         }
+        fPrio.clear();
+        fClosed = true;
     }
 
     // ------------------------------------------------------------------------
@@ -207,7 +212,7 @@ public class CTFTraceReader implements AutoCloseable {
                 /*
                  * Create a reader and add it to the group.
                  */
-                fStreamInputReaders.add(new CTFStreamInputReader(streamInput));
+                fStreamInputReaders.add(new CTFStreamInputReader(checkNotNull(streamInput)));
             }
         }
 
@@ -217,6 +222,16 @@ public class CTFTraceReader implements AutoCloseable {
         fEventCountPerTraceFile = new long[fStreamInputReaders.size()];
     }
 
+    /**
+     * Returns whether or not this CTFTraceReader has been closed
+     *
+     * @return true if it has been closed, false else
+     * @since 1.1
+     */
+    public boolean isClosed() {
+        return fClosed;
+    }
+
     /**
      * Update the priority queue to make it match the parent trace
      *
@@ -231,8 +246,8 @@ public class CTFTraceReader implements AutoCloseable {
                 /*
                  * Create a reader.
                  */
-                CTFStreamInputReader streamInputReader = new CTFStreamInputReader(
-                        streamInput);
+                CTFStreamInputReader streamInputReader = new CTFStreamInputReader(checkNotNull(streamInput));
+
 
                 /*
                  * Add it to the group.
@@ -260,11 +275,12 @@ public class CTFTraceReader implements AutoCloseable {
      * @return the iterable of the stream input readers
      */
     public Iterable<IEventDeclaration> getEventDeclarations() {
-        ImmutableSet.Builder<IEventDeclaration> builder = new Builder<>();
+        Set<IEventDeclaration> retSet = new HashSet<>();
         for (CTFStreamInputReader sir : fStreamInputReaders) {
-            builder.addAll(sir.getEventDeclarations());
+            retSet.addAll(sir.getEventDeclarations());
         }
-        return builder.build();
+        retSet.remove(null);
+        return retSet;
     }
 
     /**
@@ -296,7 +312,6 @@ public class CTFTraceReader implements AutoCloseable {
              * Add each trace file reader in the priority queue, if we are able
              * to read an event from it.
              */
-            reader.setParent(this);
             CTFResponse readNextEvent = reader.readNextEvent();
             if (readNextEvent == CTFResponse.OK || readNextEvent == CTFResponse.WAIT) {
                 fPrio.add(reader);
@@ -349,14 +364,15 @@ public class CTFTraceReader implements AutoCloseable {
              * Add it back in the queue.
              */
             fPrio.add(top);
-            final long topEnd = fTrace.timestampCyclesToNanos(top.getCurrentEvent().getTimestamp());
+            /*
+             * We're in OK, there's a guaranteed top#getCurrentEvent() unless another
+             * thread does something bad.
+             */
+            EventDefinition currentEvent = checkNotNull(top.getCurrentEvent());
+            final long topEnd = fTrace.timestampCyclesToNanos(currentEvent.getTimestamp());
             setEndTime(Math.max(topEnd, getEndTime()));
             fEventCountPerTraceFile[top.getName()]++;
-
-            if (top.getCurrentEvent() != null) {
-                fEndTime = Math.max(top.getCurrentEvent().getTimestamp(),
-                        fEndTime);
-            }
+            fEndTime = Math.max(currentEvent.getTimestamp(), fEndTime);
             break;
         }
         case WAIT: {
This page took 0.027152 seconds and 5 git commands to generate.