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
.event
.TmfEvent
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.statesystem
.AbstractTmfStateProvider
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.statesystem
.ITmfStateProvider
;
31 * State provider for the default BTF analysis.
33 * The generated attribute tree will look like this:
38 * | +- Core 1 (not running/Name of the running Task)
39 * | +- Core 2 (not running/Name of the running Task)
43 * | +- Core 1 (not running/running/suspended)
44 * | | +- Runnable A1 (not running/running/suspended)
45 * | | +- Runnable A2 (not running/running/suspended)
61 * @author Alexandre Montplaisir
63 public class BtfStateProvider
extends AbstractTmfStateProvider
{
65 private static final int PROVIDER_VERSION
= 3;
67 private static class TmfNamedStateValue
{
68 private final String fName
;
69 private final TmfStateValue fValue
;
71 public TmfNamedStateValue(TmfStateValue value
, String name
) {
76 public TmfStateValue
getValue() {
81 public String
toString() {
86 private static final TmfNamedStateValue STATE_CORE_IDLE
= new TmfNamedStateValue(TmfStateValue
.newValueInt(0), "Idle"); //$NON-NLS-1$
88 private static final TmfNamedStateValue STATE_NOT_RUNNING
= new TmfNamedStateValue(TmfStateValue
.nullValue(), "Not Running"); //$NON-NLS-1$
89 private static final TmfNamedStateValue STATE_RUNNING
= new TmfNamedStateValue(TmfStateValue
.newValueInt((1)), "RUNNING"); //$NON-NLS-1$
90 private static final TmfNamedStateValue STATE_SUSPENDED
= new TmfNamedStateValue(TmfStateValue
.newValueInt((2)), "SUSPENDED"); //$NON-NLS-1$
92 private static final TmfNamedStateValue STATE_TASK_ACTIVE
= new TmfNamedStateValue(TmfStateValue
.newValueInt((4)), "Active"); //$NON-NLS-1$
93 private static final TmfNamedStateValue STATE_TASK_READY
= new TmfNamedStateValue(TmfStateValue
.newValueInt((5)), "Ready"); //$NON-NLS-1$
94 private static final TmfNamedStateValue STATE_TASK_RUNNING
= new TmfNamedStateValue(TmfStateValue
.newValueInt((6)), "Task Running"); //$NON-NLS-1$
95 private static final TmfNamedStateValue STATE_TASK_WAITING
= new TmfNamedStateValue(TmfStateValue
.newValueInt((7)), "Waiting"); //$NON-NLS-1$
96 private static final TmfNamedStateValue STATE_TASK_PARKING
= new TmfNamedStateValue(TmfStateValue
.newValueInt((8)), "Parking"); //$NON-NLS-1$
97 private static final TmfNamedStateValue STATE_TASK_POLLING
= new TmfNamedStateValue(TmfStateValue
.newValueInt((9)), "Polling"); //$NON-NLS-1$
98 private static final TmfNamedStateValue STATE_TASK_TERMINATED
= new TmfNamedStateValue(TmfStateValue
.nullValue(), "Terminated"); //$NON-NLS-1$
100 private static final String ENTITY_CORE
= "Core"; //$NON-NLS-1$
101 private static final String ENTITY_TASK
= "TASK"; //$NON-NLS-1$
102 // private static final String ENTITY_RUNNABLE = "RUNNABLE";
104 private static final String ATTRIBUTE_TASKS
= "Tasks"; //$NON-NLS-1$
105 private static final String ATTRIBUTE_CORES
= "Cores"; //$NON-NLS-1$
106 private static final String ATTRIBUTE_ACTIVE_CORE
= "ActiveCore"; //$NON-NLS-1$
112 * The trace for which we will be building this state system
114 public BtfStateProvider(BtfTrace trace
) {
115 super(trace
, TmfEvent
.class, "Btf State Provider"); //$NON-NLS-1$
119 public BtfTrace
getTrace() {
120 return (BtfTrace
) super.getTrace();
124 public int getVersion() {
125 return PROVIDER_VERSION
;
129 public ITmfStateProvider
getNewInstance() {
130 return new BtfStateProvider(getTrace());
134 protected void eventHandle(ITmfEvent ev
) {
135 BtfEvent event
= (BtfEvent
) ev
;
136 final ITmfStateSystemBuilder ssb
= checkNotNull(getStateSystemBuilder());
138 final long ts
= event
.getTimestamp().getValue();
139 final String eventType
= (String
) event
.getContent().getField(BtfColumnNames
.EVENT
.toString()).getValue();
140 final String source
= event
.getSource();
141 final String target
= event
.getReference();
147 case "activate": //$NON-NLS-1$
148 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_ACTIVE
);
151 case "start": //$NON-NLS-1$
152 case "resume": //$NON-NLS-1$
153 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_RUNNING
);
155 if (source
.startsWith(ENTITY_CORE
)) {
156 String core
= source
;
159 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, core
);
160 ssb
.modifyAttribute(ts
, STATE_RUNNING
.getValue(), quark
);
162 /* Mark this task as active in the ActiveCore attribute */
163 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, ATTRIBUTE_ACTIVE_CORE
);
164 ITmfStateValue value
= TmfStateValue
.newValueString(core
);
165 ssb
.modifyAttribute(ts
, value
, quark
);
167 /* Mark this task as active in the Cores/* attribute */
168 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_CORES
, core
);
169 /* Until the view can display the string */
170 value
= STATE_RUNNING
.getValue();
171 ssb
.modifyAttribute(ts
, value
, quark
);
173 } else if (source
.startsWith(ENTITY_TASK
)) {
175 String runnable
= target
;
176 String core
= getCoreOfTask(ssb
, task
);
178 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, core
, runnable
);
179 ssb
.modifyAttribute(ts
, STATE_RUNNING
.getValue(), quark
);
183 case "suspend": //$NON-NLS-1$
184 /* "suspend" events only happen on Tasks */
185 if (source
.startsWith(ENTITY_TASK
)) {
187 String runnable
= target
;
188 String core
= getCoreOfTask(ssb
, task
);
190 /* We'll update both the Core and Runnable attributes */
191 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, core
);
192 ssb
.modifyAttribute(ts
, STATE_SUSPENDED
.getValue(), quark
);
193 quark
= ssb
.getQuarkRelativeAndAdd(quark
, runnable
);
194 ssb
.modifyAttribute(ts
, STATE_SUSPENDED
.getValue(), quark
);
198 case "terminate": //$NON-NLS-1$
199 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_TERMINATED
);
201 if (source
.startsWith(ENTITY_CORE
)) {
202 String core
= source
;
205 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, core
);
206 ssb
.modifyAttribute(ts
, STATE_NOT_RUNNING
.getValue(), quark
);
208 /* Remove our "active task on core" bookmark */
209 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, ATTRIBUTE_ACTIVE_CORE
);
210 ITmfStateValue value
= TmfStateValue
.nullValue();
211 ssb
.modifyAttribute(ts
, value
, quark
);
213 /* Mark the Cores/* attribute as not running */
214 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_CORES
, core
);
215 ssb
.modifyAttribute(ts
, STATE_CORE_IDLE
.getValue(), quark
);
217 } else if (source
.startsWith(ENTITY_TASK
)) {
219 String runnable
= target
;
220 String core
= getCoreOfTask(ssb
, task
);
222 quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
, core
, runnable
);
223 ssb
.modifyAttribute(ts
, STATE_NOT_RUNNING
.getValue(), quark
);
227 case "preempt": //$NON-NLS-1$
228 case "release": //$NON-NLS-1$
229 case "release_parking": //$NON-NLS-1$
230 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_READY
);
232 case "wait": //$NON-NLS-1$
233 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_WAITING
);
235 case "park": //$NON-NLS-1$
236 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_PARKING
);
238 case "poll": //$NON-NLS-1$
240 case "poll_parking": //$NON-NLS-1$
241 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_POLLING
);
243 case "run": //$NON-NLS-1$
244 updateTaskStateSystem(ssb
, ts
, event
, STATE_TASK_RUNNING
);
250 } catch (AttributeNotFoundException e
) {
251 throw new IllegalStateException(e
);
255 private static void updateTaskStateSystem(
256 final ITmfStateSystemBuilder ssb
,
257 final long ts
, BtfEvent event
,
258 TmfNamedStateValue stateValue
)
259 throws AttributeNotFoundException
{
260 String name
= event
.getType().getName();
261 if (name
.equals("Task")) { //$NON-NLS-1$
262 String task
= event
.getReference();
263 int quark
= ssb
.getQuarkAbsoluteAndAdd(ATTRIBUTE_TASKS
, task
);
264 ssb
.modifyAttribute(ts
, stateValue
.getValue(), quark
);
268 private static String
getCoreOfTask(ITmfStateSystemBuilder ssb
, String task
) {
270 int quark
= ssb
.getQuarkAbsolute(ATTRIBUTE_TASKS
, task
, ATTRIBUTE_ACTIVE_CORE
);
271 ITmfStateValue value
= ssb
.queryOngoingState(quark
);
272 return value
.unboxStr();
273 } catch (AttributeNotFoundException e
) {
274 throw new IllegalStateException(e
);