1 /*******************************************************************************
2 * Copyright (c) 2014, 2015 Ericsson
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 * Alexandre Montplaisir - Initial API and implementation
11 * Matthew Khouzam - Add the task state system from figure 3 from the spec
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.btf
.core
.analysis
;
16 import static org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
.checkNotNull
;
18 import org
.eclipse
.tracecompass
.btf
.core
.event
.BtfEvent
;
19 import org
.eclipse
.tracecompass
.btf
.core
.trace
.BtfColumnNames
;
20 import org
.eclipse
.tracecompass
.btf
.core
.trace
.BtfTrace
;
21 import org
.eclipse
.tracecompass
.statesystem
.core
.ITmfStateSystemBuilder
;
22 import org
.eclipse
.tracecompass
.statesystem
.core
.exceptions
.AttributeNotFoundException
;
23 import org
.eclipse
.tracecompass
.statesystem
.core
.statevalue
.ITmfStateValue
;
24 import org
.eclipse
.tracecompass
.statesystem
.core
.statevalue
.TmfStateValue
;
25 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
26 import org
.eclipse
.tracecompass
.tmf
.core
.statesystem
.AbstractTmfStateProvider
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.statesystem
.ITmfStateProvider
;
30 * State provider for the default BTF analysis.
32 * The generated attribute tree will look like this:
37 * | +- Core 1 (not running/Name of the running Task)
38 * | +- Core 2 (not running/Name of the running Task)
42 * | +- Core 1 (not running/running/suspended)
43 * | | +- Runnable A1 (not running/running/suspended)
44 * | | +- Runnable A2 (not running/running/suspended)
60 * @author Alexandre Montplaisir
62 public class BtfStateProvider
extends AbstractTmfStateProvider
{
64 private static final int PROVIDER_VERSION
= 3;
66 private static class TmfNamedStateValue
{
67 private final String fName
;
68 private final TmfStateValue fValue
;
70 public TmfNamedStateValue(TmfStateValue value
, String name
) {
75 public TmfStateValue
getValue() {
80 public String
toString() {
85 private static final TmfNamedStateValue STATE_CORE_IDLE
= new TmfNamedStateValue(TmfStateValue
.newValueInt(0), "Idle"); //$NON-NLS-1$
87 private static final TmfNamedStateValue STATE_NOT_RUNNING
= new TmfNamedStateValue(TmfStateValue
.nullValue(), "Not Running"); //$NON-NLS-1$
88 private static final TmfNamedStateValue STATE_RUNNING
= new TmfNamedStateValue(TmfStateValue
.newValueInt((1)), "RUNNING"); //$NON-NLS-1$
89 private static final TmfNamedStateValue STATE_SUSPENDED
= new TmfNamedStateValue(TmfStateValue
.newValueInt((2)), "SUSPENDED"); //$NON-NLS-1$
91 private static final TmfNamedStateValue STATE_TASK_ACTIVE
= new TmfNamedStateValue(TmfStateValue
.newValueInt((4)), "Active"); //$NON-NLS-1$
92 private static final TmfNamedStateValue STATE_TASK_READY
= new TmfNamedStateValue(TmfStateValue
.newValueInt((5)), "Ready"); //$NON-NLS-1$
93 private static final TmfNamedStateValue STATE_TASK_RUNNING
= new TmfNamedStateValue(TmfStateValue
.newValueInt((6)), "Task Running"); //$NON-NLS-1$
94 private static final TmfNamedStateValue STATE_TASK_WAITING
= new TmfNamedStateValue(TmfStateValue
.newValueInt((7)), "Waiting"); //$NON-NLS-1$
95 private static final TmfNamedStateValue STATE_TASK_PARKING
= new TmfNamedStateValue(TmfStateValue
.newValueInt((8)), "Parking"); //$NON-NLS-1$
96 private static final TmfNamedStateValue STATE_TASK_POLLING
= new TmfNamedStateValue(TmfStateValue
.newValueInt((9)), "Polling"); //$NON-NLS-1$
97 private static final TmfNamedStateValue STATE_TASK_TERMINATED
= new TmfNamedStateValue(TmfStateValue
.nullValue(), "Terminated"); //$NON-NLS-1$
99 private static final String ENTITY_CORE
= "Core"; //$NON-NLS-1$
100 private static final String ENTITY_TASK
= "TASK"; //$NON-NLS-1$
101 // private static final String ENTITY_RUNNABLE = "RUNNABLE";
103 private static final String ATTRIBUTE_TASKS
= "Tasks"; //$NON-NLS-1$
104 private static final String ATTRIBUTE_CORES
= "Cores"; //$NON-NLS-1$
105 private static final String ATTRIBUTE_ACTIVE_CORE
= "ActiveCore"; //$NON-NLS-1$
111 * The trace for which we will be building this state system
113 public BtfStateProvider(BtfTrace trace
) {
114 super(trace
, "Btf State Provider"); //$NON-NLS-1$
118 public BtfTrace
getTrace() {
119 return (BtfTrace
) super.getTrace();
123 public int getVersion() {
124 return PROVIDER_VERSION
;
128 public ITmfStateProvider
getNewInstance() {
129 return new BtfStateProvider(getTrace());
133 protected void eventHandle(ITmfEvent ev
) {
134 if (!(ev
instanceof BtfEvent
)) {
138 BtfEvent event
= (BtfEvent
) ev
;
139 final ITmfStateSystemBuilder ssb
= checkNotNull(getStateSystemBuilder());
141 final long ts
= event
.getTimestamp().getValue();
142 final String eventType
= (String
) event
.getContent().getField(BtfColumnNames
.EVENT
.toString()).getValue();
143 final String source
= event
.getSource();
144 final String target
= event
.getTarget();
150 case "activate": //$NON-NLS-1$
151 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_ACTIVE
);
154 case "start": //$NON-NLS-1$
155 case "resume": //$NON-NLS-1$
156 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_RUNNING
);
158 if (source
.startsWith(ENTITY_CORE
)) {
159 String core
= source
;
162 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, core
);
163 ssb
.modifyAttribute(ts
, STATE_RUNNING
.getValue(), quark
);
165 /* Mark this task as active in the ActiveCore attribute */
166 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, ATTRIBUTE_ACTIVE_CORE
);
167 ITmfStateValue value
= TmfStateValue
.newValueString(core
);
168 ssb
.modifyAttribute(ts
, value
, quark
);
170 /* Mark this task as active in the Cores/* attribute */
171 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_CORES
, core
);
172 /* Until the view can display the string */
173 value
= STATE_RUNNING
.getValue();
174 ssb
.modifyAttribute(ts
, value
, quark
);
176 } else if (source
.startsWith(ENTITY_TASK
)) {
178 String runnable
= target
;
179 String core
= getCoreOfTask(ssb
, task
);
181 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, core
, runnable
);
182 ssb
.modifyAttribute(ts
, STATE_RUNNING
.getValue(), quark
);
186 case "suspend": //$NON-NLS-1$
187 /* "suspend" events only happen on Tasks */
188 if (source
.startsWith(ENTITY_TASK
)) {
190 String runnable
= target
;
191 String core
= getCoreOfTask(ssb
, task
);
193 /* We'll update both the Core and Runnable attributes */
194 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, core
);
195 ssb
.modifyAttribute(ts
, STATE_SUSPENDED
.getValue(), quark
);
196 quark
= ssb
.getQuarkRelativeAndAdd(quark
, runnable
);
197 ssb
.modifyAttribute(ts
, STATE_SUSPENDED
.getValue(), quark
);
201 case "terminate": //$NON-NLS-1$
202 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_TERMINATED
);
204 if (source
.startsWith(ENTITY_CORE
)) {
205 String core
= source
;
208 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, core
);
209 ssb
.modifyAttribute(ts
, STATE_NOT_RUNNING
.getValue(), quark
);
211 /* Remove our "active task on core" bookmark */
212 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, ATTRIBUTE_ACTIVE_CORE
);
213 ITmfStateValue value
= TmfStateValue
.nullValue();
214 ssb
.modifyAttribute(ts
, value
, quark
);
216 /* Mark the Cores/* attribute as not running */
217 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_CORES
, core
);
218 ssb
.modifyAttribute(ts
, STATE_CORE_IDLE
.getValue(), quark
);
220 } else if (source
.startsWith(ENTITY_TASK
)) {
222 String runnable
= target
;
223 String core
= getCoreOfTask(ssb
, task
);
225 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, core
, runnable
);
226 ssb
.modifyAttribute(ts
, STATE_NOT_RUNNING
.getValue(), quark
);
230 case "preempt": //$NON-NLS-1$
231 case "release": //$NON-NLS-1$
232 case "release_parking": //$NON-NLS-1$
233 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_READY
);
235 case "wait": //$NON-NLS-1$
236 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_WAITING
);
238 case "park": //$NON-NLS-1$
239 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_PARKING
);
241 case "poll": //$NON-NLS-1$
243 case "poll_parking": //$NON-NLS-1$
244 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_POLLING
);
246 case "run": //$NON-NLS-1$
247 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_RUNNING
);
253 } catch (AttributeNotFoundException e
) {
254 throw new IllegalStateException(e
);
258 private static void updateTaskStateSystem(
259 final ITmfStateSystemBuilder ssb
,
260 final long ts
, BtfEvent event
,
261 TmfNamedStateValue stateValue
)
262 throws AttributeNotFoundException
{
263 String name
= event
.getName();
264 if (name
.equals("Task")) { //$NON-NLS-1$
265 String task
= event
.getTarget();
266 int quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
);
267 ssb
.modifyAttribute(ts
, stateValue
.getValue(), quark
);
271 private static String
getCoreOfTask(ITmfStateSystemBuilder ssb
, String task
) {
273 int quark
= ssb
.getQuarkAbsolute(ATTRIBUTE_TASKS
, task
, ATTRIBUTE_ACTIVE_CORE
);
274 ITmfStateValue value
= ssb
.queryOngoingState(quark
);
275 return value
.unboxStr();
276 } catch (AttributeNotFoundException e
) {
277 throw new IllegalStateException(e
);