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 / EventContextHandler.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.trace.IKernelAnalysisEventLayout;
b3867ecc 13import org.eclipse.tracecompass.common.core.NonNullUtils;
af7f72ce
FG
14import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider;
15import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.building.LttngKernelExecGraphProvider.Context;
16import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngInterruptContext;
17import org.eclipse.tracecompass.internal.lttng2.kernel.core.analysis.graph.model.LttngSystemModel;
18import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
19import org.eclipse.tracecompass.tmf.core.event.aspect.TmfCpuAspect;
20import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
21
22/**
23 * Event Handler to handle the interrupt context stack of the model
24 *
25 * @author Francis Giraldeau
26 * @author Geneviève Bastien
27 */
28public class EventContextHandler extends BaseHandler {
29
30 /**
31 * Constructor
32 *
33 * @param provider
34 * The parent graph provider
35 */
36 public EventContextHandler(LttngKernelExecGraphProvider provider) {
37 super(provider);
38 }
39
40 @Override
41 public void handleEvent(ITmfEvent event) {
42 String eventName = event.getName();
5aa7fe19 43 IKernelAnalysisEventLayout eventLayout = getProvider().getEventLayout(event.getTrace());
af7f72ce
FG
44 if (eventName.equals(eventLayout.eventSoftIrqEntry())) {
45 handleSoftirqEntry(event);
46 } else if (eventName.equals(eventLayout.eventSoftIrqExit())) {
47 handleSoftirqExit(event);
48 } else if (eventName.equals(eventLayout.eventHRTimerExpireEntry())) {
49 handleHrtimerExpireEntry(event);
50 } else if (eventName.equals(eventLayout.eventHRTimerExpireExit())) {
51 handleHrtimerExpireExit(event);
52 } else if (eventName.equals(eventLayout.eventIrqHandlerEntry())) {
53 handleIrqHandlerEntry(event);
54 } else if (eventName.equals(eventLayout.eventIrqHandlerExit())) {
55 handleIrqHandlerExit(event);
5aa7fe19
FG
56 } else if (isIpiEntry(event)) {
57 handleIpiEntry(event);
58 } else if (isIpiExit(event)) {
59 handleIpiExit(event);
af7f72ce
FG
60 }
61 }
62
63 private void pushInterruptContext(ITmfEvent event, Context ctx) {
b3867ecc 64 Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event));
af7f72ce
FG
65 LttngSystemModel system = getProvider().getSystem();
66
67 LttngInterruptContext interruptCtx = new LttngInterruptContext(event, ctx);
68
69 system.pushContextStack(event.getTrace().getHostId(), cpu, interruptCtx);
70 }
71
72 private void popInterruptContext(ITmfEvent event, Context ctx) {
b3867ecc 73 Integer cpu = NonNullUtils.checkNotNull(TmfTraceUtils.resolveIntEventAspectOfClassForEvent(event.getTrace(), TmfCpuAspect.class, event));
af7f72ce
FG
74 LttngSystemModel system = getProvider().getSystem();
75
76 /* TODO: add a warning bookmark if the interrupt context is not coherent */
77 LttngInterruptContext interruptCtx = system.peekContextStack(event.getTrace().getHostId(), cpu);
78 if (interruptCtx.getContext() == ctx) {
79 system.popContextStack(event.getTrace().getHostId(), cpu);
80 }
81 }
82
83 private void handleSoftirqEntry(ITmfEvent event) {
84 pushInterruptContext(event, Context.SOFTIRQ);
85 }
86
87 private void handleSoftirqExit(ITmfEvent event) {
88 popInterruptContext(event, Context.SOFTIRQ);
89 }
90
91 private void handleIrqHandlerEntry(ITmfEvent event) {
92 pushInterruptContext(event, Context.IRQ);
93 }
94
95 private void handleIrqHandlerExit(ITmfEvent event) {
96 popInterruptContext(event, Context.IRQ);
97 }
98
99 private void handleHrtimerExpireEntry(ITmfEvent event) {
100 pushInterruptContext(event, Context.HRTIMER);
101 }
102
103 private void handleHrtimerExpireExit(ITmfEvent event) {
104 popInterruptContext(event, Context.HRTIMER);
105 }
106
5aa7fe19
FG
107 private void handleIpiEntry(ITmfEvent event) {
108 pushInterruptContext(event, Context.IPI);
109 }
110
111 private void handleIpiExit(ITmfEvent event) {
112 popInterruptContext(event, Context.IPI);
113 }
114
af7f72ce 115}
This page took 0.031911 seconds and 5 git commands to generate.