analysis: support sched_waking event
[deliverable/tracecompass.git] / lttng / org.eclipse.tracecompass.lttng2.kernel.core / src / org / eclipse / tracecompass / internal / lttng2 / kernel / core / analysis / graph / handlers / TraceEventHandlerSched.java
CommitLineData
af7f72ce
FG
1/*******************************************************************************
2 * Copyright (c) 2015 École Polytechnique de Montréal
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
10package org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.handlers;
11
12import org.eclipse.tracecompass.analysis.os.linux.core.kernelanalysis.LinuxValues;
13import org.eclipse.tracecompass.analysis.os.linux.core.model.HostThread;
5aa7fe19 14import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
af7f72ce
FG
15import org.eclipse.tracecompass.common.core.NonNullUtils;
16import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider;
17import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider.ProcessStatus;
18import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.EventField;
19import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngSystemModel;
20import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngWorker;
af7f72ce
FG
21import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
22import org.eclipse.tracecompass.tmf.core.event.aspect.TmfCpuAspect;
23import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
24
25/**
26 * Provides the current task running on a CPU according to scheduling events
27 *
28 * @author Francis Giraldeau
29 * @author Geneviève Bastien
30 */
31public class TraceEventHandlerSched extends BaseHandler {
32
33 /**
34 * Constructor
35 *
36 * @param provider
37 * The parent graph provider
38 */
39 public TraceEventHandlerSched(LttngKernelExecGraphProvider provider) {
40 super(provider);
41 }
42
43 @Override
44 public void handleEvent(ITmfEvent ev) {
45 String eventName = ev.getName();
5aa7fe19 46 IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(ev.getTrace());
af7f72ce
FG
47
48 if (eventName.equals(eventLayout.eventSchedSwitch())) {
49 handleSchedSwitch(ev);
af7f72ce
FG
50 } else if (eventName.equals(eventLayout.eventSchedProcessFork())) {
51 handleSchedProcessFork(ev);
52 } else if (eventName.equals(eventLayout.eventSchedProcessExit())) {
53 handleSchedProcessExit(ev);
54 } else if (eventName.equals(eventLayout.eventSchedProcessExec())) {
55 handleSchedProcessExec(ev);
5aa7fe19
FG
56 } else if (isWakeupEvent(ev)) {
57 handleSchedWakeup(ev);
af7f72ce
FG
58 }
59 }
60
61 private void handleSchedSwitch(ITmfEvent event) {
b3867ecc 62 Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event));
5aa7fe19 63 IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
af7f72ce
FG
64 LttngSystemModel system = getProvider().getSystem();
65
66 Integer next = EventField.getInt(event, eventLayout.fieldNextTid());
67 Integer prev = EventField.getInt(event, eventLayout.fieldPrevTid());
68 long ts = event.getTimestamp().getValue();
69 long prev_state = EventField.getLong(event, eventLayout.fieldPrevState());
70 prev_state = (long) ((int) prev_state) & (LinuxValues.TASK_STATE_RUNNING | LinuxValues.TASK_INTERRUPTIBLE | LinuxValues.TASK_UNINTERRUPTIBLE);
71 String host = event.getTrace().getHostId();
72
73 system.cacheTidOnCpu(cpu, new HostThread(event.getTrace().getHostId(), next));
74
75 HostThread nextHt = new HostThread(host, next);
76 LttngWorker nextTask = system.findWorker(nextHt);
77 if (nextTask == null) {
78 String name = EventField.getOrDefault(event, eventLayout.fieldNextComm(), NonNullUtils.checkNotNull(Messages.TraceEventHandlerSched_UnknownThreadName));
79 nextTask = new LttngWorker(nextHt, name, ts);
80 system.addWorker(nextTask);
81 }
82 nextTask.setStatus(ProcessStatus.RUN);
83
84 HostThread prevHt = new HostThread(host, prev);
85 LttngWorker prevTask = system.findWorker(prevHt);
86 if (prevTask == null) {
87 String name = EventField.getOrDefault(event, eventLayout.fieldPrevComm(), NonNullUtils.checkNotNull(Messages.TraceEventHandlerSched_UnknownThreadName));
88 prevTask = new LttngWorker(prevHt, name, ts);
89 system.addWorker(prevTask);
90 }
91 /* prev_state == 0 means runnable, thus waits for cpu */
92 if (prev_state == 0) {
93 prevTask.setStatus(ProcessStatus.WAIT_CPU);
94 } else {
95 prevTask.setStatus(ProcessStatus.WAIT_BLOCKED);
96 }
97 }
98
99 private void handleSchedProcessFork(ITmfEvent event) {
100 String host = event.getTrace().getHostId();
5aa7fe19 101 IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
af7f72ce
FG
102 LttngSystemModel system = getProvider().getSystem();
103
104 Integer childTid = EventField.getInt(event, eventLayout.fieldChildTid());
105 String name = EventField.getString(event, eventLayout.fieldChildComm());
106 long ts = event.getTimestamp().getValue();
107
108 HostThread childHt = new HostThread(host, childTid);
109
110 LttngWorker childTask = system.findWorker(childHt);
111 if (childTask == null) {
112 childTask = new LttngWorker(childHt, name, ts);
113 system.addWorker(childTask);
114 }
115
116 childTask.setStatus(ProcessStatus.WAIT_FORK);
117 }
118
119 private void handleSchedWakeup(ITmfEvent event) {
120 String host = event.getTrace().getHostId();
b3867ecc 121 Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event));
5aa7fe19 122 IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
af7f72ce
FG
123 LttngSystemModel system = getProvider().getSystem();
124
125 Integer tid = EventField.getInt(event, eventLayout.fieldTid());
126 HostThread targetHt = new HostThread(host, tid);
127
128 LttngWorker target = system.findWorker(targetHt);
129 LttngWorker current = system.getWorkerOnCpu(host, cpu);
5aa7fe19 130
af7f72ce
FG
131 if (target == null) {
132 String name = EventField.getOrDefault(event, eventLayout.fieldComm(), NonNullUtils.checkNotNull(Messages.TraceEventHandlerSched_UnknownThreadName));
133 target = new LttngWorker(targetHt, name, event.getTimestamp().getValue());
134 system.addWorker(target);
135 target.setStatus(ProcessStatus.WAIT_BLOCKED);
136 }
137 // spurious wakeup
138 ProcessStatus status = target.getStatus();
139 if ((current != null && target.getHostThread().equals(current.getHostThread())) ||
140 status == ProcessStatus.WAIT_CPU) {
141 return;
142 }
143 if (status == ProcessStatus.WAIT_BLOCKED ||
144 status == ProcessStatus.WAIT_FORK ||
145 status == ProcessStatus.UNKNOWN) {
146 target.setStatus(ProcessStatus.WAIT_CPU);
147 return;
148 }
149 }
150
151 private void handleSchedProcessExit(ITmfEvent event) {
152 String host = event.getTrace().getHostId();
5aa7fe19 153 IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
af7f72ce
FG
154 LttngSystemModel system = getProvider().getSystem();
155
156 Integer tid = EventField.getInt(event, eventLayout.fieldTid());
157 LttngWorker task = system.findWorker(new HostThread(host, tid));
158 if (task == null) {
159 return;
160 }
161 task.setStatus(ProcessStatus.EXIT);
162 }
163
164 private void handleSchedProcessExec(ITmfEvent event) {
165 String host = event.getTrace().getHostId();
b3867ecc 166 Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event));
5aa7fe19 167 IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
af7f72ce
FG
168 LttngSystemModel system = getProvider().getSystem();
169
170 String filename = EventField.getString(event, eventLayout.fieldFilename());
171 LttngWorker task = system.getWorkerOnCpu(host, cpu);
172 if (task == null) {
173 return;
174 }
175 task.setName(filename);
176 }
177
178}
This page took 0.051873 seconds and 5 git commands to generate.