os.linux: Bump KernelStateProvider version number
[deliverable/tracecompass.git] / analysis / org.eclipse.tracecompass.analysis.os.linux.core / src / org / eclipse / tracecompass / internal / analysis / os / linux / core / kernel / KernelStateProvider.java
CommitLineData
c8f45ad2
MK
1/*******************************************************************************
2 * Copyright (c) 2012, 2015 Ericsson
3 * Copyright (c) 2010, 2011 École Polytechnique de Montréal
4 * Copyright (c) 2010, 2011 Alexandre Montplaisir <alexandre.montplaisir@gmail.com>
5 *
6 * All rights reserved. This program and the accompanying materials are
7 * made available under the terms of the Eclipse Public License v1.0 which
8 * accompanies this distribution, and is available at
9 * http://www.eclipse.org/legal/epl-v10.html
10 *
11 *******************************************************************************/
12
13package org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel;
14
15import java.util.Map;
16
17import org.eclipse.jdt.annotation.Nullable;
18import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
19import org.eclipse.tracecompass.common.core.NonNullUtils;
4aae3c1a 20import org.eclipse.tracecompass.internal.analysis.os.linux.core.Activator;
c8f45ad2
MK
21import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.IrqEntryHandler;
22import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.IrqExitHandler;
23import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.KernelEventHandler;
24import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.PiSetprioHandler;
25import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.ProcessExitHandler;
26import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.ProcessForkHandler;
27import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.ProcessFreeHandler;
28import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.SchedSwitchHandler;
29import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.SchedWakeupHandler;
30import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.SoftIrqEntryHandler;
31import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.SoftIrqExitHandler;
32import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.SoftIrqRaiseHandler;
33import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.StateDumpHandler;
34import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.SysEntryHandler;
35import org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel.handlers.SysExitHandler;
36import org.eclipse.tracecompass.statesystem.core.ITmfStateSystemBuilder;
37import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException;
38import org.eclipse.tracecompass.statesystem.core.exceptions.StateValueTypeException;
39import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException;
40import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
41import org.eclipse.tracecompass.tmf.core.statesystem.AbstractTmfStateProvider;
42import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
43
44import com.google.common.collect.ImmutableMap;
45
46/**
19ed6598
MK
47 * This is the state change input plugin for the state system which handles the
48 * kernel traces.
c8f45ad2
MK
49 *
50 * @author Alexandre Montplaisir
51 */
52public class KernelStateProvider extends AbstractTmfStateProvider {
53
54 // ------------------------------------------------------------------------
55 // Static fields
56 // ------------------------------------------------------------------------
57
58 /**
59 * Version number of this state provider. Please bump this if you modify the
60 * contents of the generated state history in some way.
61 */
1d58a53c 62 private static final int VERSION = 17;
c8f45ad2
MK
63
64 // ------------------------------------------------------------------------
65 // Fields
66 // ------------------------------------------------------------------------
67
68 private final Map<String, KernelEventHandler> fEventNames;
69 private final IKernelAnalysisEventLayout fLayout;
70
71 private final KernelEventHandler fSysEntryHandler;
72 private final KernelEventHandler fSysExitHandler;
73
74 // ------------------------------------------------------------------------
75 // Constructor
76 // ------------------------------------------------------------------------
77
78 /**
79 * Instantiate a new state provider plugin.
80 *
81 * @param trace
82 * The LTTng 2.0 kernel trace directory
83 * @param layout
84 * The event layout to use for this state provider. Usually
85 * depending on the tracer implementation.
86 */
87 public KernelStateProvider(ITmfTrace trace, IKernelAnalysisEventLayout layout) {
88 super(trace, "Kernel"); //$NON-NLS-1$
89 fLayout = layout;
90 fEventNames = buildEventNames(layout);
91
92 fSysEntryHandler = new SysEntryHandler(fLayout);
93 fSysExitHandler = new SysExitHandler(fLayout);
94 }
95
96 // ------------------------------------------------------------------------
97 // Event names management
98 // ------------------------------------------------------------------------
99
100 private static Map<String, KernelEventHandler> buildEventNames(IKernelAnalysisEventLayout layout) {
101 ImmutableMap.Builder<String, KernelEventHandler> builder = ImmutableMap.builder();
102
103 builder.put(layout.eventIrqHandlerEntry(), new IrqEntryHandler(layout));
104 builder.put(layout.eventIrqHandlerExit(), new IrqExitHandler(layout));
105 builder.put(layout.eventSoftIrqEntry(), new SoftIrqEntryHandler(layout));
106 builder.put(layout.eventSoftIrqExit(), new SoftIrqExitHandler(layout));
107 builder.put(layout.eventSoftIrqRaise(), new SoftIrqRaiseHandler(layout));
108 builder.put(layout.eventSchedSwitch(), new SchedSwitchHandler(layout));
109 builder.put(layout.eventSchedPiSetprio(), new PiSetprioHandler(layout));
110 builder.put(layout.eventSchedProcessFork(), new ProcessForkHandler(layout));
111 builder.put(layout.eventSchedProcessExit(), new ProcessExitHandler(layout));
112 builder.put(layout.eventSchedProcessFree(), new ProcessFreeHandler(layout));
113
114 final String eventStatedumpProcessState = layout.eventStatedumpProcessState();
115 if (eventStatedumpProcessState != null) {
116 builder.put(eventStatedumpProcessState, new StateDumpHandler(layout));
117 }
118
119 for (String eventSchedWakeup : layout.eventsSchedWakeup()) {
120 builder.put(eventSchedWakeup, new SchedWakeupHandler(layout));
121 }
122
0e4f957e 123 return builder.build();
c8f45ad2
MK
124 }
125
126 // ------------------------------------------------------------------------
127 // IStateChangeInput
128 // ------------------------------------------------------------------------
129
130 @Override
131 public int getVersion() {
132 return VERSION;
133 }
134
c8f45ad2
MK
135 @Override
136 public KernelStateProvider getNewInstance() {
137 return new KernelStateProvider(this.getTrace(), fLayout);
138 }
139
140 @Override
141 protected void eventHandle(@Nullable ITmfEvent event) {
142 if (event == null) {
143 return;
144 }
145
146 final String eventName = event.getName();
147
148 try {
149 final ITmfStateSystemBuilder ss = NonNullUtils.checkNotNull(getStateSystemBuilder());
150 /*
151 * Feed event to the history system if it's known to cause a state
152 * transition.
153 */
154 KernelEventHandler handler = fEventNames.get(eventName);
155 if (handler == null) {
4aae3c1a 156 if (isSyscallExit(eventName)) {
c8f45ad2 157 handler = fSysExitHandler;
4aae3c1a 158 } else if (isSyscallEntry(eventName)) {
c8f45ad2
MK
159 handler = fSysEntryHandler;
160 }
161 }
162 if (handler != null) {
163 handler.handleEvent(ss, event);
164 }
165
166 } catch (AttributeNotFoundException ae) {
167 /*
168 * This would indicate a problem with the logic of the manager here,
169 * so it shouldn't happen.
170 */
4aae3c1a 171 Activator.getDefault().logError("Attribute not found: " + ae.getMessage(), ae); //$NON-NLS-1$
c8f45ad2
MK
172
173 } catch (TimeRangeException tre) {
174 /*
175 * This would happen if the events in the trace aren't ordered
176 * chronologically, which should never be the case ...
177 */
4aae3c1a
MK
178 Activator.getDefault().logError("TimeRangeExcpetion caught in the state system's event manager.\n" + //$NON-NLS-1$
179 "Are the events in the trace correctly ordered?\n" + tre.getMessage(), tre); //$NON-NLS-1$
c8f45ad2
MK
180
181 } catch (StateValueTypeException sve) {
182 /*
183 * This would happen if we were trying to push/pop attributes not of
184 * type integer. Which, once again, should never happen.
185 */
4aae3c1a 186 Activator.getDefault().logError("State value error: " + sve.getMessage(), sve); //$NON-NLS-1$
c8f45ad2
MK
187 }
188 }
189
3c3795b8
AM
190 private boolean isSyscallEntry(String eventName) {
191 return (eventName.startsWith(fLayout.eventSyscallEntryPrefix())
4aae3c1a
MK
192 || eventName.startsWith(fLayout.eventCompatSyscallEntryPrefix()));
193 }
194
3c3795b8 195 private boolean isSyscallExit(String eventName) {
01f2a507
AM
196 return (eventName.startsWith(fLayout.eventSyscallExitPrefix()) ||
197 eventName.startsWith(fLayout.eventCompatSyscallExitPrefix()));
4aae3c1a
MK
198 }
199
c8f45ad2 200}
This page took 0.037842 seconds and 5 git commands to generate.