diff options
Diffstat (limited to 'lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/internal/ctf/core/trace/StreamInputPacketIndex.java')
-rw-r--r-- | lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/internal/ctf/core/trace/StreamInputPacketIndex.java | 50 |
1 files changed, 16 insertions, 34 deletions
diff --git a/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/internal/ctf/core/trace/StreamInputPacketIndex.java b/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/internal/ctf/core/trace/StreamInputPacketIndex.java index ef74805e13..5532ad04fa 100644 --- a/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/internal/ctf/core/trace/StreamInputPacketIndex.java +++ b/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/internal/ctf/core/trace/StreamInputPacketIndex.java @@ -8,6 +8,8 @@ * * Contributors: Matthew Khouzam - Initial API and implementation * Contributors: Simon Marchi - Initial API and implementation + * Contributors: Etienne Bergeron <etienne.bergeron@gmail.com> + * Contributors: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> *******************************************************************************/ package org.eclipse.linuxtools.internal.ctf.core.trace; @@ -99,9 +101,9 @@ public class StreamInputPacketIndex { } /** - * Given a timestamp, this methods returns the first PacketIndexEntry that - * could include the timestamp, that is the last packet with a begin - * timestamp smaller than the given timestamp. + * This method returns the first packet with the end timestamp greater + * or equal to the given timestamp. The returned packet is the first one + * that could include the timestamp. * * @param timestamp * The timestamp to look for. @@ -129,14 +131,12 @@ public class StreamInputPacketIndex { throw new IllegalArgumentException("timestamp is negative"); //$NON-NLS-1$ } + /* Binary search */ for (;;) { /* - * Guess in the middle of min and max. The +1 is so that in case - * (min + 1 == max), we choose the packet at the subscript "max" - * instead of the one at "min". Otherwise, it would give an infinite - * loop. + * Guess in the middle of min and max. */ - guessI = (max + min + 1) / 2; + guessI = min + ((max - min) / 2); guessEntry = this.entries.get(guessI); /* @@ -147,36 +147,18 @@ public class StreamInputPacketIndex { break; } - if (timestamp < guessEntry.getTimestampBegin()) { + if (timestamp <= guessEntry.getTimestampEnd()) { /* - * If the timestamp if before the begin timestamp, we know that - * the packet to return is before the guess. + * If the timestamp is lower or equal to the end of the guess packet, + * then the guess packet becomes the new inclusive max. */ - max = guessI - 1; - } else if (timestamp > guessEntry.getTimestampBegin()) { + max = guessI; + } else { /* - * If the timestamp is after the begin timestamp, we know that - * the packet to return is after the guess or is the guess. + * If the timestamp is greater than the end of the guess packet, then + * the new inclusive min is the packet after the guess packet. */ - min = guessI; - } else if (timestamp == guessEntry.getTimestampBegin()) { - /* - * If the timestamp is equal to the begin timestamp, we want to - * return the first packetIndexEntry that have this timestamp. - */ - if (guessI > 0) { - StreamInputPacketIndexEntry previousGuessEntry = this.entries.get(guessI - 1); - while (guessI > 0 && guessEntry.getTimestampBegin() == previousGuessEntry.getTimestampBegin()) { - guessEntry = previousGuessEntry; - guessI--; - if (guessI - 1 >= 0) { - previousGuessEntry = this.entries.get(guessI - 1); - } - } - min = guessI; - max = guessI; - } - + min = guessI + 1; } } |