X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=tmf%2Forg.eclipse.tracecompass.tmf.core%2Fsrc%2Forg%2Feclipse%2Ftracecompass%2Ftmf%2Fcore%2Ftrace%2FTmfTraceUtils.java;h=b32bc6487b60ae960ee0b7bf14a376b3533c94bf;hb=c93f91d94629ecd8e8bf2e398d22439de59ea428;hp=cc47c59e7c353060cf73fd750cab95fb029670f5;hpb=4a6f397f22de6f5c51e22a6fe9ce48fdac423205;p=deliverable%2Ftracecompass.git diff --git a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java index cc47c59e7c..b32bc6487b 100644 --- a/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java +++ b/tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/trace/TmfTraceUtils.java @@ -20,6 +20,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.function.Predicate; import org.eclipse.jdt.annotation.NonNull; @@ -33,6 +34,7 @@ import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect; import org.eclipse.tracecompass.tmf.core.request.TmfEventRequest; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; /** * Utility methods for ITmfTrace's. @@ -226,30 +228,37 @@ public final class TmfTraceUtils { */ public static @Nullable ITmfEvent getPreviousEventMatching(ITmfTrace trace, long startRank, Predicate predicate) { /* - * Slightly less straightforward since we unfortunately cannot iterate - * backwards on events. Do a series of forward-queries. + * We are going to do a series of queries matching the trace's cache + * size in length (which should minimize on-disk seeks), then iterate on + * the found events in reverse order until we find a match. */ - final int targetStep = 100; + int step = trace.getCacheSize(); /* * If we are close to the beginning of the trace, make sure we only look * for the events before the startRank. */ - int step = (startRank < targetStep ? (int) startRank : targetStep); + if (startRank < step) { + step = (int) startRank; + } long currentRank = startRank; try { while (currentRank > 0) { currentRank = Math.max(currentRank - step, 0); - EventMatchingRequest req = new EventMatchingRequest(currentRank, step, predicate, true); + List list = new ArrayList<>(step); + ArrayFillingRequest req = new ArrayFillingRequest(currentRank, step, list); trace.sendRequest(req); req.waitForCompletion(); - ITmfEvent event = req.getFoundEvent(); - if (event != null) { - /* We found an actual event, return it! */ - return event; + Optional matchingEvent = Lists.reverse(list).stream() + .filter(predicate) + .findFirst(); + + if (matchingEvent.isPresent()) { + /* We found an event matching, return it! */ + return matchingEvent.get(); } /* Keep searching, next loop */ @@ -332,4 +341,25 @@ public final class TmfTraceUtils { } } } + + /** + * Event request that simply puts all returned events into a list passed in + * parameter. + */ + private static class ArrayFillingRequest extends TmfEventRequest { + + private final List fList; + + public ArrayFillingRequest(long startRank, int limit, List listToFill) { + super(ITmfEvent.class, startRank, limit, ExecutionType.FOREGROUND); + fList = listToFill; + } + + @Override + public void handleData(ITmfEvent event) { + super.handleData(event); + fList.add(event); + } + + } }