import java.util.function.Predicate;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
}
}
+ // ------------------------------------------------------------------------
+ // Forwards searches
+ // ------------------------------------------------------------------------
+
/**
* Test the {@link TmfTraceUtils#getNextEventMatching} method.
*/
Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("sched_switch");
- ITmfEvent actualEvent = TmfTraceUtils.getNextEventMatching(trace, START_RANK, predicate);
+ ITmfEvent actualEvent = TmfTraceUtils.getNextEventMatching(trace, START_RANK, predicate, null);
+
+ ITmfContext ctx = trace.seekEvent(508L); // following sched_switch event
+ ITmfEvent expectedEvent = trace.getNext(ctx);
+
+ assertEquals(expectedEvent, actualEvent);
+ }
+
+ /**
+ * Test that the presence of progress monitor does not affect the results.
+ */
+ @Test
+ public void testNextMatchingEventProgressMonitor() {
+ ITmfTrace trace = fTrace;
+ assertNotNull(trace);
+
+ Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("sched_switch");
+
+ IProgressMonitor monitor = new NullProgressMonitor();
+ ITmfEvent actualEvent = TmfTraceUtils.getNextEventMatching(trace, START_RANK, predicate, monitor);
ITmfContext ctx = trace.seekEvent(508L); // following sched_switch event
ITmfEvent expectedEvent = trace.getNext(ctx);
Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("non-existent-event");
- ITmfEvent actualEvent = TmfTraceUtils.getNextEventMatching(trace, START_RANK, predicate);
+ ITmfEvent actualEvent = TmfTraceUtils.getNextEventMatching(trace, START_RANK, predicate, null);
assertNull(actualEvent);
}
assertNotNull(trace);
Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("softirq_raise");
- ITmfEvent foundEvent = TmfTraceUtils.getNextEventMatching(trace, START_RANK, predicate);
+ ITmfEvent foundEvent = TmfTraceUtils.getNextEventMatching(trace, START_RANK, predicate, null);
assertNotNull(foundEvent);
assertNotEquals(fStartEvent, foundEvent);
}
+ /**
+ * Test with a progress monitor that cancels the job.
+ */
+ @Test
+ public void testNextMatchingEventCancelled() {
+ ITmfTrace trace = fTrace;
+ assertNotNull(trace);
+
+ Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("sched_switch");
+
+ IProgressMonitor monitor = new NullProgressMonitor();
+ monitor.setCanceled(true);
+ ITmfEvent actualEvent = TmfTraceUtils.getNextEventMatching(trace, START_RANK, predicate, monitor);
+
+ /* No event should be returend */
+ assertNull(actualEvent);
+ }
+
+ // ------------------------------------------------------------------------
+ // Backwards searches
+ // ------------------------------------------------------------------------
+
/**
* Test the {@link TmfTraceUtils#getPreviousEventMatching} method.
*/
Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("sched_switch");
- ITmfEvent actualEvent = TmfTraceUtils.getPreviousEventMatching(trace, START_RANK, predicate);
+ ITmfEvent actualEvent = TmfTraceUtils.getPreviousEventMatching(trace, START_RANK, predicate, null);
+
+ ITmfContext ctx = trace.seekEvent(455L); // previous sched_switch event
+ ITmfEvent expectedEvent = trace.getNext(ctx);
+
+ assertEquals(expectedEvent, actualEvent);
+ }
+
+ /**
+ * Test that the presence of progress monitor does not affect the results.
+ */
+ @Test
+ public void testPreviousMatchingEventProgressMonitor() {
+ ITmfTrace trace = fTrace;
+ assertNotNull(trace);
+
+ Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("sched_switch");
+
+ IProgressMonitor monitor = new NullProgressMonitor();
+ ITmfEvent actualEvent = TmfTraceUtils.getPreviousEventMatching(trace, START_RANK, predicate, monitor);
ITmfContext ctx = trace.seekEvent(455L); // previous sched_switch event
ITmfEvent expectedEvent = trace.getNext(ctx);
Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("non-existent-event");
- ITmfEvent actualEvent = TmfTraceUtils.getPreviousEventMatching(trace, START_RANK, predicate);
+ ITmfEvent actualEvent = TmfTraceUtils.getPreviousEventMatching(trace, START_RANK, predicate, null);
assertNull(actualEvent);
}
assertNotNull(trace);
Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("softirq_raise");
- ITmfEvent foundEvent = TmfTraceUtils.getPreviousEventMatching(trace, START_RANK, predicate);
+ ITmfEvent foundEvent = TmfTraceUtils.getPreviousEventMatching(trace, START_RANK, predicate, null);
assertNotNull(foundEvent);
assertNotEquals(fStartEvent, foundEvent);
assertNotNull(trace);
Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("sys_write");
- ITmfEvent actualEvent = TmfTraceUtils.getPreviousEventMatching(trace, START_RANK, predicate);
+ ITmfEvent actualEvent = TmfTraceUtils.getPreviousEventMatching(trace, START_RANK, predicate, null);
ITmfContext ctx = trace.seekEvent(387L); // previous sched_switch event
ITmfEvent expectedEvent = trace.getNext(ctx);
/* There is a sys_mmap at rank 6, it should not be matched! */
Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("sys_mmap");
- ITmfEvent foundEvent = TmfTraceUtils.getPreviousEventMatching(trace, startRank, predicate);
+ ITmfEvent foundEvent = TmfTraceUtils.getPreviousEventMatching(trace, startRank, predicate, null);
assertNull(foundEvent);
/* Do not match the event itself either, or any later "exit_syscall" */
predicate = event -> event.getName().equals("exit_syscall");
- foundEvent = TmfTraceUtils.getPreviousEventMatching(trace, startRank, predicate);
+ foundEvent = TmfTraceUtils.getPreviousEventMatching(trace, startRank, predicate, null);
assertNull(foundEvent);
}
+
+ /**
+ * Test with a progress monitor that cancels the job.
+ */
+ @Test
+ public void testPreviousMatchingEventCancelled() {
+ ITmfTrace trace = fTrace;
+ assertNotNull(trace);
+
+ Predicate<@NonNull ITmfEvent> predicate = event -> event.getName().equals("sched_switch");
+
+ IProgressMonitor monitor = new NullProgressMonitor();
+ monitor.setCanceled(true);
+ ITmfEvent actualEvent = TmfTraceUtils.getPreviousEventMatching(trace, START_RANK, predicate, monitor);
+
+ /* No event should be returend */
+ assertNull(actualEvent);
+ }
}
import java.util.Optional;
import java.util.function.Predicate;
+import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.NonNullByDefault;
import org.eclipse.jdt.annotation.Nullable;
* <code>0</code> to search from the start of the trace.
* @param predicate
* The predicate to test events against
+ * @param monitor
+ * Optional progress monitor that can be used to cancel the
+ * operation
* @return The first event matching the predicate, or null if the end of the
* trace was reached and no event was found
* @since 2.1
*/
- public static @Nullable ITmfEvent getNextEventMatching(ITmfTrace trace, long startRank, Predicate<ITmfEvent> predicate) {
+ public static @Nullable ITmfEvent getNextEventMatching(ITmfTrace trace, long startRank,
+ Predicate<ITmfEvent> predicate, @Nullable IProgressMonitor monitor) {
/* rank + 1 because we do not want to include the start event itself in the search */
EventMatchingRequest req = new EventMatchingRequest(startRank + 1, predicate, false);
trace.sendRequest(req);
try {
+ /* Check periodically if the job was cancelled */
+ req.waitForStart();
+ while (req.isRunning()) {
+ Thread.sleep(200);
+ if (monitor != null && monitor.isCanceled()) {
+ req.cancel();
+ return null;
+ }
+ }
req.waitForCompletion();
} catch (InterruptedException e) {
return null;
* The rank of the event at which to start searching backwards.
* @param predicate
* The predicate to test events against
+ * @param monitor Optional progress monitor that can be used to cancel the
+ * operation
* @return The first event found matching the predicate, or null if the
* beginning of the trace was reached and no event was found
* @since 2.1
*/
- public static @Nullable ITmfEvent getPreviousEventMatching(ITmfTrace trace, long startRank, Predicate<ITmfEvent> predicate) {
+ public static @Nullable ITmfEvent getPreviousEventMatching(ITmfTrace trace, long startRank,
+ Predicate<ITmfEvent> predicate, @Nullable IProgressMonitor monitor) {
/*
* 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
List<ITmfEvent> list = new ArrayList<>(step);
ArrayFillingRequest req = new ArrayFillingRequest(currentRank, step, list);
trace.sendRequest(req);
+
+ /* Check periodically if the job was cancelled */
+ req.waitForStart();
+ while (req.isRunning()) {
+ Thread.sleep(200);
+ if (monitor != null && monitor.isCanceled()) {
+ req.cancel();
+ return null;
+ }
+ }
req.waitForCompletion();
Optional<ITmfEvent> matchingEvent = Lists.reverse(list).stream()