Bug 378402: Implementation of ControlFlow view and Resources view for
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng2.kernel.ui / src / org / eclipse / linuxtools / internal / lttng2 / kernel / ui / views / controlflow / ControlFlowView.java
1 /*******************************************************************************
2 * Copyright (c) 2012 Ericsson
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 * Contributors:
10 * Patrick Tasse - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.controlflow;
14
15 import java.util.ArrayList;
16 import java.util.Arrays;
17 import java.util.HashMap;
18 import java.util.List;
19 import java.util.Map;
20
21 import org.eclipse.jface.viewers.ILabelProviderListener;
22 import org.eclipse.jface.viewers.ITableLabelProvider;
23 import org.eclipse.jface.viewers.ITreeContentProvider;
24 import org.eclipse.jface.viewers.Viewer;
25 import org.eclipse.linuxtools.internal.lttng2.kernel.ui.Messages;
26 import org.eclipse.linuxtools.lttng2.kernel.core.trace.Attributes;
27 import org.eclipse.linuxtools.lttng2.kernel.core.trace.CtfKernelTrace;
28 import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
29 import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException;
30 import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException;
31 import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException;
32 import org.eclipse.linuxtools.tmf.core.experiment.TmfExperiment;
33 import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;
34 import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;
35 import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;
36 import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;
37 import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
38 import org.eclipse.linuxtools.tmf.ui.views.TmfView;
39 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphRangeListener;
40 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphSelectionListener;
41 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphTimeListener;
42 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphCombo;
43 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphProvider;
44 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent;
45 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphSelectionEvent;
46 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphTimeEvent;
47 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;
48 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
49 import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent;
50 import org.eclipse.swt.SWT;
51 import org.eclipse.swt.graphics.Image;
52 import org.eclipse.swt.widgets.Composite;
53 import org.eclipse.swt.widgets.Display;
54
55 public class ControlFlowView extends TmfView {
56
57 // ------------------------------------------------------------------------
58 // Constants
59 // ------------------------------------------------------------------------
60
61 /**
62 * View ID.
63 */
64 public static final String ID = "org.eclipse.linuxtools.lttng2.kernel.ui.views.controlflow"; //$NON-NLS-1$
65
66 private final String PROCESS_COLUMN = Messages.ControlFlowView_processColumn;
67 private final String TID_COLUMN = Messages.ControlFlowView_tidColumn;
68 private final String TGID_COLUMN = Messages.ControlFlowView_tgidColumn;
69 private final String PPID_COLUMN = Messages.ControlFlowView_ppidColumn;
70 private final String CPU_COLUMN = Messages.ControlFlowView_cpuColumn;
71 private final String BIRTH_SEC_COLUMN = Messages.ControlFlowView_birthSecColumn;
72 private final String BIRTH_NSEC_COLUMN = Messages.ControlFlowView_birthNsecColumn;
73 private final String TRACE_COLUMN = Messages.ControlFlowView_traceColumn;
74
75 private final String[] COLUMN_NAMES = new String[] {
76 PROCESS_COLUMN,
77 TID_COLUMN,
78 TGID_COLUMN,
79 PPID_COLUMN,
80 CPU_COLUMN,
81 BIRTH_SEC_COLUMN,
82 BIRTH_NSEC_COLUMN,
83 TRACE_COLUMN
84 };
85
86 // ------------------------------------------------------------------------
87 // Fields
88 // ------------------------------------------------------------------------
89
90 // The timegraph combo
91 private TimeGraphCombo fTimeGraphCombo;
92
93 // The selected experiment
94 private TmfExperiment<ITmfEvent> fSelectedExperiment;
95
96 // The timegraph entry list
97 private ArrayList<ITimeGraphEntry> fEntryList;
98
99 // The start time
100 private long fStartTime;
101
102 // The end time
103 private long fEndTime;
104
105 // ------------------------------------------------------------------------
106 // Classes
107 // ------------------------------------------------------------------------
108
109 private class TreeContentProvider implements ITreeContentProvider {
110
111 @Override
112 public void dispose() {
113 }
114
115 @Override
116 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
117 }
118
119 @Override
120 public Object[] getElements(Object inputElement) {
121 return (ITimeGraphEntry[]) inputElement;
122 }
123
124 @Override
125 public Object[] getChildren(Object parentElement) {
126 ITimeGraphEntry entry = (ITimeGraphEntry) parentElement;
127 return entry.getChildren();
128 }
129
130 @Override
131 public Object getParent(Object element) {
132 ITimeGraphEntry entry = (ITimeGraphEntry) element;
133 return entry.getParent();
134 }
135
136 @Override
137 public boolean hasChildren(Object element) {
138 ITimeGraphEntry entry = (ITimeGraphEntry) element;
139 return entry.hasChildren();
140 }
141
142 }
143
144 private class TreeLabelProvider implements ITableLabelProvider {
145
146 @Override
147 public void addListener(ILabelProviderListener listener) {
148 }
149
150 @Override
151 public void dispose() {
152 }
153
154 @Override
155 public boolean isLabelProperty(Object element, String property) {
156 return false;
157 }
158
159 @Override
160 public void removeListener(ILabelProviderListener listener) {
161 }
162
163 @Override
164 public Image getColumnImage(Object element, int columnIndex) {
165 return null;
166 }
167
168 @Override
169 public String getColumnText(Object element, int columnIndex) {
170 ControlFlowEntry entry = (ControlFlowEntry) element;
171 if (columnIndex == 0) {
172 return entry.getName();
173 } else if (columnIndex == 1) {
174 return Integer.toString(entry.getThreadId());
175 } else if (columnIndex == 3) {
176 if (entry.getPPID() != -1) {
177 return Integer.toString(entry.getPPID());
178 }
179 }
180 return ""; //$NON-NLS-1$
181 }
182
183 }
184
185 // ------------------------------------------------------------------------
186 // Constructors
187 // ------------------------------------------------------------------------
188
189 public ControlFlowView() {
190 super(ID);
191 }
192
193 // ------------------------------------------------------------------------
194 // ViewPart
195 // ------------------------------------------------------------------------
196
197 /* (non-Javadoc)
198 * @see org.eclipse.linuxtools.tmf.ui.views.TmfView#createPartControl(org.eclipse.swt.widgets.Composite)
199 */
200 @Override
201 public void createPartControl(Composite parent) {
202 fTimeGraphCombo = new TimeGraphCombo(parent, SWT.NONE);
203
204 fTimeGraphCombo.setTreeContentProvider(new TreeContentProvider());
205
206 fTimeGraphCombo.setTreeLabelProvider(new TreeLabelProvider());
207
208 fTimeGraphCombo.setTimeGraphProvider(new TimeGraphProvider() {
209 @Override
210 public String getTraceClassName(ITimeGraphEntry trace) {
211 return "trace class"; //$NON-NLS-1$
212 }
213
214 @Override
215 public String getStateName(StateColor color) {
216 return "state name"; //$NON-NLS-1$
217 }
218
219 @Override
220 public String getEventName(ITimeEvent event, boolean upper, boolean extInfo) {
221 return "event name"; //$NON-NLS-1$
222 }
223
224 @Override
225 public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {
226 return new HashMap<String, String>();
227 }
228
229 @Override
230 public StateColor getEventColor(ITimeEvent event) {
231 return StateColor.BLACK;
232 }
233 });
234
235 fTimeGraphCombo.setTreeColumns(COLUMN_NAMES);
236
237 fTimeGraphCombo.getTimeGraphViewer().addRangeListener(new ITimeGraphRangeListener() {
238 @Override
239 public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) {
240 long startTime = event.getStartTime();
241 long endTime = event.getEndTime();
242 System.out.println("timeRangeUpdated: startTime="+startTime+" endTime="+endTime);
243 }
244 });
245
246 fTimeGraphCombo.getTimeGraphViewer().addTimeListener(new ITimeGraphTimeListener() {
247 @Override
248 public void timeSelected(TimeGraphTimeEvent event) {
249 long time = event.getTime();
250 System.out.println("timeSelected: time="+time);
251 }
252 });
253
254 fTimeGraphCombo.addSelectionListener(new ITimeGraphSelectionListener() {
255 @Override
256 public void selectionChanged(TimeGraphSelectionEvent event) {
257 ITimeGraphEntry selection = event.getSelection();
258 System.out.println("selectionChanged: source="+event.getSource()+" selection="+ (selection == null ? selection : selection.getName()));
259 }
260 });
261
262 final Thread thread = new Thread() {
263 @Override
264 public void run() {
265 if (TmfExperiment.getCurrentExperiment() != null) {
266 selectExperiment(TmfExperiment.getCurrentExperiment());
267 }
268 }
269 };
270 thread.start();
271 }
272
273 /* (non-Javadoc)
274 * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
275 */
276 @Override
277 public void setFocus() {
278 fTimeGraphCombo.setFocus();
279 }
280
281 // ------------------------------------------------------------------------
282 // Signal handlers
283 // ------------------------------------------------------------------------
284
285 @TmfSignalHandler
286 public void experimentSelected(final TmfExperimentSelectedSignal<? extends ITmfEvent> signal) {
287 if (signal.getExperiment().equals(fSelectedExperiment)) {
288 return;
289 }
290
291 final Thread thread = new Thread() {
292 @Override
293 public void run() {
294 selectExperiment(signal.getExperiment());
295 }};
296 thread.run();
297 }
298
299 @SuppressWarnings("unchecked")
300 private void selectExperiment(TmfExperiment<?> experiment) {
301 fStartTime = Long.MAX_VALUE;
302 fEndTime = Long.MIN_VALUE;
303 fSelectedExperiment = (TmfExperiment<ITmfEvent>) experiment;
304 HashMap<String, ITimeGraphEntry> traces = new HashMap<String, ITimeGraphEntry>();
305 fEntryList = new ArrayList<ITimeGraphEntry>();
306 for (ITmfTrace<?> trace : experiment.getTraces()) {
307 if (trace instanceof CtfKernelTrace) {
308 CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;
309 IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();
310 ControlFlowEntry swapperEntry = null;
311 long start = ssq.getStartTime();
312 long end = ssq.getCurrentEndTime();
313 fStartTime = Math.min(fStartTime, start);
314 fEndTime = Math.max(fEndTime, end);
315 List<Integer> threadQuarks = ssq.getQuarks(Attributes.THREADS, "*"); //$NON-NLS-1$
316 for (int threadQuark : threadQuarks) {
317 String threadName = ssq.getAttributeName(threadQuark);
318 int threadId = -1;
319 try {
320 threadId = Integer.parseInt(threadName);
321 } catch (NumberFormatException e1) {
322 continue;
323 }
324 int execNameQuark = -1;
325 try {
326 try {
327 execNameQuark = ssq.getQuarkRelative(threadQuark, Attributes.EXEC_NAME);
328 } catch (AttributeNotFoundException e) {
329 continue;
330 }
331 int ppidQuark = ssq.getQuarkRelative(threadQuark, Attributes.PPID);
332 List<ITmfStateInterval> execNameIntervals = ssq.queryHistoryRange(execNameQuark, start, end);
333 for (ITmfStateInterval execNameInterval : execNameIntervals) {
334 if (!execNameInterval.getStateValue().isNull() && execNameInterval.getStateValue().getType() == 1) {
335 String execName = execNameInterval.getStateValue().unboxStr();
336 long startTime = execNameInterval.getStartTime();
337 long endTime = execNameInterval.getEndTime();
338 int ppid = -1;
339 if (ppidQuark != -1) {
340 ITmfStateInterval ppidInterval = ssq.querySingleState(startTime, ppidQuark);
341 ppid = ppidInterval.getStateValue().unboxInt();
342 }
343 ControlFlowEntry entry;
344 if (threadId == 0) {
345 if (swapperEntry == null) {
346 swapperEntry = new ControlFlowEntry(ctfKernelTrace, "swapper", threadId, ppid, startTime, endTime);
347 fEntryList.add(swapperEntry);
348 }
349 entry = swapperEntry;
350 } else {
351 entry = new ControlFlowEntry(ctfKernelTrace, execName, threadId, ppid, startTime, endTime);
352 fEntryList.add(entry);
353 }
354 entry.addTraceEvent(new TimeEvent(entry, startTime, endTime - startTime));
355 }
356 }
357 } catch (AttributeNotFoundException e) {
358 e.printStackTrace();
359 } catch (TimeRangeException e) {
360 e.printStackTrace();
361 } catch (StateValueTypeException e) {
362 e.printStackTrace();
363 }
364 }
365 }
366 refresh();
367 }
368 }
369
370 private void refresh() {
371 Display.getDefault().asyncExec(new Runnable() {
372 @Override
373 public void run() {
374 if (fTimeGraphCombo.isDisposed()) {
375 return;
376 }
377 ITimeGraphEntry[] entries = fEntryList.toArray(new ITimeGraphEntry[0]);
378 Arrays.sort(entries);
379 fTimeGraphCombo.setInput(entries);
380 fTimeGraphCombo.getTimeGraphViewer().setTimeBounds(fStartTime, fEndTime);
381 fTimeGraphCombo.getTimeGraphViewer().setStartFinishTime(fStartTime, fEndTime);
382 }
383 });
384 }
385
386 }
This page took 0.040407 seconds and 5 git commands to generate.