From: Matthew Khouzam Date: Sat, 11 Apr 2015 03:31:51 +0000 (-0400) Subject: ctf.core: add populate indexes and fix seek last event X-Git-Url: http://git.efficios.com/?a=commitdiff_plain;h=4a32dd11f23dcb9aca302d4d7852e6e0b08cbc61;p=deliverable%2Ftracecompass.git ctf.core: add populate indexes and fix seek last event Add much needed documentation to goToLastEvent. It is not as trivial as one would think. Change-Id: Ia2834df70f583430afc1a7046993809c9262a690 Signed-off-by: Matthew Khouzam Reviewed-on: https://git.eclipse.org/r/45689 Reviewed-by: Hudson CI Reviewed-by: Bernd Hufmann Tested-by: Bernd Hufmann --- diff --git a/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFStreamInputReader.java b/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFStreamInputReader.java index 8a8dc2d617..9c62495f54 100644 --- a/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFStreamInputReader.java +++ b/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFStreamInputReader.java @@ -362,17 +362,14 @@ public class CTFStreamInputReader implements AutoCloseable { * if an error occurs */ public void goToLastEvent() throws CTFException { - /* - * Search in the index for the packet to search in. - */ - final int len = fStreamInput.getIndex().size(); /* - * Go to beginning of trace. + * Go to the beginning of the trace */ seek(0); + /* - * if the trace is empty. + * Check that there is at least one event */ if ((fStreamInput.getIndex().isEmpty()) || (!fPacketReader.hasMoreEvents())) { /* @@ -380,12 +377,28 @@ public class CTFStreamInputReader implements AutoCloseable { */ return; } + + fPacketIndex = fStreamInput.getIndex().size() - 1; + /* + * Go to last indexed packet + */ + fPacketReader.setCurrentPacket(getPacket()); + + /* + * Keep going until you cannot + */ + while (fPacketReader.getCurrentPacket() != null) { + goToNextPacket(); + } + + final int lastPacketIndex = fStreamInput.getIndex().size() - 1; /* * Go to the last packet that contains events. */ - for (int pos = len - 1; pos > 0; pos--) { + for (int pos = lastPacketIndex; pos > 0; pos--) { fPacketIndex = pos; fPacketReader.setCurrentPacket(getPacket()); + if (fPacketReader.hasMoreEvents()) { break; } diff --git a/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceReader.java b/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceReader.java index 6286da118b..c9fc265407 100644 --- a/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceReader.java +++ b/org.eclipse.tracecompass.ctf.core/src/org/eclipse/tracecompass/ctf/core/trace/CTFTraceReader.java @@ -567,4 +567,22 @@ public class CTFTraceReader implements AutoCloseable { public CTFTrace getTrace() { return fTrace; } + + /** + * This will read the entire trace and populate all the indexes. The reader + * will then be reset to the first event in the trace. + * + * Do not call in the fast path. + * + * @throws CTFException + * A trace reading error occurred + * @since 1.0 + */ + public void populateIndex() throws CTFException { + for (CTFStreamInputReader sir : fPrio) { + sir.goToLastEvent(); + } + seek(0); + + } }