1 /*******************************************************************************
2 * Copyright (c) 2016 EfficiOS Inc., Alexandre Montplaisir
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 *******************************************************************************/
10 package org
.lttng
.scope
.lttng
.kernel
.core
.views
.timegraph
.threads
;
12 import static java
.util
.Objects
.requireNonNull
;
14 import java
.util
.Arrays
;
15 import java
.util
.Collection
;
16 import java
.util
.List
;
18 import java
.util
.function
.Function
;
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
;
31 import com
.google
.common
.annotations
.VisibleForTesting
;
32 import com
.google
.common
.collect
.ImmutableList
;
33 import com
.google
.common
.collect
.ImmutableMap
;
35 import ca
.polymtl
.dorsal
.libdelorean
.exceptions
.AttributeNotFoundException
;
36 import ca
.polymtl
.dorsal
.libdelorean
.exceptions
.StateValueTypeException
;
37 import ca
.polymtl
.dorsal
.libdelorean
.statevalue
.ITmfStateValue
;
39 public class ThreadsModelStateProvider
extends StateSystemModelStateProvider
{
41 // ------------------------------------------------------------------------
43 // ------------------------------------------------------------------------
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$
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();
54 /* If the status is "syscall", use the name of the syscall as label */
55 if (!val
.equals(StateValues
.PROCESS_STATUS_RUN_SYSCALL_VALUE
)) {
61 int syscallQuark
= ssCtx
.ss
.getQuarkRelative(statusQuark
, Attributes
.SYSTEM_CALL
);
62 syscallName
= ssCtx
.ss
.querySingleState(startTime
, syscallQuark
).getStateValue().unboxStr();
63 } catch (AttributeNotFoundException
| StateValueTypeException e
) {
68 * Strip the "syscall" prefix part if there is one, it's not useful in
71 for (String sysPrefix
: SYSCALL_PREFIXES
) {
72 if (syscallName
.startsWith(sysPrefix
)) {
73 syscallName
= syscallName
.substring(sysPrefix
.length());
80 // ------------------------------------------------------------------------
81 // Color mapping, line thickness
82 // ------------------------------------------------------------------------
85 * State definitions used in this provider.
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
);
96 private static final Function
<StateIntervalContext
, StateDefinition
> STATE_DEF_MAPPING_FUNCTION
= ssCtx
-> {
97 ITmfStateValue val
= ssCtx
.sourceInterval
.getStateValue();
98 return stateValueToStateDef(val
);
102 static final StateDefinition
stateValueToStateDef(ITmfStateValue val
) {
104 return KernelAnalysisStateDefinitions
.NO_STATE
;
108 int status
= val
.unboxInt();
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
;
123 return KernelAnalysisStateDefinitions
.THREAD_STATE_UNKNOWN
;
126 } catch (StateValueTypeException e
) {
127 return KernelAnalysisStateDefinitions
.THREAD_STATE_UNKNOWN
;
131 private static final Function
<StateIntervalContext
, String
> STATE_NAME_MAPPING_FUNCTION
= ssCtx
-> STATE_DEF_MAPPING_FUNCTION
.apply(ssCtx
).getName();
133 private static final Function
<StateIntervalContext
, ConfigOption
<ColorDefinition
>> COLOR_MAPPING_FUNCTION
= ssCtx
-> STATE_DEF_MAPPING_FUNCTION
.apply(ssCtx
).getColor();
135 private static final Function
<StateIntervalContext
, ConfigOption
<LineThickness
>> LINE_THICKNESS_MAPPING_FUNCTION
= ssCtx
-> STATE_DEF_MAPPING_FUNCTION
.apply(ssCtx
).getLineThickness();
137 // ------------------------------------------------------------------------
139 // ------------------------------------------------------------------------
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();
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
);
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
);
164 return ImmutableMap
.of(requireNonNull(Messages
.propertyNameCpu
), cpu
,
165 requireNonNull(Messages
.propertyNameSyscall
), syscall
);
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
);