Commit | Line | Data |
---|---|---|
04835162 PT |
1 | /*******************************************************************************\r |
2 | * Copyright (c) 2012 Ericsson\r | |
3 | * \r | |
4 | * All rights reserved. This program and the accompanying materials are\r | |
5 | * made available under the terms of the Eclipse Public License v1.0 which\r | |
6 | * accompanies this distribution, and is available at\r | |
7 | * http://www.eclipse.org/legal/epl-v10.html\r | |
8 | * \r | |
9 | * Contributors:\r | |
10 | * Patrick Tasse - Initial API and implementation\r | |
11 | *******************************************************************************/\r | |
12 | \r | |
13 | package org.eclipse.linuxtools.internal.lttng2.kernel.ui.views.resources;\r | |
14 | \r | |
15 | import java.util.ArrayList;\r | |
16 | import java.util.HashMap;\r | |
17 | import java.util.Iterator;\r | |
18 | import java.util.List;\r | |
19 | import java.util.Map;\r | |
20 | \r | |
21 | import org.eclipse.linuxtools.lttng2.kernel.core.trace.Attributes;\r | |
22 | import org.eclipse.linuxtools.lttng2.kernel.core.trace.CtfKernelTrace;\r | |
23 | import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;\r | |
24 | import org.eclipse.linuxtools.tmf.core.event.TmfEvent;\r | |
25 | import org.eclipse.linuxtools.tmf.core.exceptions.AttributeNotFoundException;\r | |
26 | import org.eclipse.linuxtools.tmf.core.exceptions.StateValueTypeException;\r | |
27 | import org.eclipse.linuxtools.tmf.core.exceptions.TimeRangeException;\r | |
04835162 PT |
28 | import org.eclipse.linuxtools.tmf.core.interval.ITmfStateInterval;\r |
29 | import org.eclipse.linuxtools.tmf.core.signal.TmfExperimentSelectedSignal;\r | |
30 | import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;\r | |
31 | import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;\r | |
32 | import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;\r | |
9e0640dc | 33 | import org.eclipse.linuxtools.tmf.core.trace.TmfExperiment;\r |
04835162 | 34 | import org.eclipse.linuxtools.tmf.ui.views.TmfView;\r |
4867b9bd | 35 | import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphProvider;\r |
04835162 PT |
36 | import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphViewer;\r |
37 | import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r | |
38 | import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r | |
39 | import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.TimeEvent;\r | |
40 | import org.eclipse.swt.SWT;\r | |
41 | import org.eclipse.swt.widgets.Composite;\r | |
42 | import org.eclipse.swt.widgets.Display;\r | |
43 | \r | |
44 | public class ResourcesView extends TmfView {\r | |
45 | \r | |
46 | // ------------------------------------------------------------------------\r | |
47 | // Constants\r | |
48 | // ------------------------------------------------------------------------\r | |
49 | \r | |
50 | /**\r | |
51 | * View ID.\r | |
52 | */\r | |
53 | public static final String ID = "org.eclipse.linuxtools.lttng2.kernel.ui.views.resources"; //$NON-NLS-1$\r | |
54 | \r | |
55 | // ------------------------------------------------------------------------\r | |
56 | // Fields\r | |
57 | // ------------------------------------------------------------------------\r | |
58 | \r | |
59 | // The time graph viewer\r | |
60 | TimeGraphViewer fTimeGraphViewer;\r | |
61 | \r | |
62 | // The selected experiment\r | |
63 | private TmfExperiment<ITmfEvent> fSelectedExperiment;\r | |
64 | \r | |
65 | // The time graph entry list\r | |
4867b9bd | 66 | private ArrayList<ITimeGraphEntry> fEntryList;\r |
04835162 PT |
67 | \r |
68 | // The start time\r | |
69 | private long fStartTime;\r | |
70 | \r | |
71 | // The end time\r | |
72 | private long fEndTime;\r | |
73 | \r | |
74 | // The display width\r | |
75 | private int fDisplayWidth;\r | |
76 | \r | |
77 | // ------------------------------------------------------------------------\r | |
78 | // Classes\r | |
79 | // ------------------------------------------------------------------------\r | |
80 | \r | |
4867b9bd MK |
81 | private class GroupEntry implements ITimeGraphEntry {\r |
82 | public ITimeGraphEntry fParent;\r | |
83 | public ArrayList<ITimeGraphEntry> fChildren;\r | |
04835162 PT |
84 | public String fName;\r |
85 | \r | |
4867b9bd MK |
86 | public GroupEntry(ITimeGraphEntry parent, String name) {\r |
87 | fParent = parent;\r | |
88 | fChildren = new ArrayList<ITimeGraphEntry>();\r | |
04835162 PT |
89 | fName = name;\r |
90 | }\r | |
91 | \r | |
92 | @Override\r | |
93 | public ITimeGraphEntry getParent() {\r | |
4867b9bd | 94 | return fParent;\r |
04835162 PT |
95 | }\r |
96 | \r | |
97 | @Override\r | |
98 | public boolean hasChildren() {\r | |
99 | return fChildren != null && fChildren.size() > 0;\r | |
100 | }\r | |
101 | \r | |
102 | @Override\r | |
4867b9bd MK |
103 | public ITimeGraphEntry[] getChildren() {\r |
104 | return fChildren.toArray(new ITimeGraphEntry[0]);\r | |
04835162 PT |
105 | }\r |
106 | \r | |
107 | @Override\r | |
108 | public String getName() {\r | |
109 | return fName;\r | |
110 | }\r | |
111 | \r | |
112 | @Override\r | |
113 | public long getStartTime() {\r | |
114 | return -1;\r | |
115 | }\r | |
116 | \r | |
117 | @Override\r | |
4867b9bd | 118 | public long getStopTime() {\r |
04835162 PT |
119 | return -1;\r |
120 | }\r | |
121 | \r | |
122 | @Override\r | |
123 | public Iterator<ITimeEvent> getTimeEventsIterator() {\r | |
124 | return null;\r | |
125 | }\r | |
126 | \r | |
127 | @Override\r | |
128 | public <T extends ITimeEvent> Iterator<T> getTimeEventsIterator(long startTime, long stopTime, long visibleDuration) {\r | |
129 | return null;\r | |
130 | }\r | |
131 | \r | |
4867b9bd MK |
132 | public void addChild(ITimeGraphEntry entry) {\r |
133 | fChildren.add(entry);\r | |
04835162 PT |
134 | }\r |
135 | }\r | |
136 | \r | |
137 | // ------------------------------------------------------------------------\r | |
138 | // Constructors\r | |
139 | // ------------------------------------------------------------------------\r | |
140 | \r | |
141 | public ResourcesView() {\r | |
142 | super(ID);\r | |
143 | fDisplayWidth = Display.getDefault().getBounds().width;\r | |
144 | }\r | |
145 | \r | |
146 | // ------------------------------------------------------------------------\r | |
147 | // ViewPart\r | |
148 | // ------------------------------------------------------------------------\r | |
149 | \r | |
150 | /* (non-Javadoc)\r | |
151 | * @see org.eclipse.linuxtools.tmf.ui.views.TmfView#createPartControl(org.eclipse.swt.widgets.Composite)\r | |
152 | */\r | |
153 | @Override\r | |
154 | public void createPartControl(Composite parent) {\r | |
155 | fTimeGraphViewer = new TimeGraphViewer(parent, SWT.NONE);\r | |
156 | \r | |
4867b9bd | 157 | fTimeGraphViewer.setTimeGraphProvider(new TimeGraphProvider() {\r |
04835162 | 158 | @Override\r |
4867b9bd MK |
159 | public String getTraceClassName(ITimeGraphEntry trace) {\r |
160 | return "trace class"; //$NON-NLS-1$\r | |
04835162 PT |
161 | }\r |
162 | \r | |
163 | @Override\r | |
4867b9bd MK |
164 | public String getStateName(StateColor color) {\r |
165 | return "state name"; //$NON-NLS-1$\r | |
04835162 PT |
166 | }\r |
167 | \r | |
168 | @Override\r | |
4867b9bd MK |
169 | public String getEventName(ITimeEvent event, boolean upper, boolean extInfo) {\r |
170 | return "event name"; //$NON-NLS-1$\r | |
cf7d106f | 171 | }\r |
4867b9bd | 172 | \r |
cf7d106f | 173 | @Override\r |
4867b9bd MK |
174 | public Map<String, String> getEventHoverToolTipInfo(ITimeEvent event) {\r |
175 | return new HashMap<String, String>();\r | |
cf7d106f | 176 | }\r |
4867b9bd | 177 | \r |
cf7d106f | 178 | @Override\r |
4867b9bd MK |
179 | public StateColor getEventColor(ITimeEvent event) {\r |
180 | if (event.getTime() % 2 == 0) {\r | |
181 | return StateColor.BLACK;\r | |
182 | } else {\r | |
183 | return StateColor.GRAY;\r | |
04835162 PT |
184 | }\r |
185 | }\r | |
186 | });\r | |
187 | \r | |
4867b9bd | 188 | final Thread thread = new Thread() {\r |
04835162 PT |
189 | @Override\r |
190 | public void run() {\r | |
191 | if (TmfExperiment.getCurrentExperiment() != null) {\r | |
192 | selectExperiment(TmfExperiment.getCurrentExperiment());\r | |
193 | }\r | |
194 | }\r | |
195 | };\r | |
196 | thread.start();\r | |
197 | }\r | |
198 | \r | |
199 | /* (non-Javadoc)\r | |
200 | * @see org.eclipse.ui.part.WorkbenchPart#setFocus()\r | |
201 | */\r | |
202 | @Override\r | |
203 | public void setFocus() {\r | |
204 | fTimeGraphViewer.setFocus();\r | |
205 | }\r | |
206 | \r | |
207 | // ------------------------------------------------------------------------\r | |
208 | // Signal handlers\r | |
209 | // ------------------------------------------------------------------------\r | |
210 | \r | |
211 | @TmfSignalHandler\r | |
212 | public void experimentSelected(final TmfExperimentSelectedSignal<? extends TmfEvent> signal) {\r | |
213 | if (signal.getExperiment().equals(fSelectedExperiment)) {\r | |
214 | return;\r | |
215 | }\r | |
216 | \r | |
4867b9bd | 217 | final Thread thread = new Thread() {\r |
04835162 PT |
218 | @Override\r |
219 | public void run() {\r | |
220 | selectExperiment(signal.getExperiment());\r | |
221 | }};\r | |
222 | thread.start();\r | |
223 | }\r | |
224 | \r | |
225 | @SuppressWarnings("unchecked")\r | |
226 | private void selectExperiment(TmfExperiment<?> experiment) {\r | |
227 | fStartTime = Long.MAX_VALUE;\r | |
228 | fEndTime = Long.MIN_VALUE;\r | |
229 | fSelectedExperiment = (TmfExperiment<ITmfEvent>) experiment;\r | |
4867b9bd | 230 | fEntryList = new ArrayList<ITimeGraphEntry>();\r |
04835162 | 231 | for (ITmfTrace<?> trace : experiment.getTraces()) {\r |
4867b9bd MK |
232 | GroupEntry groupEntry = new GroupEntry(null, trace.getPath());\r |
233 | fEntryList.add(groupEntry);\r | |
234 | refresh();\r | |
04835162 PT |
235 | if (trace instanceof CtfKernelTrace) {\r |
236 | CtfKernelTrace ctfKernelTrace = (CtfKernelTrace) trace;\r | |
237 | IStateSystemQuerier ssq = ctfKernelTrace.getStateSystem();\r | |
4867b9bd MK |
238 | long start = ssq.getStartTime();\r |
239 | long end = ssq.getCurrentEndTime();\r | |
240 | fStartTime = Math.min(fStartTime, start);\r | |
241 | fEndTime = Math.max(fEndTime, end);\r | |
04835162 | 242 | List<Integer> cpuQuarks = ssq.getQuarks(Attributes.CPUS, "*"); //$NON-NLS-1$\r |
4867b9bd MK |
243 | for (int cpuQuark : cpuQuarks) {\r |
244 | String cpuName = "CPU " + ssq.getAttributeName(cpuQuark);\r | |
245 | ResourcesEntry entry = new ResourcesEntry(groupEntry, ctfKernelTrace, cpuName);\r | |
246 | try {\r | |
247 | int currentThreadQuark = ssq.getQuarkRelative(cpuQuark, Attributes.CURRENT_THREAD);\r | |
248 | long resolution = (end - start) / fDisplayWidth;\r | |
249 | List<ITmfStateInterval> currentThreadIntervals = ssq.queryHistoryRange(currentThreadQuark, start, end, resolution);\r | |
250 | for (ITmfStateInterval currentThreadInterval : currentThreadIntervals) {\r | |
251 | if (!currentThreadInterval.getStateValue().isNull() && currentThreadInterval.getStateValue().getType() == 0) {\r | |
252 | int currentThread = currentThreadInterval.getStateValue().unboxInt();\r | |
253 | long startTime = currentThreadInterval.getStartTime();\r | |
254 | long endTime = currentThreadInterval.getEndTime();\r | |
255 | entry.addTraceEvent(new TimeEvent(entry, startTime, endTime - startTime));\r | |
256 | }\r | |
cf7d106f | 257 | }\r |
4867b9bd MK |
258 | } catch (AttributeNotFoundException e) {\r |
259 | e.printStackTrace();\r | |
260 | } catch (TimeRangeException e) {\r | |
261 | e.printStackTrace();\r | |
262 | } catch (StateValueTypeException e) {\r | |
263 | e.printStackTrace();\r | |
cf7d106f | 264 | }\r |
4867b9bd MK |
265 | groupEntry.addChild(entry);\r |
266 | refresh();\r | |
04835162 PT |
267 | }\r |
268 | }\r | |
269 | }\r | |
270 | }\r | |
271 | \r | |
272 | private void refresh() {\r | |
273 | Display.getDefault().asyncExec(new Runnable() {\r | |
274 | @Override\r | |
275 | public void run() {\r | |
276 | if (fTimeGraphViewer.getControl().isDisposed()) {\r | |
277 | return;\r | |
278 | }\r | |
4867b9bd | 279 | fTimeGraphViewer.setInput(fEntryList.toArray(new ITimeGraphEntry[0]));\r |
04835162 PT |
280 | fTimeGraphViewer.setTimeBounds(fStartTime, fEndTime);\r |
281 | fTimeGraphViewer.setStartFinishTime(fStartTime, fEndTime);\r | |
282 | }\r | |
283 | });\r | |
284 | }\r | |
285 | \r | |
286 | }\r |