Import lttng.kernel.core plugins from Scope
[deliverable/tracecompass.git] / lttng / org.lttng.scope.lttng.kernel.core / src / org / lttng / scope / lttng / kernel / core / views / timegraph / threads / ThreadsModelStateProvider.java
1 /*******************************************************************************
2 * Copyright (c) 2016 EfficiOS Inc., Alexandre Montplaisir
3 *
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
8 *******************************************************************************/
9
10 package org.lttng.scope.lttng.kernel.core.views.timegraph.threads;
11
12 import static java.util.Objects.requireNonNull;
13
14 import java.util.Arrays;
15 import java.util.Collection;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.function.Function;
19
20 import org.eclipse.jdt.annotation.Nullable;
21 import org.lttng.scope.lttng.kernel.core.analysis.os.Attributes;
22 import org.lttng.scope.lttng.kernel.core.analysis.os.KernelAnalysisModule;
23 import org.lttng.scope.lttng.kernel.core.analysis.os.StateValues;
24 import org.lttng.scope.lttng.kernel.core.views.timegraph.KernelAnalysisStateDefinitions;
25 import org.lttng.scope.tmf2.views.core.config.ConfigOption;
26 import org.lttng.scope.tmf2.views.core.timegraph.model.provider.statesystem.StateSystemModelStateProvider;
27 import org.lttng.scope.tmf2.views.core.timegraph.model.render.ColorDefinition;
28 import org.lttng.scope.tmf2.views.core.timegraph.model.render.LineThickness;
29 import org.lttng.scope.tmf2.views.core.timegraph.model.render.StateDefinition;
30
31 import com.google.common.annotations.VisibleForTesting;
32 import com.google.common.collect.ImmutableList;
33 import com.google.common.collect.ImmutableMap;
34
35 import ca.polymtl.dorsal.libdelorean.exceptions.AttributeNotFoundException;
36 import ca.polymtl.dorsal.libdelorean.exceptions.StateValueTypeException;
37 import ca.polymtl.dorsal.libdelorean.statevalue.ITmfStateValue;
38
39 public class ThreadsModelStateProvider extends StateSystemModelStateProvider {
40
41 // ------------------------------------------------------------------------
42 // Label mapping
43 // ------------------------------------------------------------------------
44
45 /** Prefixes to strip from syscall names in the labels */
46 // TODO This should be inferred from the kernel event layout
47 private static final Collection<String> SYSCALL_PREFIXES = Arrays.asList("sys_", "syscall_entry_"); //$NON-NLS-1$ //$NON-NLS-2$
48
49 private static final Function<StateIntervalContext, @Nullable String> LABEL_MAPPING_FUNCTION = ssCtx -> {
50 int statusQuark = ssCtx.baseTreeElement.getSourceQuark();
51 long startTime = ssCtx.sourceInterval.getStartTime();
52 ITmfStateValue val = ssCtx.ss.querySingleState(startTime, statusQuark).getStateValue();
53
54 /* If the status is "syscall", use the name of the syscall as label */
55 if (!val.equals(StateValues.PROCESS_STATUS_RUN_SYSCALL_VALUE)) {
56 return null;
57 }
58
59 String syscallName;
60 try {
61 int syscallQuark = ssCtx.ss.getQuarkRelative(statusQuark, Attributes.SYSTEM_CALL);
62 syscallName = ssCtx.ss.querySingleState(startTime, syscallQuark).getStateValue().unboxStr();
63 } catch (AttributeNotFoundException | StateValueTypeException e) {
64 return null;
65 }
66
67 /*
68 * Strip the "syscall" prefix part if there is one, it's not useful in
69 * the label.
70 */
71 for (String sysPrefix : SYSCALL_PREFIXES) {
72 if (syscallName.startsWith(sysPrefix)) {
73 syscallName = syscallName.substring(sysPrefix.length());
74 }
75 }
76
77 return syscallName;
78 };
79
80 // ------------------------------------------------------------------------
81 // Color mapping, line thickness
82 // ------------------------------------------------------------------------
83
84 /**
85 * State definitions used in this provider.
86 */
87 private static final List<StateDefinition> STATE_DEFINITIONS = ImmutableList.of(
88 KernelAnalysisStateDefinitions.THREAD_STATE_UNKNOWN,
89 KernelAnalysisStateDefinitions.THREAD_STATE_WAIT_UNKNOWN,
90 KernelAnalysisStateDefinitions.THREAD_STATE_WAIT_BLOCKED,
91 KernelAnalysisStateDefinitions.THREAD_STATE_WAIT_FOR_CPU,
92 KernelAnalysisStateDefinitions.THREAD_STATE_USERMODE,
93 KernelAnalysisStateDefinitions.THREAD_STATE_SYSCALL,
94 KernelAnalysisStateDefinitions.THREAD_STATE_INTERRUPTED);
95
96 private static final Function<StateIntervalContext, StateDefinition> STATE_DEF_MAPPING_FUNCTION = ssCtx -> {
97 ITmfStateValue val = ssCtx.sourceInterval.getStateValue();
98 return stateValueToStateDef(val);
99 };
100
101 @VisibleForTesting
102 static final StateDefinition stateValueToStateDef(ITmfStateValue val) {
103 if (val.isNull()) {
104 return KernelAnalysisStateDefinitions.NO_STATE;
105 }
106
107 try {
108 int status = val.unboxInt();
109 switch (status) {
110 case StateValues.PROCESS_STATUS_WAIT_UNKNOWN:
111 return KernelAnalysisStateDefinitions.THREAD_STATE_WAIT_UNKNOWN;
112 case StateValues.PROCESS_STATUS_WAIT_BLOCKED:
113 return KernelAnalysisStateDefinitions.THREAD_STATE_WAIT_BLOCKED;
114 case StateValues.PROCESS_STATUS_WAIT_FOR_CPU:
115 return KernelAnalysisStateDefinitions.THREAD_STATE_WAIT_FOR_CPU;
116 case StateValues.PROCESS_STATUS_RUN_USERMODE:
117 return KernelAnalysisStateDefinitions.THREAD_STATE_USERMODE;
118 case StateValues.PROCESS_STATUS_RUN_SYSCALL:
119 return KernelAnalysisStateDefinitions.THREAD_STATE_SYSCALL;
120 case StateValues.PROCESS_STATUS_INTERRUPTED:
121 return KernelAnalysisStateDefinitions.THREAD_STATE_INTERRUPTED;
122 default:
123 return KernelAnalysisStateDefinitions.THREAD_STATE_UNKNOWN;
124 }
125
126 } catch (StateValueTypeException e) {
127 return KernelAnalysisStateDefinitions.THREAD_STATE_UNKNOWN;
128 }
129 }
130
131 private static final Function<StateIntervalContext, String> STATE_NAME_MAPPING_FUNCTION = ssCtx -> STATE_DEF_MAPPING_FUNCTION.apply(ssCtx).getName();
132
133 private static final Function<StateIntervalContext, ConfigOption<ColorDefinition>> COLOR_MAPPING_FUNCTION = ssCtx -> STATE_DEF_MAPPING_FUNCTION.apply(ssCtx).getColor();
134
135 private static final Function<StateIntervalContext, ConfigOption<LineThickness>> LINE_THICKNESS_MAPPING_FUNCTION = ssCtx -> STATE_DEF_MAPPING_FUNCTION.apply(ssCtx).getLineThickness();
136
137 // ------------------------------------------------------------------------
138 // Properties
139 // ------------------------------------------------------------------------
140
141 private static final Function<StateIntervalContext, Map<String, String>> PROPERTIES_MAPPING_FUNCTION = ssCtx -> {
142 /* Include properties for CPU and syscall name. */
143 int baseQuark = ssCtx.baseTreeElement.getSourceQuark();
144 long startTime = ssCtx.sourceInterval.getStartTime();
145
146 String cpu;
147 try {
148 int cpuQuark = ssCtx.ss.getQuarkRelative(baseQuark, Attributes.CURRENT_CPU_RQ);
149 ITmfStateValue sv = ssCtx.ss.querySingleState(startTime, cpuQuark).getStateValue();
150 cpu = (sv.isNull() ? requireNonNull(Messages.propertyNotAvailable) : String.valueOf(sv.unboxInt()));
151 } catch (AttributeNotFoundException e) {
152 cpu = requireNonNull(Messages.propertyNotAvailable);
153 }
154
155 String syscall;
156 try {
157 int syscallNameQuark = ssCtx.ss.getQuarkRelative(baseQuark, Attributes.SYSTEM_CALL);
158 ITmfStateValue sv = ssCtx.ss.querySingleState(startTime, syscallNameQuark).getStateValue();
159 syscall = (sv.isNull() ? requireNonNull(Messages.propertyNotAvailable) : sv.unboxStr());
160 } catch (AttributeNotFoundException e) {
161 syscall = requireNonNull(Messages.propertyNotAvailable);
162 }
163
164 return ImmutableMap.of(requireNonNull(Messages.propertyNameCpu), cpu,
165 requireNonNull(Messages.propertyNameSyscall), syscall);
166 };
167
168 /**
169 * Constructor
170 */
171 public ThreadsModelStateProvider() {
172 super(STATE_DEFINITIONS,
173 KernelAnalysisModule.ID,
174 STATE_NAME_MAPPING_FUNCTION,
175 LABEL_MAPPING_FUNCTION,
176 COLOR_MAPPING_FUNCTION,
177 LINE_THICKNESS_MAPPING_FUNCTION,
178 PROPERTIES_MAPPING_FUNCTION);
179 }
180 }
This page took 0.034667 seconds and 5 git commands to generate.