1 /*******************************************************************************
2 * Copyright (c) 2009, 2010 Ericsson
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
10 * Alvaro Sanchez-Leon (alvsan09@gmail.com) - Initial API and implementation
11 * Bernd Hufmann - Bug fixes
12 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.lttng
.ui
.views
.common
;
15 import java
.util
.Arrays
;
17 import org
.eclipse
.linuxtools
.lttng
.core
.LttngConstants
;
18 import org
.eclipse
.linuxtools
.lttng
.core
.control
.LttngCoreProviderFactory
;
19 import org
.eclipse
.linuxtools
.lttng
.core
.control
.LttngSyntheticEventProvider
;
20 import org
.eclipse
.linuxtools
.lttng
.core
.event
.LttngSyntheticEvent
;
21 import org
.eclipse
.linuxtools
.lttng
.core
.event
.LttngTimestamp
;
22 import org
.eclipse
.linuxtools
.lttng
.core
.request
.ILttngSyntEventRequest
;
23 import org
.eclipse
.linuxtools
.lttng
.core
.request
.IRequestStatusListener
;
24 import org
.eclipse
.linuxtools
.lttng
.core
.request
.LttngSyntEventRequest
;
25 import org
.eclipse
.linuxtools
.lttng
.core
.request
.RequestCompletedSignal
;
26 import org
.eclipse
.linuxtools
.lttng
.core
.request
.RequestStartedSignal
;
27 import org
.eclipse
.linuxtools
.lttng
.core
.state
.evProcessor
.ITransEventProcessor
;
28 import org
.eclipse
.linuxtools
.lttng
.ui
.TraceDebug
;
29 import org
.eclipse
.linuxtools
.lttng
.ui
.model
.trange
.ItemContainer
;
30 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfTimestamp
;
31 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfEvent
;
32 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimeRange
;
33 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimestamp
;
34 import org
.eclipse
.linuxtools
.tmf
.core
.experiment
.TmfExperiment
;
35 import org
.eclipse
.linuxtools
.tmf
.core
.request
.ITmfDataRequest
.ExecutionType
;
36 import org
.eclipse
.linuxtools
.tmf
.core
.request
.TmfDataRequest
;
37 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfExperimentDisposedSignal
;
38 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfRangeSynchSignal
;
39 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalHandler
;
40 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalManager
;
41 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTimeSynchSignal
;
42 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.ITimeAnalysisViewer
;
43 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.TmfTimeScaleSelectionEvent
;
44 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.TmfTimeSelectionEvent
;
45 import org
.eclipse
.linuxtools
.tmf
.ui
.viewers
.timeAnalysis
.model
.ITmfTimeAnalysisEntry
;
46 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.TmfView
;
47 import org
.eclipse
.swt
.widgets
.Display
;
51 * Abstract class used as a base for views handling specific time range data
55 * The class handles a single element queue of data requests, i.e. request can
56 * be triggered from different sources e.g. opening a file as well as a new
57 * selected time window
63 public abstract class AbsTimeUpdateView
extends TmfView
implements IRequestStatusListener
{
65 // ========================================================================
67 // ========================================================================
69 // private static final long INITIAL_WINDOW_OFFSET = (1L * 1 * 1000 * 1000); // .001sec
70 // private static final long INITIAL_WINDOW_OFFSET = (1L * 10 * 1000 * 1000); // .01sec
71 private static final long INITIAL_WINDOW_OFFSET
= (1L * 100 * 1000 * 1000); // .1sec
72 // private static final long INITIAL_WINDOW_OFFSET = (1L * 1000 * 1000 * 1000); // 1sec
75 * Number of events before a GUI refresh
77 protected static final Long INPUT_CHANGED_REFRESH
= 75000L;
78 private static final long DEFAULT_OFFSET
= 0;
80 protected boolean synch
= true; // time synchronization, used to be an option
81 protected ITimeAnalysisViewer tsfviewer
= null;
83 private LttngSyntEventRequest fCurrentRequest
= null;
85 protected LttngSyntheticEventProvider fProvider
= LttngCoreProviderFactory
.getEventProvider(getProviderId());
87 // ========================================================================
89 // ========================================================================
90 public AbsTimeUpdateView(String viewID
) {
92 // freqState = UiCommonFactory.getQueue(this);
95 // ========================================================================
97 // ========================================================================
100 * Returns the number of events after which the relevant display will
105 protected Long
getInputChangedRefresh() {
106 return INPUT_CHANGED_REFRESH
;
110 * Cancel the ongoing request if another experiment is being selected
111 * @param experimentDisposedSignal
114 public void experimentDisposed(TmfExperimentDisposedSignal
<?
extends TmfEvent
> experimentDisposedSignal
) {
115 if (experimentDisposedSignal
.getExperiment() != TmfExperiment
.getCurrentExperiment()) {
118 fProvider
.conditionallyCancelRequests();
124 * @seeorg.eclipse.linuxtools.lttng.state.IStateDataRequestListener#
125 * processingStarted(org.eclipse.linuxtools.lttng.state.StateDataRequest)
129 public synchronized void processingStarted(RequestStartedSignal signal
) {
130 LttngSyntEventRequest request
= signal
.getRequest();
131 if (request
!= null) {
132 // update queue with the id of the current request.
133 // freqState.requestStarted(request);
135 // if there was no new request then this one is still on
136 // prepare for the reception of new data
139 // no new time range for zoom orders
140 TmfTimeRange trange
= null;
141 // Time Range will be used to filter out events which are
142 // not visible in one pixel
143 trange
= request
.getRange();
145 // indicate if the data model needs to be cleared e.g. a new
146 // experiment is being selected
147 boolean clearData
= request
.isclearDataInd();
148 // Indicate if current data needs to be cleared and if so
149 // specify the new experiment time range that applies
150 ModelUpdatePrep(trange
, clearData
);
157 * @seeorg.eclipse.linuxtools.lttng.state.IStateDataRequestListener#
158 * processingCompleted(org.eclipse.linuxtools.lttng.state.StateDataRequest)
162 public void processingCompleted(RequestCompletedSignal signal
) {
163 ILttngSyntEventRequest request
= signal
.getRequest();
165 if (request
== null) {
169 // Update wait cursor
172 // No data refresh actions for cancelled requests.
173 if (request
.isCancelled() || request
.isFailed()) {
174 if (TraceDebug
.isDEBUG()) {
175 TmfTimeRange trange
= request
.getRange();
176 if (request
.isCancelled()) {
177 TraceDebug
.debug("Request cancelled " //$NON-NLS-1$
178 + trange
.getStartTime() + "-" + trange
.getEndTime() //$NON-NLS-1$
179 + " Handled Events: " + request
.getSynEventCount() //$NON-NLS-1$
180 + " " + request
.toString(), 15); //$NON-NLS-1$
181 } else if (request
.isFailed()) {
182 TraceDebug
.debug("Request Failed " + trange
.getStartTime() //$NON-NLS-1$
183 + "-" + trange
.getEndTime() + " Handled Events: " //$NON-NLS-1$ //$NON-NLS-2$
184 + request
.getSynEventCount() + " " //$NON-NLS-1$
185 + request
.toString());
191 modelInputChanged(request
, true);
196 * Registers as listener of time selection from other views
200 public void synchToTime(TmfTimeSynchSignal signal
) {
202 Object source
= signal
.getSource();
203 if (signal
!= null && source
!= null && source
!= this) {
205 if ((tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
207 // Check for GUI thread
208 if (Display
.getCurrent() != null) {
209 // GUI thread - execute update right away.
211 // Internal value is expected in nano seconds.
212 long selectedTime
= signal
.getCurrentTime().getValue();
213 if (tsfviewer
!= null) {
214 tsfviewer
.setSelectedTime(selectedTime
, true, source
);
216 ParamsUpdater paramUpdater
= getParamsUpdater();
217 Long savedSelTime
= paramUpdater
.getSelectedTime();
218 if ((savedSelTime
== null) || (savedSelTime
!= selectedTime
)) {
219 // Update the parameter updater to save the selected time
220 paramUpdater
.setSelectedTime(selectedTime
);
224 // Perform the updates on the UI thread
226 // We need to clone the timestamp in the signal so that it won't be overwritten duo to multipe thread access
227 final TmfTimeSynchSignal savedSignal
= new TmfTimeSynchSignal(signal
.getSource(), signal
.getCurrentTime().clone());
228 tsfviewer
.getControl().getDisplay().asyncExec(new Runnable() {
231 if ((tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
232 synchToTime(savedSignal
);
243 * Process the reception of time window adjustment in this view if the
244 * source of the update is not this view.
247 * @param clearingData
249 public void synchToTimeRange(TmfRangeSynchSignal signal
, boolean clearingData
) {
251 Object source
= signal
.getSource();
252 if (signal
!= null && source
!= null && source
!= this) {
253 // Internal value is expected in nano seconds.
254 TmfTimeRange trange
= signal
.getCurrentRange();
255 TmfExperiment
<?
> experiment
= TmfExperiment
.getCurrentExperiment();
256 if (experiment
== null) {
257 TraceDebug
.debug("Current selected experiment is null"); //$NON-NLS-1$
261 // Clearing of process data is configurable
262 eventRequest(trange
, experiment
.getTimeRange(), clearingData
, ExecutionType
.FOREGROUND
);
268 * Trigger time synchronisation to other views this method shall be called
269 * when a check has been performed to note that an actual change of time has
270 * been performed vs a pure re-selection of the same time
275 protected void synchTimeNotification(long time
, Object source
) {
276 // if synchronisation selected
278 // Notify other views
279 TmfSignalManager
.dispatchSignal(new TmfTimeSynchSignal(source
, new LttngTimestamp(time
)));
284 * Common implementation of ITmfTimeSelectionListener, not used by all the
285 * views extending this abstract class
289 protected void tsfTmProcessSelEvent(TmfTimeSelectionEvent event
) {
290 Object source
= event
.getSource();
291 if (source
== null) {
295 ParamsUpdater paramUpdater
= getParamsUpdater();
296 Long savedSelTime
= paramUpdater
.getSelectedTime();
298 long selTimens
= event
.getSelectedTime();
300 // make sure the new selected time is different than saved before
302 if (savedSelTime
== null || savedSelTime
!= selTimens
) {
303 // Notify listener views.
304 synchTimeNotification(selTimens
, source
);
306 // Update the parameter updater to save the selected time
307 paramUpdater
.setSelectedTime(selTimens
);
309 if (TraceDebug
.isDEBUG()) {
310 TraceDebug
.debug("Selected Time: " + new LttngTimestamp(selTimens
) + "\n\t\t" + getName()); //$NON-NLS-1$ //$NON-NLS-2$
316 * Common implementation of ITmfTimeScaleSelectionListener, not used by all
317 * the views extending this abstract class
321 protected void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event
) {
322 // source needed to keep track of source values
323 Object source
= event
.getSource();
325 boolean newParams
= false;
326 TmfTimeRange trange
= null;
327 Long selectedTime
= null;
329 // update all information and get relevant data
330 synchronized (this) {
331 if (source
!= null) {
332 // Update the parameter updater before carrying out a read request
333 ParamsUpdater paramUpdater
= getParamsUpdater();
334 newParams
= paramUpdater
.processTimeScaleEvent(event
);
337 // Read the updated time window
338 trange
= paramUpdater
.getTrange();
339 if (trange
!= null) {
340 selectedTime
= paramUpdater
.getSelectedTime();
346 // Check for selectedTime is sufficient since it is only set if
347 // newParams is true and trange is not null
348 if (selectedTime
!= null) {
349 // Notify listener views. to perform data requests
350 // upon this notification
352 // Note that this has to be done outside the synchronized statement
353 // because otherwise we could end-up in a deadlock if a ongoing
354 // request needs to be canceled.
355 synchTimeRangeNotification(trange
, selectedTime
, source
);
360 * Inform registered listeners about the new time range
363 * @param selectedTime
366 protected void synchTimeRangeNotification(TmfTimeRange trange
, Long selectedTime
, Object source
) {
367 // if synchronisation selected
369 // Notify other views
370 TmfSignalManager
.dispatchSignal(new TmfRangeSynchSignal(source
, trange
, new LttngTimestamp(selectedTime
)));
375 * @param zoomedTRange
376 * @param experimentTRange
377 * @param clearingData
380 public void eventRequest(TmfTimeRange zoomedTRange
, TmfTimeRange experimentTRange
, boolean clearingData
, ExecutionType execType
) {
382 // timeRange is the Experiment time range
383 boolean sent
= processDataRequest(zoomedTRange
, experimentTRange
, DEFAULT_OFFSET
, TmfDataRequest
.ALL_DATA
, clearingData
, execType
);
394 * @param clearingData
397 public void eventRequest(long offset
, TmfTimeRange range
, boolean clearingData
, ExecutionType execType
) {
399 // timeRange is the Experiment time range
400 boolean sent
= processDataRequest(range
, null, offset
, TmfDataRequest
.ALL_DATA
, clearingData
, execType
);
408 // * @param zoomedTRange
409 // * @param experimentTRange
412 // public void dataRequest(TmfTimeRange zoomedTRange,
413 // TmfTimeRange experimentTRange, boolean clearingData) {
415 // // timeRange is the Experiment time range
416 // boolean sent = processDataRequest(zoomedTRange, experimentTRange, clearingData);
424 * send data request directly e.g. doesn't use a queue
426 * @param requestTrange
428 * @param experimentTRange
433 private boolean processDataRequest(TmfTimeRange requestTrange
,
434 TmfTimeRange experimentTRange
, long offset
, int nbRequested
, boolean clearingData
, ExecutionType execType
) {
436 if (requestTrange
== null) {
437 TraceDebug
.debug("Invalid input"); //$NON-NLS-1$
441 // Cancel the currently executing request before starting a new one
442 fProvider
.conditionallyCancelRequests();
443 fCurrentRequest
= new LttngSyntEventRequest(
444 requestTrange
, offset
, nbRequested
,
445 LttngConstants
.DEFAULT_BLOCK_SIZE
, this, experimentTRange
, getEventProcessor(),
446 TmfExperiment
.getCurrentExperiment().getName(), execType
) {
448 Long fCount
= getSynEventCount();
449 ITransEventProcessor processor
= getProcessor();
450 ITmfTimestamp frunningTimeStamp
;
456 * org.eclipse.linuxtools.lttng.request.LttngSyntEventRequest#handleData
459 //// int handleDataCount = 0;
460 //// int handleDataValidCount = 0;
462 // public void handleData() {
463 // LttngSyntheticEvent[] result = getData();
465 // TmfEvent evt = (result.length > 0) ? result[0] : null;
466 //// handleDataCount++;
469 public void handleData(LttngSyntheticEvent event
) {
470 super.handleData(event
);
472 // handleDataValidCount++;
473 LttngSyntheticEvent synEvent
= (LttngSyntheticEvent
) event
;
475 switch (synEvent
.getSynType()) {
478 handleRequestStarted();
483 processor
.process(event
, synEvent
.getTraceModel());
485 if ((fCount
!= 0) && (fCount
% getInputChangedRefresh() == 0)) {
486 // send partial update
487 modelInputChanged(this, false);
489 if (TraceDebug
.isDEBUG()) {
490 frunningTimeStamp
= event
.getTimestamp();
491 TraceDebug
.debug("handled: " + fCount
+ " sequence: " + synEvent
.getSynType()); //$NON-NLS-1$ //$NON-NLS-2$
500 processor
.process(event
, synEvent
.getTraceModel());
511 public void handleRequestStarted() {
517 // if (TraceDebug.isDEBUG()) {
518 // TraceDebug.debug("AbsTimeUpdateView: Received=" + handleDataCount + ", Valid=" + handleDataCount + ", fCount=" + fCount);
524 public void handleCompleted() {
525 super.handleCompleted();
527 // Data is not complete and should be handled as such
528 if (isFailed() || isCancelled()) {
529 modelIncomplete(this);
532 if (TraceDebug
.isDEBUG()) {
533 if (frunningTimeStamp
!= null) {
534 TraceDebug
.debug("Last event time stamp: " + frunningTimeStamp
.getValue()); //$NON-NLS-1$
540 // send the request to TMF
541 fCurrentRequest
.startRequestInd(fProvider
);
542 fCurrentRequest
.setclearDataInd(clearingData
);
547 * Returns an initial smaller window to allow the user to select the area of
550 * @param experimentTRange
553 protected TmfTimeRange
getInitTRange(TmfTimeRange experimentTRange
) {
554 ITmfTimestamp expStartTime
= experimentTRange
.getStartTime();
555 ITmfTimestamp expEndTime
= experimentTRange
.getEndTime();
556 ITmfTimestamp initialEndOfWindow
= new LttngTimestamp(expStartTime
558 + INITIAL_WINDOW_OFFSET
);
559 if (initialEndOfWindow
.compareTo(expEndTime
, false) < 0) {
560 return new TmfTimeRange(expStartTime
, initialEndOfWindow
);
563 // The original size of the experiment is smaller than proposed adjusted
565 return experimentTRange
;
569 * Request the Time Analysis widget to enable or disable the wait cursor
570 * e.g. data request in progress or data request completed
574 protected void waitCursor(final boolean waitInd
) {
575 if ((tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
576 Display display
= tsfviewer
.getControl().getDisplay();
578 // Perform the updates on the UI thread
579 display
.asyncExec(new Runnable() {
582 if ((tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
583 tsfviewer
.waitCursor(waitInd
);
591 * View preparation to override the current local information
594 * - new total time range e.g. Experiment level
595 * @param clearAllData
597 protected void ModelUpdatePrep(TmfTimeRange timeRange
, boolean clearAllData
) {
598 ItemContainer
<?
> itemContainer
= getItemContainer();
600 // start fresh e.g. new experiment selected
601 itemContainer
.clearItems();
603 // clear children but keep processes
604 itemContainer
.clearChildren();
607 // Obtain the current resource array
608 ITmfTimeAnalysisEntry
[] itemArr
= itemContainer
.readItems();
610 // clean up data and boundaries
611 displayModel(itemArr
, -1, -1, false, -1, -1, null);
613 ParamsUpdater updater
= getParamsUpdater();
614 if (updater
!= null) {
616 updater
.setEventsDiscarded(0);
618 // Update new visible time range if available
619 if (timeRange
!= null) {
620 updater
.update(timeRange
.getStartTime().getValue(), timeRange
.getEndTime().getValue());
626 * Initialize the model and view before reloading items
628 * @param boundaryRange
629 * @param visibleRange
632 protected void ModelUpdateInit(TmfTimeRange boundaryRange
, TmfTimeRange visibleRange
, Object source
) {
633 // Update the view boundaries
634 if (boundaryRange
!= null) {
635 ItemContainer
<?
> itemContainer
= getItemContainer();
636 if (itemContainer
!= null) {
637 itemContainer
.clearItems();
638 // Obtain the current process array
639 ITmfTimeAnalysisEntry
[] itemArr
= itemContainer
.readItems();
641 long startTime
= boundaryRange
.getStartTime().getValue();
642 long endTime
= boundaryRange
.getEndTime().getValue();
644 // Update the view part
645 displayModel(itemArr
, startTime
, endTime
, true, visibleRange
.getStartTime().getValue(), visibleRange
646 .getEndTime().getValue(), source
);
650 // update the view filtering parameters
651 if (visibleRange
!= null) {
652 ParamsUpdater updater
= getParamsUpdater();
653 if (updater
!= null) {
655 updater
.setEventsDiscarded(0);
656 // Update new visible time range if available
657 updater
.update(visibleRange
.getStartTime().getValue(), visibleRange
.getEndTime().getValue());
663 * Actions taken by the view to refresh its widget(s) with the updated data
668 * true: yes, false: partial update
670 @SuppressWarnings("deprecation")
671 protected void modelInputChanged(ILttngSyntEventRequest request
, boolean complete
) {
672 long experimentStartTime
= -1;
673 long experimentEndTime
= -1;
674 TmfTimeRange experimentTimeRange
= request
.getExperimentTimeRange();
675 if (experimentTimeRange
!= null) {
676 experimentStartTime
= experimentTimeRange
.getStartTime().getValue();
677 experimentEndTime
= experimentTimeRange
.getEndTime().getValue();
680 // Obtain the current resource list
681 ITmfTimeAnalysisEntry
[] itemArr
= getItemContainer().readItems();
683 if (itemArr
!= null) {
684 // Sort the array by pid
685 Arrays
.sort(itemArr
);
687 // Update the view part
688 displayModel(itemArr
, experimentStartTime
, experimentEndTime
, false, request
.getRange().getStartTime()
689 .getValue(), request
.getRange().getEndTime().getValue(), request
.getSource());
693 // reselect to original time
694 ParamsUpdater paramUpdater
= getParamsUpdater();
695 if ((paramUpdater
!= null) && (tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
696 final Long selTime
= paramUpdater
.getSelectedTime();
697 if (selTime
!= null) {
698 TraceDebug
.debug("View: " + getName() + "\n\t\tRestoring the selected time to: " + selTime
); //$NON-NLS-1$ //$NON-NLS-2$
699 Display display
= tsfviewer
.getControl().getDisplay();
700 display
.asyncExec(new Runnable() {
703 if ((tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
704 tsfviewer
.setSelectedTime(selTime
, false, this);
710 // System.out.println(System.currentTimeMillis() + ": AbsTimeUpdate (" + getName() + ") completed");
712 if (TraceDebug
.isDEBUG()) {
714 Long count
= request
.getSynEventCount();
715 for (int pos
= 0; pos
< itemArr
.length
; pos
++) {
716 eventCount
+= itemArr
[pos
].getTraceEvents().size();
719 int discarded
= paramUpdater
.getEventsDiscarded();
720 int discardedOutofOrder
= paramUpdater
.getEventsDiscardedWrongOrder();
721 int discardedOutofViewRange
= paramUpdater
.getEventsDiscardedOutOfViewRange();
722 int dicardedNotVisible
= paramUpdater
.getEventsDiscardedNotVisible();
724 TmfTimeRange range
= request
.getRange();
725 StringBuilder sb
= new StringBuilder("View: " + getName() + ", Events handled: " + count
//$NON-NLS-1$ //$NON-NLS-2$
726 + ", Events loaded in view: " + eventCount
+ ", Number of events discarded: " + discarded
//$NON-NLS-1$ //$NON-NLS-2$
727 + "\n\tNumber of events discarded with start time earlier than next good time: " //$NON-NLS-1$
728 + discardedOutofOrder
+ "\n\tDiscarded Not visible: " + dicardedNotVisible
//$NON-NLS-1$
729 + "\n\tDiscarded out of view Range: " + discardedOutofViewRange
); //$NON-NLS-1$
731 sb
.append("\n\t\tRequested Time Range: " + range
.getStartTime() + "-" + range
.getEndTime()); //$NON-NLS-1$ //$NON-NLS-2$
732 sb
.append("\n\t\tExperiment Time Range: " + experimentStartTime
+ "-" + experimentEndTime
); //$NON-NLS-1$ //$NON-NLS-2$
733 TraceDebug
.debug(sb
.toString());
741 // * Obtains the remainder fraction on unit Seconds of the entered value in
742 // * nanoseconds. e.g. input: 1241207054171080214 ns The number of seconds
744 // * be obtain by removing the last 9 digits: 1241207054 the fractional
745 // * portion of seconds, expressed in ns is: 171080214
750 // protected String formatNs(long v) {
751 // StringBuffer str = new StringBuffer();
752 // boolean neg = v < 0;
758 // String strVal = String.valueOf(v);
759 // if (v < 1000000000) {
763 // // Extract the last nine digits (e.g. fraction of a S expressed in ns
764 // return strVal.substring(strVal.length() - 9);
768 * The request was stopped, the data is incomplete
772 protected abstract void modelIncomplete(ILttngSyntEventRequest request
);
775 * Returns the Event processor instance related to a specific view
779 protected abstract ITransEventProcessor
getEventProcessor();
782 * To be overridden by some sub-classes although may not be needed in some
783 * e.g. statistics view
786 * @param startBoundTime
787 * @param endBoundTime
788 * @param updateTimeBounds
789 * - Time bounds updated needed e.g. if a new Experiment or trace
791 * @param startVisibleWindow
792 * @param endVisibleWindow
795 protected abstract void displayModel(final ITmfTimeAnalysisEntry
[] items
, final long startBoundTime
,
796 final long endBoundTime
, final boolean updateTimeBounds
, final long startVisibleWindow
,
797 final long endVisibleWindow
, final Object source
);
800 * To be overridden by some sub-classes although may not be needed in some
801 * e.g. statistics view
805 protected abstract ParamsUpdater
getParamsUpdater();
808 * Returns the model's item container
812 protected abstract ItemContainer
<?
> getItemContainer();
815 * Returns LTTng Synthetic Provider ID used for current view
819 protected abstract int getProviderId();