From ec6f5bebe05b98a86b1404117e3cd737470552d7 Mon Sep 17 00:00:00 2001 From: Matthew Khouzam Date: Tue, 15 May 2012 14:26:54 -0400 Subject: [PATCH] Fix go to last event. --- .../tests/trace/StreamInputReaderTest.java | 27 ++++++++- .../ctf/core/trace/StreamInputReader.java | 55 ++++++++++++------- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/org.eclipse.linuxtools.ctf.core.tests/src/org/eclipse/linuxtools/ctf/core/tests/trace/StreamInputReaderTest.java b/org.eclipse.linuxtools.ctf.core.tests/src/org/eclipse/linuxtools/ctf/core/tests/trace/StreamInputReaderTest.java index bcc7da2ffd..a7c284e07f 100644 --- a/org.eclipse.linuxtools.ctf.core.tests/src/org/eclipse/linuxtools/ctf/core/tests/trace/StreamInputReaderTest.java +++ b/org.eclipse.linuxtools.ctf.core.tests/src/org/eclipse/linuxtools/ctf/core/tests/trace/StreamInputReaderTest.java @@ -146,8 +146,33 @@ public class StreamInputReaderTest { * @throws CTFReaderException */ @Test - public void testGoToLastEvent() throws CTFReaderException { + public void testGoToLastEvent1() throws CTFReaderException { + final long endTimestamp = goToEnd(); + final long endTime = 4287422460315L; + assertEquals(endTime , endTimestamp ); + } + + /** + * Run the void goToLastEvent() method test. + * + * @throws CTFReaderException + */ + @Test + public void testGoToLastEvent2() throws CTFReaderException { + long timestamp = -1; + while(fixture.readNextEvent()) { + timestamp = fixture.getCurrentEvent().getTimestamp(); + } + long endTimestamp = goToEnd(); + assertEquals(0 , timestamp- endTimestamp ); + } + + /** + * @throws CTFReaderException + */ + private long goToEnd() throws CTFReaderException { fixture.goToLastEvent(); + return fixture.getCurrentEvent().getTimestamp(); } /** diff --git a/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/StreamInputReader.java b/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/StreamInputReader.java index 8ec6291aaf..492734a553 100644 --- a/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/StreamInputReader.java +++ b/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/StreamInputReader.java @@ -233,30 +233,45 @@ public class StreamInputReader { /* * Search in the index for the packet to search in. */ - int len = this.streamInput.getIndex().getEntries().size(); - int back = 0; - long desired_timestamp = -1; - do { - back++; - StreamInputPacketIndexEntry entry = this.streamInput.getIndex() - .getEntries().get(len - back); - desired_timestamp = entry.getTimestampBegin() + 1; - seek(desired_timestamp); - - } while (!this.packetReader.hasMoreEvents()); + final int len = this.streamInput.getIndex().getEntries().size(); + + StreamInputPacketIndexEntry entry = null; /* - * Go until the end of that packet + * Go to beginning of trace. */ - - int packet_size = 0; - while (this.packetReader.hasMoreEvents()) { - this.packetReader.readNextEvent(); - packet_size++; + seek(0); + /* + * if the trace is empty. + */ + if((len == 0) ||(this.packetReader.hasMoreEvents() == false)) { + /* + * This means the trace is empty. abort. + */ + return; } - seek(desired_timestamp); - for (int i = 0; i < (packet_size - 1); i++) { - this.packetReader.readNextEvent(); + /* + * Go to the last packet that contains events. + */ + for( int pos = len -1 ; pos > 0 ; pos--){ + entry = this.streamInput.getIndex().getEntries().get(pos); + this.packetReader.setCurrentPacket(entry); + if(this.packetReader.hasMoreEvents()) { + break; + } } + + /* + * Go until the end of that packet + */ + EventDefinition prevEvent = null; + while (this.currentEvent != null) { + prevEvent = this.currentEvent; + this.readNextEvent(); + } + /* + * Go back to the previous event + */ + this.setCurrentEvent(prevEvent); } public void setCurrentEvent(EventDefinition currentEvent) { -- 2.34.1