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