Commit | Line | Data |
---|---|---|
6e512b93 | 1 | /******************************************************************************* |
8827c197 | 2 | * Copyright (c) 2009, 2010 Ericsson |
6e512b93 ASL |
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 | * Alvaro Sanchez-Leon (alvsan09@gmail.com) - Initial API and implementation | |
11 | *******************************************************************************/ | |
12 | package org.eclipse.linuxtools.lttng.ui.views.common; | |
13 | ||
8827c197 FC |
14 | import java.util.Arrays; |
15 | ||
16 | import org.eclipse.linuxtools.lttng.control.LttngCoreProviderFactory; | |
17 | import org.eclipse.linuxtools.lttng.control.LttngSyntheticEventProvider; | |
18 | import org.eclipse.linuxtools.lttng.event.LttngSyntheticEvent; | |
19 | import org.eclipse.linuxtools.lttng.event.LttngSyntheticEvent.SequenceInd; | |
20 | import org.eclipse.linuxtools.lttng.event.LttngTimestamp; | |
21 | import org.eclipse.linuxtools.lttng.request.ILttngSyntEventRequest; | |
22 | import org.eclipse.linuxtools.lttng.request.IRequestStatusListener; | |
23 | import org.eclipse.linuxtools.lttng.request.LttngSyntEventRequest; | |
24 | import org.eclipse.linuxtools.lttng.request.RequestCompletedSignal; | |
25 | import org.eclipse.linuxtools.lttng.request.RequestStartedSignal; | |
26 | import org.eclipse.linuxtools.lttng.state.evProcessor.ITransEventProcessor; | |
6e512b93 | 27 | import org.eclipse.linuxtools.lttng.ui.TraceDebug; |
8827c197 | 28 | import org.eclipse.linuxtools.lttng.ui.model.trange.ItemContainer; |
8827c197 | 29 | import org.eclipse.linuxtools.tmf.event.TmfEvent; |
6e512b93 | 30 | import org.eclipse.linuxtools.tmf.event.TmfTimeRange; |
63eecb47 | 31 | import org.eclipse.linuxtools.tmf.event.TmfTimestamp; |
8827c197 | 32 | import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; |
9b635e61 | 33 | import org.eclipse.linuxtools.tmf.request.ITmfDataRequest.ExecutionType; |
8827c197 FC |
34 | import org.eclipse.linuxtools.tmf.request.TmfDataRequest; |
35 | import org.eclipse.linuxtools.tmf.signal.TmfRangeSynchSignal; | |
6e512b93 | 36 | import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler; |
8827c197 FC |
37 | import org.eclipse.linuxtools.tmf.signal.TmfSignalManager; |
38 | import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal; | |
39 | import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.ITimeAnalysisViewer; | |
40 | import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeScaleSelectionEvent; | |
41 | import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeSelectionEvent; | |
42 | import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry; | |
6e512b93 | 43 | import org.eclipse.linuxtools.tmf.ui.views.TmfView; |
8827c197 | 44 | import org.eclipse.swt.widgets.Display; |
6e512b93 ASL |
45 | |
46 | /** | |
47 | * <p> | |
48 | * Abstract class used as a base for views handling specific time range data | |
49 | * requests | |
50 | * </p> | |
51 | * <p> | |
8827c197 FC |
52 | * The class handles a single element queue of data requests, i.e. request can |
53 | * be triggered from different sources e.g. opening a file as well as a new | |
54 | * selected time window | |
6e512b93 ASL |
55 | * </p> |
56 | * | |
57 | * @author alvaro | |
58 | * | |
59 | */ | |
60 | public abstract class AbsTimeUpdateView extends TmfView implements | |
8827c197 | 61 | IRequestStatusListener { |
6e512b93 ASL |
62 | |
63 | // ======================================================================== | |
64 | // Data | |
65 | // ======================================================================== | |
8827c197 FC |
66 | /** |
67 | * One second in nanoseconds | |
68 | */ | |
69 | private static final long INITIAL_WINDOW_OFFSET = 1000000000L; /* | |
70 | * 1 sec // | |
71 | * in ns // | |
72 | */ | |
73 | // private static final long INITIAL_WINDOW_OFFSET = 100000000L; /* 100 ms | |
74 | // in ns */ | |
75 | /** | |
76 | * Number of events before a GUI refresh | |
77 | */ | |
78 | private static final Long INPUT_CHANGED_REFRESH = 3000L; | |
79 | private static final long DEFAULT_OFFSET = 0L; | |
80 | private static final int DEFAULT_CHUNK = 1; | |
81 | ||
82 | protected boolean synch = true; // time synchronisation, used to be an | |
83 | // option | |
84 | protected ITimeAnalysisViewer tsfviewer = null; | |
6e512b93 | 85 | |
cb866e08 FC |
86 | private LttngSyntEventRequest fCurrentRequest = null; |
87 | ||
88 | // ======================================================================== | |
6e512b93 ASL |
89 | // Constructor |
90 | // ======================================================================== | |
91 | public AbsTimeUpdateView(String viewID) { | |
8827c197 FC |
92 | super(viewID); |
93 | // freqState = UiCommonFactory.getQueue(this); | |
6e512b93 ASL |
94 | } |
95 | ||
96 | // ======================================================================== | |
97 | // Methods | |
98 | // ======================================================================== | |
99 | /* | |
100 | * (non-Javadoc) | |
101 | * | |
102 | * @seeorg.eclipse.linuxtools.lttng.state.IStateDataRequestListener# | |
103 | * processingStarted(org.eclipse.linuxtools.lttng.state.StateDataRequest) | |
104 | */ | |
105 | @TmfSignalHandler | |
106 | public synchronized void processingStarted(RequestStartedSignal signal) { | |
8827c197 | 107 | LttngSyntEventRequest request = signal.getRequest(); |
6e512b93 | 108 | if (request != null) { |
8827c197 FC |
109 | // update queue with the id of the current request. |
110 | // freqState.requestStarted(request); | |
111 | ||
112 | // if there was no new request then this one is still on | |
113 | // prepare for the reception of new data | |
114 | waitCursor(true); | |
115 | ||
116 | // no new time range for zoom orders | |
117 | TmfTimeRange trange = null; | |
118 | // Time Range will be used to filter out events which are | |
119 | // not visible in one pixel | |
120 | trange = request.getRange(); | |
121 | ||
122 | // indicate if the data model needs to be cleared e.g. a new | |
123 | // experiment is being selected | |
124 | boolean clearData = request.isclearDataInd(); | |
125 | // Indicate if current data needs to be cleared and if so | |
126 | // specify the new experiment time range that applies | |
127 | ModelUpdatePrep(trange, clearData); | |
6e512b93 ASL |
128 | } |
129 | } | |
130 | ||
131 | /* | |
132 | * (non-Javadoc) | |
133 | * | |
134 | * @seeorg.eclipse.linuxtools.lttng.state.IStateDataRequestListener# | |
135 | * processingCompleted(org.eclipse.linuxtools.lttng.state.StateDataRequest) | |
136 | */ | |
137 | @TmfSignalHandler | |
8827c197 FC |
138 | public void processingCompleted(RequestCompletedSignal signal) { |
139 | ILttngSyntEventRequest request = signal.getRequest(); | |
6e512b93 ASL |
140 | |
141 | if (request == null) { | |
142 | return; | |
8035003b | 143 | } |
6e512b93 | 144 | |
8827c197 FC |
145 | // Update wait cursor |
146 | waitCursor(false); | |
147 | ||
6e512b93 ASL |
148 | // No data refresh actions for cancelled requests. |
149 | if (request.isCancelled() || request.isFailed()) { | |
150 | if (TraceDebug.isDEBUG()) { | |
151 | TmfTimeRange trange = request.getRange(); | |
152 | if (request.isCancelled()) { | |
153 | TraceDebug.debug("Request cancelled " | |
154 | + trange.getStartTime() + "-" + trange.getEndTime() | |
8827c197 FC |
155 | + " Handled Events: " + request.getSynEventCount() |
156 | + " " + request.toString(), 15); | |
6e512b93 ASL |
157 | } else if (request.isFailed()) { |
158 | TraceDebug.debug("Request Failed " + trange.getStartTime() | |
159 | + "-" + trange.getEndTime() + " Handled Events: " | |
8827c197 FC |
160 | + request.getSynEventCount() + " " |
161 | + request.toString()); | |
6e512b93 ASL |
162 | } |
163 | } | |
164 | ||
165 | return; | |
166 | } else { | |
8827c197 | 167 | modelInputChanged(request, true); |
6e512b93 ASL |
168 | } |
169 | } | |
170 | ||
171 | /** | |
8827c197 | 172 | * Registers as listener of time selection from other views |
6e512b93 | 173 | * |
8827c197 | 174 | * @param signal |
6e512b93 | 175 | */ |
8827c197 FC |
176 | public void synchToTime(TmfTimeSynchSignal signal) { |
177 | if (synch) { | |
178 | Object source = signal.getSource(); | |
179 | if (signal != null && source != null && source != this) { | |
180 | // Internal value is expected in nano seconds. | |
181 | long selectedTime = signal.getCurrentTime().getValue(); | |
182 | if (tsfviewer != null) { | |
183 | tsfviewer.setSelectedTime(selectedTime, true, source); | |
41dc35d0 | 184 | } |
8827c197 FC |
185 | } |
186 | } | |
187 | } | |
188 | ||
189 | /** | |
190 | * Process the reception of time window adjustment in this view if the | |
191 | * source of the update is not this view. | |
192 | * | |
193 | * @param signal | |
194 | * @param clearingData | |
195 | */ | |
196 | public void synchToTimeRange(TmfRangeSynchSignal signal, boolean clearingData) { | |
197 | if (synch) { | |
198 | Object source = signal.getSource(); | |
199 | if (signal != null && source != null && source != this) { | |
200 | // Internal value is expected in nano seconds. | |
201 | TmfTimeRange trange = signal.getCurrentRange(); | |
202 | TmfExperiment<?> experiment = TmfExperiment.getCurrentExperiment(); | |
203 | if (experiment == null) { | |
204 | TraceDebug.debug("Current selected experiment is null"); | |
205 | return; | |
63eecb47 | 206 | } |
6e512b93 | 207 | |
8827c197 | 208 | // Clearing of process data is configurable |
f6b14ce2 | 209 | dataRequest(trange, experiment.getTimeRange(), clearingData, ExecutionType.FOREGROUND); |
41dc35d0 | 210 | } |
6e512b93 ASL |
211 | } |
212 | } | |
213 | ||
214 | /** | |
8827c197 FC |
215 | * Trigger time synchronisation to other views this method shall be called |
216 | * when a check has been performed to note that an actual change of time has | |
217 | * been performed vs a pure re-selection of the same time | |
218 | * | |
219 | * @param time | |
220 | * @param source | |
6e512b93 | 221 | */ |
8827c197 FC |
222 | protected void synchTimeNotification(long time, Object source) { |
223 | // if synchronisation selected | |
224 | if (synch) { | |
225 | // Notify other views | |
226 | TmfSignalManager.dispatchSignal(new TmfTimeSynchSignal(source, new LttngTimestamp(time))); | |
227 | } | |
228 | } | |
229 | ||
230 | /** | |
231 | * Common implementation of ITmfTimeSelectionListener, not used by all the | |
232 | * views extending this abstract class | |
233 | * | |
234 | * @param event | |
235 | */ | |
236 | protected void tsfTmProcessSelEvent(TmfTimeSelectionEvent event) { | |
237 | Object source = event.getSource(); | |
238 | if (source == null) { | |
239 | return; | |
240 | } | |
241 | ||
242 | ParamsUpdater paramUpdater = getParamsUpdater(); | |
243 | Long savedSelTime = paramUpdater.getSelectedTime(); | |
244 | ||
245 | long selTimens = event.getSelectedTime(); | |
246 | ||
247 | // make sure the new selected time is different than saved before | |
248 | // executing update | |
249 | if (savedSelTime == null || savedSelTime != selTimens) { | |
250 | // Notify listener views. | |
251 | synchTimeNotification(selTimens, source); | |
252 | ||
253 | // Update the parameter updater to save the selected time | |
254 | paramUpdater.setSelectedTime(selTimens); | |
255 | ||
63eecb47 | 256 | if (TraceDebug.isDEBUG()) { |
8827c197 | 257 | TraceDebug.debug("Selected Time: " + new LttngTimestamp(selTimens) + "\n\t\t" + getName()); |
63eecb47 | 258 | } |
8827c197 FC |
259 | } |
260 | } | |
63eecb47 | 261 | |
8827c197 FC |
262 | /** |
263 | * Common implementation of ITmfTimeScaleSelectionListener, not used by all | |
264 | * the views extending this abstract class | |
265 | * | |
266 | * @param event | |
267 | */ | |
268 | protected synchronized void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event) { | |
269 | // source needed to keep track of source values | |
270 | Object source = event.getSource(); | |
271 | ||
272 | if (source != null) { | |
273 | // Update the parameter updater before carrying out a read request | |
274 | ParamsUpdater paramUpdater = getParamsUpdater(); | |
275 | boolean newParams = paramUpdater.processTimeScaleEvent(event); | |
276 | ||
277 | if (newParams) { | |
278 | // Read the updated time window | |
279 | TmfTimeRange trange = paramUpdater.getTrange(); | |
280 | if (trange != null) { | |
281 | ||
282 | // Notify listener views. to perform data requests | |
283 | // upon this notification | |
284 | synchTimeRangeNotification(trange, paramUpdater.getSelectedTime(), source); | |
285 | } | |
286 | } | |
287 | } | |
288 | } | |
289 | ||
290 | /** | |
291 | * Inform registered listeners about the new time range | |
292 | * | |
293 | * @param trange | |
294 | * @param selectedTime | |
295 | * @param source | |
296 | */ | |
297 | protected void synchTimeRangeNotification(TmfTimeRange trange, Long selectedTime, Object source) { | |
298 | // if synchronisation selected | |
299 | if (synch) { | |
300 | // Notify other views | |
301 | TmfSignalManager.dispatchSignal(new TmfRangeSynchSignal(source, trange, new LttngTimestamp(selectedTime))); | |
302 | } | |
303 | } | |
304 | ||
305 | /** | |
306 | * @param zoomedTRange | |
307 | * @param experimentTRange | |
9b635e61 | 308 | * @param execType |
8827c197 FC |
309 | */ |
310 | public void dataRequest(TmfTimeRange zoomedTRange, | |
9b635e61 | 311 | TmfTimeRange experimentTRange, boolean clearingData, ExecutionType execType) { |
8827c197 FC |
312 | |
313 | // timeRange is the Experiment time range | |
9b635e61 | 314 | boolean sent = processDataRequest(zoomedTRange, experimentTRange, clearingData, execType); |
8827c197 FC |
315 | |
316 | if (sent) { | |
317 | waitCursor(true); | |
318 | } | |
319 | } | |
320 | ||
9b635e61 FC |
321 | // /** |
322 | // * @param zoomedTRange | |
323 | // * @param experimentTRange | |
324 | // * @param execType | |
325 | // */ | |
326 | // public void dataRequest(TmfTimeRange zoomedTRange, | |
327 | // TmfTimeRange experimentTRange, boolean clearingData) { | |
328 | // | |
329 | // // timeRange is the Experiment time range | |
330 | // boolean sent = processDataRequest(zoomedTRange, experimentTRange, clearingData); | |
331 | // | |
332 | // if (sent) { | |
333 | // waitCursor(true); | |
334 | // } | |
335 | // } | |
336 | ||
8827c197 FC |
337 | /** |
338 | * send data request directly e.g. doesn't use a queue | |
339 | * | |
340 | * @param requestTrange | |
341 | * @param listener | |
342 | * @param experimentTRange | |
9b635e61 | 343 | * @param execType |
8827c197 FC |
344 | * @param processor |
345 | * @return | |
346 | */ | |
347 | private boolean processDataRequest(TmfTimeRange requestTrange, | |
9b635e61 | 348 | TmfTimeRange experimentTRange, boolean clearingData, ExecutionType execType) { |
8827c197 FC |
349 | // Validate input |
350 | if (requestTrange == null || experimentTRange == null) { | |
351 | TraceDebug.debug("Invalid input"); | |
352 | return false; | |
353 | } | |
354 | ||
cb866e08 FC |
355 | // Cancel the currently executing request before starting a new one |
356 | if (fCurrentRequest != null && !fCurrentRequest.isCompleted()) { | |
9b635e61 | 357 | // System.out.println("Cancelling request"); |
cb866e08 FC |
358 | // fCurrentRequest.cancel(); |
359 | } | |
360 | ||
361 | fCurrentRequest = new LttngSyntEventRequest( | |
8827c197 | 362 | requestTrange, DEFAULT_OFFSET, TmfDataRequest.ALL_DATA, |
9b635e61 | 363 | DEFAULT_CHUNK, this, experimentTRange, getEventProcessor(), execType) { |
8827c197 FC |
364 | |
365 | Long fCount = getSynEventCount(); | |
366 | ITransEventProcessor processor = getProcessor(); | |
367 | TmfTimestamp frunningTimeStamp; | |
368 | ||
369 | /* | |
370 | * (non-Javadoc) | |
371 | * | |
372 | * @see | |
373 | * org.eclipse.linuxtools.lttng.request.LttngSyntEventRequest#handleData | |
374 | * () | |
375 | */ | |
cb866e08 FC |
376 | // int handleDataCount = 0; |
377 | // int handleDataValidCount = 0; | |
550d787e | 378 | @Override |
8827c197 | 379 | public void handleData() { |
cb866e08 | 380 | LttngSyntheticEvent[] result = getData(); |
8827c197 FC |
381 | |
382 | TmfEvent evt = (result.length > 0) ? result[0] : null; | |
cb866e08 | 383 | // handleDataCount++; |
8827c197 | 384 | if (evt != null) { |
cb866e08 | 385 | // handleDataValidCount++; |
8827c197 FC |
386 | LttngSyntheticEvent synEvent = (LttngSyntheticEvent) evt; |
387 | // process event | |
388 | SequenceInd indicator = synEvent.getSynType(); | |
389 | if (indicator == SequenceInd.BEFORE | |
390 | || indicator == SequenceInd.AFTER) { | |
391 | processor.process(evt, synEvent.getTraceModel()); | |
392 | } else if (indicator == SequenceInd.STARTREQ) { | |
393 | handleRequestStarted(); | |
394 | } else if (indicator == SequenceInd.ENDREQ) { | |
395 | processor.process(evt, synEvent.getTraceModel()); | |
396 | // handleCompleted(); | |
397 | } | |
398 | ||
399 | if (indicator == SequenceInd.BEFORE) { | |
400 | fCount++; | |
401 | if (fCount != 0 && fCount % INPUT_CHANGED_REFRESH == 0) { | |
402 | // send partial update | |
403 | modelInputChanged(this, false); | |
404 | ||
405 | if (TraceDebug.isDEBUG()) { | |
406 | frunningTimeStamp = evt.getTimestamp(); | |
407 | TraceDebug.debug("handled: " + fCount + " sequence: " + synEvent.getSynType()); | |
408 | } | |
409 | ||
410 | } | |
411 | } | |
412 | } | |
413 | } | |
414 | ||
415 | public void handleRequestStarted() { | |
416 | notifyStarting(); | |
417 | } | |
550d787e FC |
418 | |
419 | @Override | |
420 | public void done() { | |
cb866e08 FC |
421 | // if (TraceDebug.isDEBUG()) { |
422 | // TraceDebug.debug("AbsTimeUpdateView: Received=" + handleDataCount + ", Valid=" + handleDataCount + ", fCount=" + fCount); | |
423 | // } | |
550d787e FC |
424 | super.done(); |
425 | } | |
8827c197 | 426 | |
550d787e | 427 | @Override |
8827c197 FC |
428 | public void handleCompleted() { |
429 | super.handleCompleted(); | |
430 | ||
431 | // Data is not complete and should be handled as such | |
432 | if (isFailed() || isCancelled()) { | |
433 | modelIncomplete(this); | |
434 | } | |
435 | ||
436 | if (TraceDebug.isDEBUG()) { | |
437 | if (frunningTimeStamp != null) { | |
438 | TraceDebug.debug("Last event time stamp: " | |
439 | + frunningTimeStamp.getValue()); | |
440 | } | |
441 | } | |
442 | } | |
443 | }; | |
444 | ||
445 | // obtain singleton core provider | |
446 | LttngSyntheticEventProvider provider = LttngCoreProviderFactory | |
447 | .getEventProvider(); | |
448 | ||
449 | // send the request to TMF | |
cb866e08 FC |
450 | fCurrentRequest.startRequestInd(provider); |
451 | fCurrentRequest.setclearDataInd(clearingData); | |
8827c197 FC |
452 | return true; |
453 | } | |
454 | ||
455 | /** | |
456 | * Returns an initial smaller window to allow the user to select the area of | |
457 | * interest | |
458 | * | |
459 | * @param experimentTRange | |
460 | * @return | |
461 | */ | |
462 | protected TmfTimeRange getInitTRange(TmfTimeRange experimentTRange) { | |
463 | TmfTimestamp expStartTime = experimentTRange.getStartTime(); | |
464 | TmfTimestamp expEndTime = experimentTRange.getEndTime(); | |
465 | TmfTimestamp initialEndOfWindow = new LttngTimestamp(expStartTime | |
466 | .getValue() | |
467 | + INITIAL_WINDOW_OFFSET); | |
468 | if (initialEndOfWindow.compareTo(expEndTime, false) < 0) { | |
469 | return new TmfTimeRange(expStartTime, initialEndOfWindow); | |
6e512b93 | 470 | } |
8827c197 FC |
471 | |
472 | // The original size of the experiment is smaller than proposed adjusted | |
473 | // time | |
474 | return experimentTRange; | |
6e512b93 ASL |
475 | } |
476 | ||
477 | /** | |
478 | * Request the Time Analysis widget to enable or disable the wait cursor | |
479 | * e.g. data request in progress or data request completed | |
480 | * | |
481 | * @param waitInd | |
482 | */ | |
8827c197 FC |
483 | protected void waitCursor(final boolean waitInd) { |
484 | if (tsfviewer != null) { | |
485 | Display display = tsfviewer.getControl().getDisplay(); | |
486 | ||
487 | // Perform the updates on the UI thread | |
488 | display.asyncExec(new Runnable() { | |
489 | public void run() { | |
490 | tsfviewer.waitCursor(waitInd); | |
491 | } | |
492 | }); | |
493 | } | |
494 | } | |
6e512b93 ASL |
495 | |
496 | /** | |
8827c197 | 497 | * View preparation to override the current local information |
6e512b93 | 498 | * |
d712a5f3 FC |
499 | * @param timeRange |
500 | * - new total time range e.g. Experiment level | |
8827c197 FC |
501 | * @param clearAllData |
502 | */ | |
503 | protected void ModelUpdatePrep(TmfTimeRange timeRange, boolean clearAllData) { | |
504 | ItemContainer<?> itemContainer = getItemContainer(); | |
505 | if (clearAllData) { | |
506 | // start fresh e.g. new experiment selected | |
507 | itemContainer.clearItems(); | |
508 | } else { | |
509 | // clear children but keep processes | |
510 | itemContainer.clearChildren(); | |
511 | } | |
512 | ||
513 | // Obtain the current resource array | |
514 | ITmfTimeAnalysisEntry[] itemArr = itemContainer.readItems(); | |
515 | ||
516 | // clean up data and boundaries | |
517 | displayModel(itemArr, -1, -1, false, -1, -1, null); | |
518 | ||
519 | ParamsUpdater updater = getParamsUpdater(); | |
520 | if (updater != null) { | |
521 | // Start over | |
522 | updater.setEventsDiscarded(0); | |
523 | ||
524 | // Update new visible time range if available | |
525 | if (timeRange != null) { | |
526 | updater.update(timeRange.getStartTime().getValue(), timeRange.getEndTime().getValue()); | |
527 | } | |
528 | } | |
529 | } | |
530 | ||
531 | /** | |
532 | * Initialize the model and view before reloading items | |
533 | * | |
534 | * @param boundaryRange | |
535 | * @param visibleRange | |
536 | * @param source | |
6e512b93 | 537 | */ |
8827c197 FC |
538 | protected void ModelUpdateInit(TmfTimeRange boundaryRange, TmfTimeRange visibleRange, Object source) { |
539 | // Update the view boundaries | |
540 | if (boundaryRange != null) { | |
541 | ItemContainer<?> itemContainer = getItemContainer(); | |
542 | if (itemContainer != null) { | |
543 | itemContainer.clearItems(); | |
544 | // Obtain the current process array | |
545 | ITmfTimeAnalysisEntry[] itemArr = itemContainer.readItems(); | |
546 | ||
547 | long startTime = boundaryRange.getStartTime().getValue(); | |
548 | long endTime = boundaryRange.getEndTime().getValue(); | |
549 | ||
550 | // Update the view part | |
551 | displayModel(itemArr, startTime, endTime, true, visibleRange.getStartTime().getValue(), visibleRange | |
552 | .getEndTime().getValue(), source); | |
553 | } | |
554 | } | |
555 | ||
556 | // update the view filtering parameters | |
557 | if (visibleRange != null) { | |
558 | ParamsUpdater updater = getParamsUpdater(); | |
559 | if (updater != null) { | |
560 | // Start over | |
561 | updater.setEventsDiscarded(0); | |
562 | // Update new visible time range if available | |
563 | updater.update(visibleRange.getStartTime().getValue(), visibleRange.getEndTime().getValue()); | |
564 | } | |
565 | } | |
566 | } | |
6e512b93 ASL |
567 | |
568 | /** | |
569 | * Actions taken by the view to refresh its widget(s) with the updated data | |
570 | * model | |
571 | * | |
572 | * @param request | |
8827c197 FC |
573 | * @param complete |
574 | * true: yes, false: partial update | |
575 | */ | |
576 | protected void modelInputChanged(ILttngSyntEventRequest request, boolean complete) { | |
577 | long experimentStartTime = -1; | |
578 | long experimentEndTime = -1; | |
579 | TmfTimeRange experimentTimeRange = request.getExperimentTimeRange(); | |
580 | if (experimentTimeRange != null) { | |
581 | experimentStartTime = experimentTimeRange.getStartTime().getValue(); | |
582 | experimentEndTime = experimentTimeRange.getEndTime().getValue(); | |
583 | } | |
584 | ||
585 | // Obtain the current resource list | |
586 | ITmfTimeAnalysisEntry[] itemArr = getItemContainer().readItems(); | |
587 | ||
588 | if (itemArr != null) { | |
589 | // Sort the array by pid | |
590 | Arrays.sort(itemArr); | |
591 | ||
592 | // Update the view part | |
593 | displayModel(itemArr, experimentStartTime, experimentEndTime, false, request.getRange().getStartTime() | |
594 | .getValue(), request.getRange().getEndTime().getValue(), request.getSource()); | |
595 | } | |
596 | ||
597 | if (complete) { | |
598 | // reselect to original time | |
5dbe4d3b | 599 | ParamsUpdater paramUpdater = getParamsUpdater(); |
8827c197 FC |
600 | if (paramUpdater != null && tsfviewer != null) { |
601 | final Long selTime = paramUpdater.getSelectedTime(); | |
602 | if (selTime != null) { | |
603 | TraceDebug.debug("View: " + getName() + "\n\t\tRestoring the selected time to: " + selTime); | |
604 | Display display = tsfviewer.getControl().getDisplay(); | |
605 | display.asyncExec(new Runnable() { | |
606 | public void run() { | |
607 | tsfviewer.setSelectedTime(selTime, false, this); | |
608 | } | |
609 | }); | |
610 | } | |
611 | ||
9b635e61 FC |
612 | // System.out.println(System.currentTimeMillis() + ": AbsTimeUpdate (" + getName() + ") completed"); |
613 | ||
8827c197 FC |
614 | if (TraceDebug.isDEBUG()) { |
615 | int eventCount = 0; | |
616 | Long count = request.getSynEventCount(); | |
617 | for (int pos = 0; pos < itemArr.length; pos++) { | |
618 | eventCount += itemArr[pos].getTraceEvents().size(); | |
619 | } | |
620 | ||
5dbe4d3b | 621 | int discarded = paramUpdater.getEventsDiscarded(); |
8827c197 | 622 | int discardedOutofOrder = paramUpdater.getEventsDiscardedWrongOrder(); |
5dbe4d3b ASL |
623 | int discardedOutofViewRange = paramUpdater.getEventsDiscardedOutOfViewRange(); |
624 | int dicardedNotVisible = paramUpdater.getEventsDiscardedNotVisible(); | |
625 | ||
8827c197 FC |
626 | TmfTimeRange range = request.getRange(); |
627 | StringBuilder sb = new StringBuilder("View: " + getName() + ", Events handled: " + count | |
628 | + ", Events loaded in view: " + eventCount + ", Number of events discarded: " + discarded | |
629 | + "\n\tNumber of events discarded with start time earlier than next good time: " | |
5dbe4d3b ASL |
630 | + discardedOutofOrder + "\n\tDiscarded Not visible: " + dicardedNotVisible |
631 | + "\n\tDiscarded out of view Range: " + discardedOutofViewRange); | |
8827c197 FC |
632 | |
633 | sb.append("\n\t\tRequested Time Range: " + range.getStartTime() + "-" + range.getEndTime()); | |
634 | sb.append("\n\t\tExperiment Time Range: " + experimentStartTime + "-" + experimentEndTime); | |
635 | TraceDebug.debug(sb.toString()); | |
636 | } | |
637 | } | |
638 | ||
639 | } | |
640 | } | |
641 | ||
642 | // /** | |
643 | // * Obtains the remainder fraction on unit Seconds of the entered value in | |
644 | // * nanoseconds. e.g. input: 1241207054171080214 ns The number of seconds | |
645 | // can | |
646 | // * be obtain by removing the last 9 digits: 1241207054 the fractional | |
647 | // * portion of seconds, expressed in ns is: 171080214 | |
648 | // * | |
649 | // * @param v | |
650 | // * @return | |
651 | // */ | |
652 | // protected String formatNs(long v) { | |
653 | // StringBuffer str = new StringBuffer(); | |
654 | // boolean neg = v < 0; | |
655 | // if (neg) { | |
656 | // v = -v; | |
657 | // str.append('-'); | |
658 | // } | |
659 | // | |
660 | // String strVal = String.valueOf(v); | |
661 | // if (v < 1000000000) { | |
662 | // return strVal; | |
663 | // } | |
664 | // | |
665 | // // Extract the last nine digits (e.g. fraction of a S expressed in ns | |
666 | // return strVal.substring(strVal.length() - 9); | |
667 | // } | |
668 | ||
669 | /** | |
670 | * The request was stopped, the data is incomplete | |
671 | * | |
672 | * @param request | |
673 | */ | |
674 | protected abstract void modelIncomplete(ILttngSyntEventRequest request); | |
675 | ||
676 | /** | |
677 | * Returns the Event processor instance related to a specific view | |
678 | * | |
679 | * @return | |
680 | */ | |
681 | protected abstract ITransEventProcessor getEventProcessor(); | |
682 | ||
683 | /** | |
684 | * To be overridden by some sub-classes although may not be needed in some | |
685 | * e.g. statistics view | |
686 | * | |
687 | * @param items | |
688 | * @param startBoundTime | |
689 | * @param endBoundTime | |
690 | * @param updateTimeBounds | |
691 | * - Time bounds updated needed e.g. if a new Experiment or trace | |
692 | * is selected | |
693 | * @param startVisibleWindow | |
694 | * @param endVisibleWindow | |
695 | * @param source | |
696 | */ | |
697 | protected abstract void displayModel(final ITmfTimeAnalysisEntry[] items, final long startBoundTime, | |
698 | final long endBoundTime, final boolean updateTimeBounds, final long startVisibleWindow, | |
699 | final long endVisibleWindow, final Object source); | |
700 | ||
701 | /** | |
702 | * To be overridden by some sub-classes although may not be needed in some | |
703 | * e.g. statistics view | |
704 | * | |
705 | * @return | |
706 | */ | |
707 | protected abstract ParamsUpdater getParamsUpdater(); | |
708 | ||
709 | /** | |
710 | * Returns the model's item container | |
711 | * | |
712 | * @return | |
6e512b93 | 713 | */ |
8827c197 | 714 | protected abstract ItemContainer<?> getItemContainer(); |
6e512b93 | 715 | } |