From 9aedec8eabaa16920849c40adab841032dd142dc Mon Sep 17 00:00:00 2001 From: =?utf8?q?Genevi=C3=A8ve=20Bastien?= Date: Thu, 28 Apr 2016 12:44:40 -0400 Subject: [PATCH] lttng.ust: Update callstack requirement with composite requirements MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This also allows to verify that entry and exit events match Change-Id: I4d59ea02d6d4c376b4f8d1b92e3b899d874c8d8e Signed-off-by: Geneviève Bastien --- ...ngUstCallStackAnalysisRequirementTest.java | 3 +- .../LttngUstCallStackAnalysisRequirement.java | 54 ++++++++----------- 2 files changed, 23 insertions(+), 34 deletions(-) diff --git a/lttng/org.eclipse.tracecompass.lttng2.ust.ui.tests/src/org/eclipse/tracecompass/lttng2/ust/ui/tests/analysis/callstack/LTTngUstCallStackAnalysisRequirementTest.java b/lttng/org.eclipse.tracecompass.lttng2.ust.ui.tests/src/org/eclipse/tracecompass/lttng2/ust/ui/tests/analysis/callstack/LTTngUstCallStackAnalysisRequirementTest.java index e1b6839620..c423c969ac 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.ust.ui.tests/src/org/eclipse/tracecompass/lttng2/ust/ui/tests/analysis/callstack/LTTngUstCallStackAnalysisRequirementTest.java +++ b/lttng/org.eclipse.tracecompass.lttng2.ust.ui.tests/src/org/eclipse/tracecompass/lttng2/ust/ui/tests/analysis/callstack/LTTngUstCallStackAnalysisRequirementTest.java @@ -83,7 +83,8 @@ public class LTTngUstCallStackAnalysisRequirementTest { TRACE_WITH_VALID_EVENTS_WRONG_FIELDS(EventType.EVT_ENTRY_FAST_EMPTY_FIELDS, EventType.EVT_EXIT_FAST, false), TRACE_WITH_MISSING_EVENTS(EventType.EVT_OTHER, - EventType.EVT_EXIT_FAST, false); + EventType.EVT_EXIT_FAST, false), + TRACE_MISMATCH_EVENTS(EventType.EVT_ENTRY_FAST, EventType.EVT_EXIT, false); private final @NonNull LttngUstTrace fTrace; private final boolean fIsValid; diff --git a/lttng/org.eclipse.tracecompass.lttng2.ust.ui/src/org/eclipse/tracecompass/internal/lttng2/ust/ui/analysis/callstack/LttngUstCallStackAnalysisRequirement.java b/lttng/org.eclipse.tracecompass.lttng2.ust.ui/src/org/eclipse/tracecompass/internal/lttng2/ust/ui/analysis/callstack/LttngUstCallStackAnalysisRequirement.java index 150eadecc8..3e0ee700b2 100644 --- a/lttng/org.eclipse.tracecompass.lttng2.ust.ui/src/org/eclipse/tracecompass/internal/lttng2/ust/ui/analysis/callstack/LttngUstCallStackAnalysisRequirement.java +++ b/lttng/org.eclipse.tracecompass.lttng2.ust.ui/src/org/eclipse/tracecompass/internal/lttng2/ust/ui/analysis/callstack/LttngUstCallStackAnalysisRequirement.java @@ -10,9 +10,7 @@ package org.eclipse.tracecompass.internal.lttng2.ust.ui.analysis.callstack; import static org.eclipse.tracecompass.common.core.NonNullUtils.nullToEmptyString; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.Collection; import java.util.Set; import org.eclipse.jdt.annotation.NonNull; @@ -20,7 +18,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.tracecompass.lttng2.ust.core.trace.layout.ILttngUstEventLayout; import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisEventFieldRequirement; import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAnalysisRequirement; -import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfCompositeAnalysisRequirement; import com.google.common.collect.ImmutableSet; @@ -31,10 +29,8 @@ import com.google.common.collect.ImmutableSet; * */ @NonNullByDefault -public class LttngUstCallStackAnalysisRequirement extends TmfAnalysisRequirement { +public class LttngUstCallStackAnalysisRequirement extends TmfCompositeAnalysisRequirement { - private List fEntryRequirements = new ArrayList<>(); - private List fExitRequirements = new ArrayList<>(); /** * Constructor * @@ -42,50 +38,42 @@ public class LttngUstCallStackAnalysisRequirement extends TmfAnalysisRequirement * The event layout (non-null) */ public LttngUstCallStackAnalysisRequirement(ILttngUstEventLayout layout) { - super(Collections.EMPTY_SET, PriorityLevel.MANDATORY); + super(getSubRequirements(layout), PriorityLevel.AT_LEAST_ONE); + addInformation(nullToEmptyString(Messages.LttnUstCallStackAnalysisModule_EventsLoadingInformation)); + } + + private static Collection getSubRequirements(ILttngUstEventLayout layout) { Set<@NonNull String> requiredEventsFields = ImmutableSet.of( layout.contextProcname(), layout.contextVtid()); - TmfAnalysisEventFieldRequirement requirement = new TmfAnalysisEventFieldRequirement( + + // Requirement for the cyg_profile events + TmfAnalysisEventFieldRequirement entryReq = new TmfAnalysisEventFieldRequirement( layout.eventCygProfileFuncEntry(), requiredEventsFields, PriorityLevel.MANDATORY); - fEntryRequirements.add(requirement); - requirement = new TmfAnalysisEventFieldRequirement( - layout.eventCygProfileFastFuncEntry(), + TmfAnalysisRequirement exitReq = new TmfAnalysisEventFieldRequirement( + layout.eventCygProfileFuncExit(), requiredEventsFields, PriorityLevel.MANDATORY); - fEntryRequirements.add(requirement); - requirement = new TmfAnalysisEventFieldRequirement( - layout.eventCygProfileFuncExit(), + TmfAnalysisRequirement cygProfile = new TmfCompositeAnalysisRequirement(ImmutableSet.of(entryReq, exitReq), PriorityLevel.MANDATORY); + + // Requirement for the cyg_profile_fast events + entryReq = new TmfAnalysisEventFieldRequirement( + layout.eventCygProfileFastFuncEntry(), requiredEventsFields, PriorityLevel.MANDATORY); - fExitRequirements.add(requirement); - requirement = new TmfAnalysisEventFieldRequirement( + exitReq = new TmfAnalysisEventFieldRequirement( layout.eventCygProfileFastFuncExit(), requiredEventsFields, PriorityLevel.MANDATORY); - fExitRequirements.add(requirement); + TmfAnalysisRequirement cygProfileFast = new TmfCompositeAnalysisRequirement(ImmutableSet.of(entryReq, exitReq), PriorityLevel.MANDATORY); - // Add mandatory values (event names and context names) - addInformation(nullToEmptyString(Messages.LttnUstCallStackAnalysisModule_EventsLoadingInformation)); + return ImmutableSet.of(cygProfile, cygProfileFast); } - @Override - public boolean test(ITmfTrace trace) { - boolean fullfilled = fEntryRequirements.stream().anyMatch(requirement -> { - return requirement.test(trace); - }); - - if (fullfilled) { - fullfilled = fExitRequirements.stream().anyMatch(requirement -> { - return requirement.test(trace); - }); - } - return fullfilled; - } } -- 2.34.1