1 /*******************************************************************************
2 * Copyright (c) 2015 École Polytechnique de Montréal
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 *******************************************************************************/
10 package org
.eclipse
.tracecompass
.internal
.lttng2
.kernel
.core
.analysis
.graph
.handlers
;
12 import org
.eclipse
.tracecompass
.analysis
.os
.linux
.core
.trace
.IKernelAnalysisEventLayout
;
13 import org
.eclipse
.tracecompass
.common
.core
.NonNullUtils
;
14 import org
.eclipse
.tracecompass
.internal
.lttng2
.kernel
.core
.analysis
.graph
.building
.LttngKernelExecGraphProvider
;
15 import org
.eclipse
.tracecompass
.internal
.lttng2
.kernel
.core
.analysis
.graph
.building
.LttngKernelExecGraphProvider
.Context
;
16 import org
.eclipse
.tracecompass
.internal
.lttng2
.kernel
.core
.analysis
.graph
.model
.LttngInterruptContext
;
17 import org
.eclipse
.tracecompass
.internal
.lttng2
.kernel
.core
.analysis
.graph
.model
.LttngSystemModel
;
18 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
19 import org
.eclipse
.tracecompass
.tmf
.core
.event
.aspect
.TmfCpuAspect
;
20 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceUtils
;
23 * Event Handler to handle the interrupt context stack of the model
25 * @author Francis Giraldeau
26 * @author Geneviève Bastien
28 public class EventContextHandler
extends BaseHandler
{
34 * The parent graph provider
36 public EventContextHandler(LttngKernelExecGraphProvider provider
) {
41 public void handleEvent(ITmfEvent event
) {
42 String eventName
= event
.getName();
43 IKernelAnalysisEventLayout eventLayout
= getProvider().getEventLayout();
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
);
59 private void pushInterruptContext(ITmfEvent event
, Context ctx
) {
60 Integer cpu
= NonNullUtils
.checkNotNull(TmfTraceUtils
.resolveIntEventAspectOfClassForEvent(event
.getTrace(), TmfCpuAspect
.class, event
));
61 LttngSystemModel system
= getProvider().getSystem();
63 LttngInterruptContext interruptCtx
= new LttngInterruptContext(event
, ctx
);
65 system
.pushContextStack(event
.getTrace().getHostId(), cpu
, interruptCtx
);
68 private void popInterruptContext(ITmfEvent event
, Context ctx
) {
69 Integer cpu
= NonNullUtils
.checkNotNull(TmfTraceUtils
.resolveIntEventAspectOfClassForEvent(event
.getTrace(), TmfCpuAspect
.class, event
));
70 LttngSystemModel system
= getProvider().getSystem();
72 /* TODO: add a warning bookmark if the interrupt context is not coherent */
73 LttngInterruptContext interruptCtx
= system
.peekContextStack(event
.getTrace().getHostId(), cpu
);
74 if (interruptCtx
.getContext() == ctx
) {
75 system
.popContextStack(event
.getTrace().getHostId(), cpu
);
79 private void handleSoftirqEntry(ITmfEvent event
) {
80 pushInterruptContext(event
, Context
.SOFTIRQ
);
83 private void handleSoftirqExit(ITmfEvent event
) {
84 popInterruptContext(event
, Context
.SOFTIRQ
);
87 private void handleIrqHandlerEntry(ITmfEvent event
) {
88 pushInterruptContext(event
, Context
.IRQ
);
91 private void handleIrqHandlerExit(ITmfEvent event
) {
92 popInterruptContext(event
, Context
.IRQ
);
95 private void handleHrtimerExpireEntry(ITmfEvent event
) {
96 pushInterruptContext(event
, Context
.HRTIMER
);
99 private void handleHrtimerExpireExit(ITmfEvent event
) {
100 popInterruptContext(event
, Context
.HRTIMER
);