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