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;
import java.util.Set;
import org.eclipse.tracecompass.ctf.core.CTFException;
-import org.eclipse.tracecompass.ctf.core.event.EventDefinition;
import org.eclipse.tracecompass.ctf.core.event.IEventDeclaration;
+import org.eclipse.tracecompass.ctf.core.event.IEventDefinition;
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.
*
/**
* 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.
*/
fStartTime = 0;
if (hasMoreEvents()) {
- fStartTime = getTopStream().getCurrentEvent().getTimestamp();
+ fStartTime = checkNotNull(getTopStream().getCurrentEvent()).getTimestamp();
setEndTime(fStartTime);
}
}
/*
* For each stream.
*/
- for (CTFStream stream : fTrace.getStreams()) {
+ for (ICTFStream stream : fTrace.getStreams()) {
Set<CTFStreamInput> streamInputs = stream.getStreamInputs();
/*
/*
* Create a reader and add it to the group.
*/
- fStreamInputReaders.add(new CTFStreamInputReader(streamInput));
+ fStreamInputReaders.add(new CTFStreamInputReader(checkNotNull(streamInput)));
}
}
* Returns whether or not this CTFTraceReader has been closed
*
* @return true if it has been closed, false else
- * @since 2.0
+ * @since 1.1
*/
public boolean isClosed() {
return fClosed;
*/
public void update() throws CTFException {
Set<CTFStreamInputReader> readers = new HashSet<>();
- for (CTFStream stream : fTrace.getStreams()) {
+ for (ICTFStream stream : fTrace.getStreams()) {
Set<CTFStreamInput> streamInputs = stream.getStreamInputs();
for (CTFStreamInput streamInput : streamInputs) {
/*
- * Create a reader.
- */
- CTFStreamInputReader streamInputReader = new CTFStreamInputReader(
- streamInput);
-
- /*
- * Add it to the group.
+ * Create a reader to check if it already exists in the list. If it doesn't, add it.
*/
- if (!fStreamInputReaders.contains(streamInputReader)) {
- streamInputReader.readNextEvent();
- fStreamInputReaders.add(streamInputReader);
- readers.add(streamInputReader);
+ try (CTFStreamInputReader streamInputReader = new CTFStreamInputReader(checkNotNull(streamInput))) {
+ if (!fStreamInputReaders.contains(streamInputReader)) {
+ CTFStreamInputReader streamInputReaderToAdd = new CTFStreamInputReader(checkNotNull(streamInput));
+ streamInputReaderToAdd.readNextEvent();
+ fStreamInputReaders.add(streamInputReaderToAdd);
+ readers.add(streamInputReaderToAdd);
+ }
+ } catch (IOException e) {
+ Activator.logError(e.getMessage(), e);
}
}
}
* @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;
}
/**
*
* @return An event definition, or null of the trace reader reached the end
* of the trace.
+ * @since 2.0
*/
- public EventDefinition getCurrentEventDef() {
+ public IEventDefinition getCurrentEventDef() {
CTFStreamInputReader top = getTopStream();
return (top != null) ? top.getCurrentEvent() : null;
}
* 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.
+ */
+ IEventDefinition 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: {