1 /*******************************************************************************
2 * Copyright (c) 2014, 2015 École Polytechnique de Montréal
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Geneviève Bastien - Initial API and implementation
11 * Guilliano Molaire - Provide the requirements of the analysis
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.lttng2
.ust
.core
.analysis
.memory
;
16 import static org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
.checkNotNull
;
17 import static org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
.nullToEmptyString
;
21 import org
.eclipse
.jdt
.annotation
.NonNull
;
22 import org
.eclipse
.jdt
.annotation
.Nullable
;
23 import org
.eclipse
.tracecompass
.internal
.lttng2
.ust
.core
.analysis
.memory
.UstMemoryStateProvider
;
24 import org
.eclipse
.tracecompass
.lttng2
.control
.core
.session
.SessionConfigStrings
;
25 import org
.eclipse
.tracecompass
.lttng2
.ust
.core
.trace
.LttngUstTrace
;
26 import org
.eclipse
.tracecompass
.lttng2
.ust
.core
.trace
.layout
.ILttngUstEventLayout
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.analysis
.TmfAnalysisRequirement
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.analysis
.TmfAnalysisRequirement
.ValuePriorityLevel
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.exceptions
.TmfAnalysisException
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.statesystem
.ITmfStateProvider
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.statesystem
.TmfStateSystemAnalysisModule
;
32 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
34 import com
.google
.common
.collect
.ImmutableSet
;
37 * This analysis build a state system from the libc memory instrumentation on a
40 * @author Geneviève Bastien
42 public class UstMemoryAnalysisModule
extends TmfStateSystemAnalysisModule
{
45 * Analysis ID, it should match that in the plugin.xml file
47 public static final @NonNull String ID
= "org.eclipse.linuxtools.lttng2.ust.analysis.memory"; //$NON-NLS-1$
49 /** The analysis's requirements. Only set after the trace is set. */
50 private @Nullable Set
<TmfAnalysisRequirement
> fAnalysisRequirements
;
53 protected ITmfStateProvider
createStateProvider() {
54 return new UstMemoryStateProvider(checkNotNull(getTrace()));
61 public boolean setTrace(ITmfTrace trace
) throws TmfAnalysisException
{
62 if (!(trace
instanceof LttngUstTrace
)) {
66 * setTrace() calls getAnalysisRequirements, so we need the field set
67 * for the check to work.
69 fAnalysisRequirements
= requirementsForTrace((LttngUstTrace
) trace
);
70 boolean traceIsSet
= super.setTrace(trace
);
72 /* Unset the requirements, the trace was not good after all. */
73 fAnalysisRequirements
= null;
79 protected LttngUstTrace
getTrace() {
80 return (LttngUstTrace
) super.getTrace();
83 private static Set
<TmfAnalysisRequirement
> requirementsForTrace(LttngUstTrace trace
) {
85 * Compute the list of required events, whose exact names can change
86 * depending on the tracer's version.
88 ILttngUstEventLayout layout
= trace
.getEventLayout();
89 Set
<String
> requiredEvents
= ImmutableSet
.of(
90 layout
.eventLibcMalloc(),
91 layout
.eventLibcFree(),
92 layout
.eventLibcCalloc(),
93 layout
.eventLibcRealloc(),
94 layout
.eventLibcMemalign(),
95 layout
.eventLibcPosixMemalign()
98 /* Initialize the requirements for the analysis: domain and events */
99 TmfAnalysisRequirement eventsReq
= new TmfAnalysisRequirement(SessionConfigStrings
.CONFIG_ELEMENT_EVENT
, requiredEvents
, ValuePriorityLevel
.MANDATORY
);
101 * In order to have these events, the libc wrapper with probes should be
104 eventsReq
.addInformation(nullToEmptyString(Messages
.UstMemoryAnalysisModule_EventsLoadingInformation
));
105 eventsReq
.addInformation(nullToEmptyString(Messages
.UstMemoryAnalysisModule_EventsLoadingExampleInformation
));
107 /* The domain type of the analysis */
108 TmfAnalysisRequirement domainReq
= new TmfAnalysisRequirement(SessionConfigStrings
.CONFIG_ELEMENT_DOMAIN
);
109 domainReq
.addValue(SessionConfigStrings
.CONFIG_DOMAIN_TYPE_UST
, ValuePriorityLevel
.MANDATORY
);
111 return ImmutableSet
.of(domainReq
, eventsReq
);
115 public Iterable
<TmfAnalysisRequirement
> getAnalysisRequirements() {
116 Set
<TmfAnalysisRequirement
> reqs
= fAnalysisRequirements
;
118 throw new IllegalStateException("Cannot get the analysis requirements without an assigned trace."); //$NON-NLS-1$