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
.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
;
22 * Event Handler to handle the interrupt context stack of the model
24 * @author Francis Giraldeau
25 * @author Geneviève Bastien
27 public class EventContextHandler
extends BaseHandler
{
33 * The parent graph provider
35 public EventContextHandler(LttngKernelExecGraphProvider provider
) {
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
);
58 private void pushInterruptContext(ITmfEvent event
, Context ctx
) {
59 Object cpuObj
= TmfTraceUtils
.resolveEventAspectOfClassForEvent(event
.getTrace(), TmfCpuAspect
.class, event
);
61 throw new NullPointerException();
63 Integer cpu
= (Integer
) cpuObj
;
64 LttngSystemModel system
= getProvider().getSystem();
66 LttngInterruptContext interruptCtx
= new LttngInterruptContext(event
, ctx
);
68 system
.pushContextStack(event
.getTrace().getHostId(), cpu
, interruptCtx
);
71 private void popInterruptContext(ITmfEvent event
, Context ctx
) {
72 Object cpuObj
= TmfTraceUtils
.resolveEventAspectOfClassForEvent(event
.getTrace(), TmfCpuAspect
.class, event
);
74 throw new NullPointerException();
76 Integer cpu
= (Integer
) cpuObj
;
77 LttngSystemModel system
= getProvider().getSystem();
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
);
86 private void handleSoftirqEntry(ITmfEvent event
) {
87 pushInterruptContext(event
, Context
.SOFTIRQ
);
90 private void handleSoftirqExit(ITmfEvent event
) {
91 popInterruptContext(event
, Context
.SOFTIRQ
);
94 private void handleIrqHandlerEntry(ITmfEvent event
) {
95 pushInterruptContext(event
, Context
.IRQ
);
98 private void handleIrqHandlerExit(ITmfEvent event
) {
99 popInterruptContext(event
, Context
.IRQ
);
102 private void handleHrtimerExpireEntry(ITmfEvent event
) {
103 pushInterruptContext(event
, Context
.HRTIMER
);
106 private void handleHrtimerExpireExit(ITmfEvent event
) {
107 popInterruptContext(event
, Context
.HRTIMER
);