lttng: Javadoc udpate for the lttng2.kernel.ui package
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / timechart / TimeChartAnalysisEntry.java
CommitLineData
ce62370f
FC
1/*******************************************************************************\r
2 * Copyright (c) 2010 Ericsson\r
013a5f1c 3 *\r
ce62370f
FC
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
013a5f1c 8 *\r
ce62370f
FC
9 * Contributors:\r
10 * Patrick Tasse - Initial API and implementation\r
11 *******************************************************************************/\r
12\r
13package org.eclipse.linuxtools.tmf.ui.views.timechart;\r
14\r
15import java.util.Iterator;\r
16import java.util.NoSuchElementException;\r
17import java.util.Vector;\r
18\r
6c13869b 19import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;\r
2fa130b8 20import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
fb5cad3d 21import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
ce62370f 22\r
013a5f1c
AM
23/**\r
24 * An entry (row) in the time chart analysis view\r
25 *\r
26 * @version 1.0\r
27 * @author Patrick Tasse\r
28 */\r
fb5cad3d 29public class TimeChartAnalysisEntry implements ITimeGraphEntry {\r
ce62370f 30\r
013a5f1c
AM
31 private final ITmfTrace<?> fTrace;\r
32 private final Vector<TimeChartEvent> fTraceEvents;\r
ce62370f
FC
33 private int fPower = 0; // 2^fPower nanoseconds per vector position\r
34 private long fReferenceTime = -1; // time corresponding to beginning of index 0\r
35 private long fStartTime = -1; // time of first event\r
36 private long fStopTime = -1; // time of last event\r
37 private long fLastRank = -1; // rank of last processed trace event\r
38\r
828e5592 39 TimeChartAnalysisEntry(ITmfTrace<?> trace, int modelSize) {\r
ce62370f
FC
40 fTrace = trace;\r
41 fTraceEvents = new Vector<TimeChartEvent>(modelSize);\r
42 }\r
013a5f1c 43\r
fb5cad3d
PT
44 @Override\r
45 public ITimeGraphEntry[] getChildren() {\r
46 return null;\r
ce62370f 47 }\r
fb5cad3d 48\r
ce62370f 49 @Override\r
fb5cad3d
PT
50 public ITimeGraphEntry getParent() {\r
51 return null;\r
ce62370f
FC
52 }\r
53\r
54 @Override\r
fb5cad3d
PT
55 public boolean hasChildren() {\r
56 return false;\r
ce62370f
FC
57 }\r
58\r
59 @Override\r
60 public String getName() {\r
61 return fTrace.getName();\r
62 }\r
63\r
64 @Override\r
65 public long getStartTime() {\r
66 return fStartTime;\r
67 }\r
68\r
69 @Override\r
b83af2c3 70 public long getEndTime() {\r
ce62370f
FC
71 return fStopTime;\r
72 }\r
73\r
bc51e30c
PT
74 @Override\r
75 public boolean hasTimeEvents() {\r
76 return true;\r
77 }\r
78\r
ce62370f 79 @Override\r
fb5cad3d 80 public Iterator<ITimeEvent> getTimeEventsIterator() {\r
ce62370f
FC
81 return new EntryIterator(0, Long.MAX_VALUE, 0);\r
82 }\r
013a5f1c 83\r
ce62370f 84 @Override\r
fb5cad3d 85 public Iterator<ITimeEvent> getTimeEventsIterator(long startTime, long stopTime, long maxDuration) {\r
ce62370f
FC
86 return new EntryIterator(startTime, stopTime, maxDuration);\r
87 }\r
013a5f1c 88\r
ce62370f
FC
89 private class EntryIterator implements Iterator<ITimeEvent> {\r
90 private final long fIteratorStartTime;\r
91 private final long fIteratorStopTime;\r
92 private final long fIteratorMaxDuration;\r
93 private long lastTime = -1;\r
94 private TimeChartEvent next = null;\r
95 private Iterator<ITimeEvent> nestedIterator = null;\r
013a5f1c 96\r
ce62370f
FC
97 public EntryIterator(long startTime, long stopTime, long maxDuration) {\r
98 fIteratorStartTime = startTime;\r
99 fIteratorStopTime = stopTime;\r
100 fIteratorMaxDuration = maxDuration;\r
101 }\r
013a5f1c 102\r
ce62370f
FC
103 @Override\r
104 public boolean hasNext() {\r
105 synchronized (fTraceEvents) {\r
013a5f1c
AM
106 if (next != null) {\r
107 return true;\r
108 }\r
ce62370f
FC
109 if (nestedIterator != null) {\r
110 if (nestedIterator.hasNext()) {\r
111 return true;\r
112 } else {\r
113 nestedIterator = null;\r
114 }\r
115 }\r
116 long time = (lastTime == -1) ? fStartTime : lastTime;\r
117 int index = (fReferenceTime == -1) ? 0 : (int) ((time - fReferenceTime) >> fPower);\r
118 while (index < fTraceEvents.size()) {\r
119 TimeChartEvent event = fTraceEvents.get(index++);\r
120 if (event != null && (lastTime == -1 || event.getTime() > time)) {\r
121 if (event.getTime() + event.getDuration() >= fIteratorStartTime && event.getTime() <= fIteratorStopTime) {\r
122 if (event.getItemizedEntry() == null || event.getDuration() <= fIteratorMaxDuration) {\r
123 lastTime = event.getTime() + event.getDuration();\r
124 next = event;\r
125 return true;\r
126 } else {\r
fb5cad3d 127 nestedIterator = event.getItemizedEntry().getTimeEventsIterator(fIteratorStartTime, fIteratorStopTime, fIteratorMaxDuration);\r
ce62370f
FC
128 return nestedIterator.hasNext();\r
129 }\r
130 }\r
131 }\r
132 }\r
133 return false;\r
134 }\r
135 }\r
136\r
137 @Override\r
138 public TimeChartEvent next() {\r
139 synchronized (fTraceEvents) {\r
140 if (nestedIterator != null) {\r
141 TimeChartEvent event = (TimeChartEvent) nestedIterator.next();\r
142 lastTime = event.getTime() + event.getDuration();\r
013a5f1c 143 return event;\r
ce62370f
FC
144 }\r
145 if (hasNext()) {\r
146 TimeChartEvent event = next;\r
147 next = null;\r
148 return event;\r
149 }\r
150 throw new NoSuchElementException();\r
151 }\r
152 }\r
153\r
154 @Override\r
155 public void remove() {\r
156 throw new UnsupportedOperationException();\r
157 }\r
013a5f1c 158\r
ce62370f
FC
159 }\r
160\r
ce62370f
FC
161 public void addTraceEvent(ITimeEvent timeEvent) {\r
162 long time = timeEvent.getTime();\r
163 synchronized (fTraceEvents) {\r
164 long index = (fReferenceTime == -1) ? 0 : (time - fReferenceTime) >> fPower;\r
165 if (index < 0) {\r
166 if (fTraceEvents.capacity() - fTraceEvents.size() < -index) {\r
167 int powershift = (-index + fTraceEvents.size() <= 2 * fTraceEvents.capacity()) ? 1 :\r
168 (int) Math.ceil(Math.log((double) (-index + fTraceEvents.size()) / fTraceEvents.capacity()) / Math.log(2));\r
169 merge(powershift);\r
170 index = (int) ((time - fReferenceTime) >> fPower);\r
171 }\r
172 shift((int) -index);\r
173 index = 0;\r
174 fTraceEvents.set(0, (TimeChartEvent) timeEvent);\r
175 } else if (index < fTraceEvents.capacity()) {\r
176 if (index >= fTraceEvents.size()) {\r
177 fTraceEvents.setSize((int) index + 1);\r
178 }\r
179 } else {\r
180 int powershift = (index < 2 * fTraceEvents.capacity()) ? 1 :\r
181 (int) Math.ceil(Math.log((double) (index + 1) / fTraceEvents.capacity()) / Math.log(2));\r
182 merge(powershift);\r
183 index = (int) ((time - fReferenceTime) >> fPower);\r
184 fTraceEvents.setSize((int) index + 1);\r
185 }\r
186 TimeChartEvent event = (TimeChartEvent) fTraceEvents.get((int) index);\r
187 if (event == null) {\r
188 fTraceEvents.set((int) index, (TimeChartEvent) timeEvent);\r
189 } else {\r
190 if (event.getItemizedEntry() == null) {\r
191 event.merge((TimeChartEvent) timeEvent);\r
192 } else {\r
193 event.mergeDecorations((TimeChartEvent) timeEvent);\r
194 event.getItemizedEntry().addTraceEvent(timeEvent);\r
195 }\r
196 }\r
197 if (fReferenceTime == -1 || time < fReferenceTime) {\r
198 fReferenceTime = (time >> fPower) << fPower;\r
199 }\r
200 if (fStartTime == -1 || time < fStartTime) {\r
201 fStartTime = time;\r
202 }\r
203 if (fStopTime == -1 || time > fStopTime) {\r
204 fStopTime = time;\r
205 }\r
206 }\r
207 }\r
208\r
209 private void merge(int powershift) {\r
210 fPower += powershift;\r
211 fReferenceTime = (fReferenceTime >> fPower) << fPower;\r
212 int index = 0;\r
213 for (int i = 0; i < fTraceEvents.size(); i++) {\r
214 TimeChartEvent event = fTraceEvents.get(i);\r
215 if (event != null) {\r
216 index = (int) ((event.getTime() - fReferenceTime) >> fPower);\r
217 TimeChartEvent mergedEvent = (TimeChartEvent) fTraceEvents.get(index);\r
218 if (mergedEvent == null) {\r
219 fTraceEvents.set(index, event);\r
220 } else {\r
221 mergedEvent.merge(event);\r
222 }\r
223 if (i != index) {\r
224 fTraceEvents.set(i, null);\r
225 }\r
226 }\r
227 }\r
228 fTraceEvents.setSize(index + 1);\r
229 }\r
230\r
231 private void shift(int indexshift) {\r
232 int oldSize = fTraceEvents.size();\r
233 fTraceEvents.setSize(oldSize + indexshift);\r
234 for (int i = oldSize - 1; i >= 0; i--) {\r
235 fTraceEvents.set(i + indexshift, fTraceEvents.get(i));\r
236 }\r
237 for (int i = 0; i < indexshift; i++) {\r
238 fTraceEvents.set(i, null);\r
239 }\r
240 }\r
013a5f1c 241\r
828e5592 242 public ITmfTrace<?> getTrace() {\r
ce62370f
FC
243 return fTrace;\r
244 }\r
013a5f1c 245\r
ce62370f
FC
246 public void setLastRank(long rank) {\r
247 fLastRank = rank;\r
248 }\r
013a5f1c 249\r
ce62370f
FC
250 public long getLastRank() {\r
251 return fLastRank;\r
252 }\r
253}\r
This page took 0.043873 seconds and 5 git commands to generate.