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
.internal
.lttng
.ui
.views
.common
;
15 import java
.util
.Arrays
;
17 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.LttngConstants
;
18 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.control
.LttngCoreProviderFactory
;
19 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.control
.LttngSyntheticEventProvider
;
20 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.event
.LttngSyntheticEvent
;
21 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.event
.LttngTimestamp
;
22 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.request
.ILttngSyntEventRequest
;
23 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.request
.IRequestStatusListener
;
24 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.request
.LttngSyntEventRequest
;
25 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.request
.RequestCompletedSignal
;
26 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.request
.RequestStartedSignal
;
27 import org
.eclipse
.linuxtools
.internal
.lttng
.core
.state
.evProcessor
.ITransEventProcessor
;
28 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.TraceDebug
;
29 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.model
.trange
.ItemContainer
;
30 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.viewers
.timeAnalysis
.ITimeAnalysisViewer
;
31 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.viewers
.timeAnalysis
.TmfTimeScaleSelectionEvent
;
32 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.viewers
.timeAnalysis
.TmfTimeSelectionEvent
;
33 import org
.eclipse
.linuxtools
.internal
.lttng
.ui
.viewers
.timeAnalysis
.model
.ITmfTimeAnalysisEntry
;
34 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
35 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfTimestamp
;
36 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimeRange
;
37 import org
.eclipse
.linuxtools
.tmf
.core
.request
.ITmfDataRequest
.ExecutionType
;
38 import org
.eclipse
.linuxtools
.tmf
.core
.request
.TmfDataRequest
;
39 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfExperimentDisposedSignal
;
40 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfRangeSynchSignal
;
41 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalHandler
;
42 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalManager
;
43 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfTimeSynchSignal
;
44 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.TmfExperiment
;
45 import org
.eclipse
.linuxtools
.tmf
.ui
.views
.TmfView
;
46 import org
.eclipse
.swt
.widgets
.Display
;
50 * Abstract class used as a base for views handling specific time range data
54 * The class handles a single element queue of data requests, i.e. request can
55 * be triggered from different sources e.g. opening a file as well as a new
56 * selected time window
62 public abstract class AbsTimeUpdateView
extends TmfView
implements IRequestStatusListener
{
64 // ========================================================================
66 // ========================================================================
68 // private static final long INITIAL_WINDOW_OFFSET = (1L * 1 * 1000 * 1000); // .001sec
69 // private static final long INITIAL_WINDOW_OFFSET = (1L * 10 * 1000 * 1000); // .01sec
70 private static final long INITIAL_WINDOW_OFFSET
= (1L * 100 * 1000 * 1000); // .1sec
71 // private static final long INITIAL_WINDOW_OFFSET = (1L * 1000 * 1000 * 1000); // 1sec
74 * Number of events before a GUI refresh
76 protected static final Long INPUT_CHANGED_REFRESH
= 75000L;
77 private static final long DEFAULT_OFFSET
= 0;
79 protected boolean synch
= true; // time synchronization, used to be an option
80 protected ITimeAnalysisViewer tsfviewer
= null;
82 private LttngSyntEventRequest fCurrentRequest
= null;
84 protected LttngSyntheticEventProvider fProvider
= LttngCoreProviderFactory
.getEventProvider(getProviderId());
86 // ========================================================================
88 // ========================================================================
89 public AbsTimeUpdateView(String viewID
) {
91 // freqState = UiCommonFactory.getQueue(this);
94 // ========================================================================
96 // ========================================================================
99 * Returns the number of events after which the relevant display will
104 protected Long
getInputChangedRefresh() {
105 return INPUT_CHANGED_REFRESH
;
109 * Cancel the ongoing request if another experiment is being selected
110 * @param experimentDisposedSignal
113 public void experimentDisposed(TmfExperimentDisposedSignal experimentDisposedSignal
) {
114 if (experimentDisposedSignal
.getExperiment() != TmfExperiment
.getCurrentExperiment()) {
117 fProvider
.conditionallyCancelRequests();
123 * @seeorg.eclipse.linuxtools.lttng.state.IStateDataRequestListener#
124 * processingStarted(org.eclipse.linuxtools.lttng.state.StateDataRequest)
128 public synchronized void processingStarted(RequestStartedSignal signal
) {
129 LttngSyntEventRequest request
= signal
.getRequest();
130 if (request
!= null) {
131 // update queue with the id of the current request.
132 // freqState.requestStarted(request);
134 // if there was no new request then this one is still on
135 // prepare for the reception of new data
138 // no new time range for zoom orders
139 TmfTimeRange trange
= null;
140 // Time Range will be used to filter out events which are
141 // not visible in one pixel
142 trange
= request
.getRange();
144 // indicate if the data model needs to be cleared e.g. a new
145 // experiment is being selected
146 boolean clearData
= request
.isclearDataInd();
147 // Indicate if current data needs to be cleared and if so
148 // specify the new experiment time range that applies
149 modelUpdatePrep(trange
, clearData
);
156 * @seeorg.eclipse.linuxtools.lttng.state.IStateDataRequestListener#
157 * processingCompleted(org.eclipse.linuxtools.lttng.state.StateDataRequest)
161 public void processingCompleted(RequestCompletedSignal signal
) {
162 ILttngSyntEventRequest request
= signal
.getRequest();
164 if (request
== null) {
168 // Update wait cursor
171 // No data refresh actions for cancelled requests.
172 if (request
.isCancelled() || request
.isFailed()) {
173 if (TraceDebug
.isDEBUG()) {
174 TmfTimeRange trange
= request
.getRange();
175 if (request
.isCancelled()) {
176 TraceDebug
.debug("Request cancelled " //$NON-NLS-1$
177 + trange
.getStartTime() + "-" + trange
.getEndTime() //$NON-NLS-1$
178 + " Handled Events: " + request
.getSynEventCount() //$NON-NLS-1$
179 + " " + request
.toString(), 15); //$NON-NLS-1$
180 } else if (request
.isFailed()) {
181 TraceDebug
.debug("Request Failed " + trange
.getStartTime() //$NON-NLS-1$
182 + "-" + trange
.getEndTime() + " Handled Events: " //$NON-NLS-1$ //$NON-NLS-2$
183 + request
.getSynEventCount() + " " //$NON-NLS-1$
184 + request
.toString());
190 modelInputChanged(request
, true);
195 * Registers as listener of time selection from other views
199 public void synchToTime(TmfTimeSynchSignal signal
) {
200 if (signal
== null) {
204 Object source
= signal
.getSource();
205 if (source
!= null && source
!= this) {
207 if ((tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
209 // Check for GUI thread
210 if (Display
.getCurrent() != null) {
211 // GUI thread - execute update right away.
213 // Internal value is expected in nano seconds.
214 long selectedTime
= signal
.getCurrentTime().getValue();
215 if (tsfviewer
!= null) {
216 tsfviewer
.setSelectedTime(selectedTime
, true, source
);
218 ParamsUpdater paramUpdater
= getParamsUpdater();
219 Long savedSelTime
= paramUpdater
.getSelectedTime();
220 if ((savedSelTime
== null) || (savedSelTime
!= selectedTime
)) {
221 // Update the parameter updater to save the selected time
222 paramUpdater
.setSelectedTime(selectedTime
);
226 // Perform the updates on the UI thread
228 // We need to clone the timestamp in the signal so that it won't be overwritten duo to multipe thread access
229 final TmfTimeSynchSignal savedSignal
= new TmfTimeSynchSignal(signal
.getSource(), signal
.getCurrentTime().clone());
230 tsfviewer
.getControl().getDisplay().asyncExec(new Runnable() {
233 if ((tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
234 synchToTime(savedSignal
);
245 * Process the reception of time window adjustment in this view if the
246 * source of the update is not this view.
249 * @param clearingData
251 public void synchToTimeRange(TmfRangeSynchSignal signal
, boolean clearingData
) {
252 if (signal
== null) {
256 Object source
= signal
.getSource();
257 if (source
!= null && source
!= this) {
258 // Internal value is expected in nano seconds.
259 TmfTimeRange trange
= signal
.getCurrentRange();
260 TmfExperiment experiment
= TmfExperiment
.getCurrentExperiment();
261 if (experiment
== null) {
262 TraceDebug
.debug("Current selected experiment is null"); //$NON-NLS-1$
266 // Clearing of process data is configurable
267 eventRequest(trange
, experiment
.getTimeRange(), clearingData
, ExecutionType
.FOREGROUND
);
273 * Trigger time synchronisation to other views this method shall be called
274 * when a check has been performed to note that an actual change of time has
275 * been performed vs a pure re-selection of the same time
280 protected void synchTimeNotification(long time
, Object source
) {
281 // if synchronisation selected
283 // Notify other views
284 TmfSignalManager
.dispatchSignal(new TmfTimeSynchSignal(source
, new LttngTimestamp(time
)));
289 * Common implementation of ITmfTimeSelectionListener, not used by all the
290 * views extending this abstract class
294 protected void tsfTmProcessSelEvent(TmfTimeSelectionEvent event
) {
295 Object source
= event
.getSource();
296 if (source
== null) {
300 ParamsUpdater paramUpdater
= getParamsUpdater();
301 Long savedSelTime
= paramUpdater
.getSelectedTime();
303 long selTimens
= event
.getSelectedTime();
305 // make sure the new selected time is different than saved before
307 if (savedSelTime
== null || savedSelTime
!= selTimens
) {
308 // Notify listener views.
309 synchTimeNotification(selTimens
, source
);
311 // Update the parameter updater to save the selected time
312 paramUpdater
.setSelectedTime(selTimens
);
314 if (TraceDebug
.isDEBUG()) {
315 TraceDebug
.debug("Selected Time: " + new LttngTimestamp(selTimens
) + "\n\t\t" + getName()); //$NON-NLS-1$ //$NON-NLS-2$
321 * Common implementation of ITmfTimeScaleSelectionListener, not used by all
322 * the views extending this abstract class
326 protected void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event
) {
327 // source needed to keep track of source values
328 Object source
= event
.getSource();
330 boolean newParams
= false;
331 TmfTimeRange trange
= null;
332 Long selectedTime
= null;
334 // update all information and get relevant data
335 synchronized (this) {
336 if (source
!= null) {
337 // Update the parameter updater before carrying out a read request
338 ParamsUpdater paramUpdater
= getParamsUpdater();
339 newParams
= paramUpdater
.processTimeScaleEvent(event
);
342 // Read the updated time window
343 trange
= paramUpdater
.getTrange();
344 if (trange
!= null) {
345 selectedTime
= paramUpdater
.getSelectedTime();
351 // Check for selectedTime is sufficient since it is only set if
352 // newParams is true and trange is not null
353 if (selectedTime
!= null) {
354 // Notify listener views. to perform data requests
355 // upon this notification
357 // Note that this has to be done outside the synchronized statement
358 // because otherwise we could end-up in a deadlock if a ongoing
359 // request needs to be canceled.
360 synchTimeRangeNotification(trange
, selectedTime
, source
);
365 * Inform registered listeners about the new time range
368 * @param selectedTime
371 protected void synchTimeRangeNotification(TmfTimeRange trange
, Long selectedTime
, Object source
) {
372 // if synchronisation selected
374 // Notify other views
375 TmfSignalManager
.dispatchSignal(new TmfRangeSynchSignal(source
, trange
, new LttngTimestamp(selectedTime
)));
380 * @param zoomedTRange
381 * @param experimentTRange
382 * @param clearingData
385 public void eventRequest(TmfTimeRange zoomedTRange
, TmfTimeRange experimentTRange
, boolean clearingData
, ExecutionType execType
) {
387 // timeRange is the Experiment time range
388 boolean sent
= processDataRequest(zoomedTRange
, experimentTRange
, DEFAULT_OFFSET
, TmfDataRequest
.ALL_DATA
, clearingData
, execType
);
399 * @param clearingData
402 public void eventRequest(long offset
, TmfTimeRange range
, boolean clearingData
, ExecutionType execType
) {
404 // timeRange is the Experiment time range
405 boolean sent
= processDataRequest(range
, null, offset
, TmfDataRequest
.ALL_DATA
, clearingData
, execType
);
413 // * @param zoomedTRange
414 // * @param experimentTRange
417 // public void dataRequest(TmfTimeRange zoomedTRange,
418 // TmfTimeRange experimentTRange, boolean clearingData) {
420 // // timeRange is the Experiment time range
421 // boolean sent = processDataRequest(zoomedTRange, experimentTRange, clearingData);
429 * send data request directly e.g. doesn't use a queue
431 * @param requestTrange
433 * @param experimentTRange
438 private boolean processDataRequest(TmfTimeRange requestTrange
,
439 TmfTimeRange experimentTRange
, long offset
, int nbRequested
, boolean clearingData
, ExecutionType execType
) {
441 if (requestTrange
== null) {
442 TraceDebug
.debug("Invalid input"); //$NON-NLS-1$
446 // Cancel the currently executing request before starting a new one
447 fProvider
.conditionallyCancelRequests();
448 fCurrentRequest
= new LttngSyntEventRequest(
449 requestTrange
, offset
, nbRequested
,
450 LttngConstants
.DEFAULT_BLOCK_SIZE
, this, experimentTRange
, getEventProcessor(),
451 TmfExperiment
.getCurrentExperiment().getName(), execType
) {
453 Long fCount
= getSynEventCount();
454 ITransEventProcessor processor
= getProcessor();
455 ITmfTimestamp frunningTimeStamp
;
461 * org.eclipse.linuxtools.lttng.request.LttngSyntEventRequest#handleData
464 //// int handleDataCount = 0;
465 //// int handleDataValidCount = 0;
467 // public void handleData() {
468 // LttngSyntheticEvent[] result = getData();
470 // TmfEvent evt = (result.length > 0) ? result[0] : null;
471 //// handleDataCount++;
474 public void handleData(ITmfEvent event
) {
475 super.handleData(event
);
477 // handleDataValidCount++;
478 LttngSyntheticEvent synEvent
= (LttngSyntheticEvent
) event
;
480 switch (synEvent
.getSynType()) {
483 handleRequestStarted();
488 processor
.process(event
, synEvent
.getTraceModel());
490 if ((fCount
!= 0) && (fCount
% getInputChangedRefresh() == 0)) {
491 // send partial update
492 modelInputChanged(this, false);
494 if (TraceDebug
.isDEBUG()) {
495 frunningTimeStamp
= event
.getTimestamp();
496 TraceDebug
.debug("handled: " + fCount
+ " sequence: " + synEvent
.getSynType()); //$NON-NLS-1$ //$NON-NLS-2$
505 processor
.process(event
, synEvent
.getTraceModel());
516 public void handleRequestStarted() {
522 // if (TraceDebug.isDEBUG()) {
523 // TraceDebug.debug("AbsTimeUpdateView: Received=" + handleDataCount + ", Valid=" + handleDataCount + ", fCount=" + fCount);
529 public void handleCompleted() {
530 super.handleCompleted();
532 // Data is not complete and should be handled as such
533 if (isFailed() || isCancelled()) {
534 modelIncomplete(this);
537 if (TraceDebug
.isDEBUG()) {
538 if (frunningTimeStamp
!= null) {
539 TraceDebug
.debug("Last event time stamp: " + frunningTimeStamp
.getValue()); //$NON-NLS-1$
545 // send the request to TMF
546 fCurrentRequest
.startRequestInd(fProvider
);
547 fCurrentRequest
.setclearDataInd(clearingData
);
552 * Returns an initial smaller window to allow the user to select the area of
555 * @param experimentTRange
558 protected TmfTimeRange
getInitTRange(TmfTimeRange experimentTRange
) {
559 ITmfTimestamp expStartTime
= experimentTRange
.getStartTime();
560 ITmfTimestamp expEndTime
= experimentTRange
.getEndTime();
561 ITmfTimestamp initialEndOfWindow
= new LttngTimestamp(expStartTime
563 + INITIAL_WINDOW_OFFSET
);
564 if (initialEndOfWindow
.compareTo(expEndTime
, false) < 0) {
565 return new TmfTimeRange(expStartTime
, initialEndOfWindow
);
568 // The original size of the experiment is smaller than proposed adjusted
570 return experimentTRange
;
574 * Request the Time Analysis widget to enable or disable the wait cursor
575 * e.g. data request in progress or data request completed
579 protected void waitCursor(final boolean waitInd
) {
580 if ((tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
581 Display display
= tsfviewer
.getControl().getDisplay();
583 // Perform the updates on the UI thread
584 display
.asyncExec(new Runnable() {
587 if ((tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
588 tsfviewer
.waitCursor(waitInd
);
596 * View preparation to override the current local information
599 * - new total time range e.g. Experiment level
600 * @param clearAllData
602 protected void modelUpdatePrep(TmfTimeRange timeRange
, boolean clearAllData
) {
603 ItemContainer
<?
> itemContainer
= getItemContainer();
605 // start fresh e.g. new experiment selected
606 itemContainer
.clearItems();
608 // clear children but keep processes
609 itemContainer
.clearChildren();
612 // Obtain the current resource array
613 ITmfTimeAnalysisEntry
[] itemArr
= itemContainer
.readItems();
615 // sort the array by pid
616 Arrays
.sort(itemArr
);
618 // clean up data and boundaries
619 displayModel(itemArr
, -1, -1, false, -1, -1, null);
621 ParamsUpdater updater
= getParamsUpdater();
622 if (updater
!= null) {
624 updater
.setEventsDiscarded(0);
626 // Update new visible time range if available
627 if (timeRange
!= null) {
628 updater
.update(timeRange
.getStartTime().getValue(), timeRange
.getEndTime().getValue());
634 * Initialize the model and view before reloading items
636 * @param boundaryRange
637 * @param visibleRange
640 protected void modelUpdateInit(TmfTimeRange boundaryRange
, TmfTimeRange visibleRange
, Object source
) {
641 // Update the view boundaries
642 if (boundaryRange
!= null) {
643 ItemContainer
<?
> itemContainer
= getItemContainer();
644 if (itemContainer
!= null) {
645 itemContainer
.clearItems();
646 // Obtain the current process array
647 ITmfTimeAnalysisEntry
[] itemArr
= itemContainer
.readItems();
649 // sort the array by pid
650 Arrays
.sort(itemArr
);
652 long startTime
= boundaryRange
.getStartTime().getValue();
653 long endTime
= boundaryRange
.getEndTime().getValue();
655 // Update the view part
656 displayModel(itemArr
, startTime
, endTime
, true, visibleRange
.getStartTime().getValue(), visibleRange
657 .getEndTime().getValue(), source
);
661 // update the view filtering parameters
662 if (visibleRange
!= null) {
663 ParamsUpdater updater
= getParamsUpdater();
664 if (updater
!= null) {
666 updater
.setEventsDiscarded(0);
667 // Update new visible time range if available
668 updater
.update(visibleRange
.getStartTime().getValue(), visibleRange
.getEndTime().getValue());
674 * Actions taken by the view to refresh its widget(s) with the updated data
679 * true: yes, false: partial update
681 @SuppressWarnings("deprecation")
682 protected void modelInputChanged(ILttngSyntEventRequest request
, boolean complete
) {
683 long experimentStartTime
= -1;
684 long experimentEndTime
= -1;
685 TmfTimeRange experimentTimeRange
= request
.getExperimentTimeRange();
686 if (experimentTimeRange
!= null) {
687 experimentStartTime
= experimentTimeRange
.getStartTime().getValue();
688 experimentEndTime
= experimentTimeRange
.getEndTime().getValue();
691 // Obtain the current resource list
692 ITmfTimeAnalysisEntry
[] itemArr
= getItemContainer().readItems();
694 if (itemArr
!= null) {
695 // Sort the array by pid
696 Arrays
.sort(itemArr
);
698 // Update the view part
699 displayModel(itemArr
, experimentStartTime
, experimentEndTime
, false, request
.getRange().getStartTime()
700 .getValue(), request
.getRange().getEndTime().getValue(), request
.getSource());
704 // reselect to original time
705 ParamsUpdater paramUpdater
= getParamsUpdater();
706 if ((paramUpdater
!= null) && (tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
707 final Long selTime
= paramUpdater
.getSelectedTime();
708 if (selTime
!= null) {
709 TraceDebug
.debug("View: " + getName() + "\n\t\tRestoring the selected time to: " + selTime
); //$NON-NLS-1$ //$NON-NLS-2$
710 Display display
= tsfviewer
.getControl().getDisplay();
711 display
.asyncExec(new Runnable() {
714 if ((tsfviewer
!= null) && (!tsfviewer
.getControl().isDisposed())) {
715 tsfviewer
.setSelectedTime(selTime
, false, this);
721 // System.out.println(System.currentTimeMillis() + ": AbsTimeUpdate (" + getName() + ") completed");
723 if (TraceDebug
.isDEBUG()) {
725 Long count
= request
.getSynEventCount();
726 for (int pos
= 0; pos
< itemArr
.length
; pos
++) {
727 eventCount
+= itemArr
[pos
].getTraceEvents().size();
730 int discarded
= paramUpdater
.getEventsDiscarded();
731 int discardedOutofOrder
= paramUpdater
.getEventsDiscardedWrongOrder();
732 int discardedOutofViewRange
= paramUpdater
.getEventsDiscardedOutOfViewRange();
733 int dicardedNotVisible
= paramUpdater
.getEventsDiscardedNotVisible();
735 TmfTimeRange range
= request
.getRange();
736 StringBuilder sb
= new StringBuilder("View: " + getName() + ", Events handled: " + count
//$NON-NLS-1$ //$NON-NLS-2$
737 + ", Events loaded in view: " + eventCount
+ ", Number of events discarded: " + discarded
//$NON-NLS-1$ //$NON-NLS-2$
738 + "\n\tNumber of events discarded with start time earlier than next good time: " //$NON-NLS-1$
739 + discardedOutofOrder
+ "\n\tDiscarded Not visible: " + dicardedNotVisible
//$NON-NLS-1$
740 + "\n\tDiscarded out of view Range: " + discardedOutofViewRange
); //$NON-NLS-1$
742 sb
.append("\n\t\tRequested Time Range: " + range
.getStartTime() + "-" + range
.getEndTime()); //$NON-NLS-1$ //$NON-NLS-2$
743 sb
.append("\n\t\tExperiment Time Range: " + experimentStartTime
+ "-" + experimentEndTime
); //$NON-NLS-1$ //$NON-NLS-2$
744 TraceDebug
.debug(sb
.toString());
752 // * Obtains the remainder fraction on unit Seconds of the entered value in
753 // * nanoseconds. e.g. input: 1241207054171080214 ns The number of seconds
755 // * be obtain by removing the last 9 digits: 1241207054 the fractional
756 // * portion of seconds, expressed in ns is: 171080214
761 // protected String formatNs(long v) {
762 // StringBuffer str = new StringBuffer();
763 // boolean neg = v < 0;
769 // String strVal = String.valueOf(v);
770 // if (v < 1000000000) {
774 // // Extract the last nine digits (e.g. fraction of a S expressed in ns
775 // return strVal.substring(strVal.length() - 9);
779 * The request was stopped, the data is incomplete
783 protected abstract void modelIncomplete(ILttngSyntEventRequest request
);
786 * Returns the Event processor instance related to a specific view
790 protected abstract ITransEventProcessor
getEventProcessor();
793 * To be overridden by some sub-classes although may not be needed in some
794 * e.g. statistics view
797 * @param startBoundTime
798 * @param endBoundTime
799 * @param updateTimeBounds
800 * - Time bounds updated needed e.g. if a new Experiment or trace
802 * @param startVisibleWindow
803 * @param endVisibleWindow
806 protected abstract void displayModel(final ITmfTimeAnalysisEntry
[] items
, final long startBoundTime
,
807 final long endBoundTime
, final boolean updateTimeBounds
, final long startVisibleWindow
,
808 final long endVisibleWindow
, final Object source
);
811 * To be overridden by some sub-classes although may not be needed in some
812 * e.g. statistics view
816 protected abstract ParamsUpdater
getParamsUpdater();
819 * Returns the model's item container
823 protected abstract ItemContainer
<?
> getItemContainer();
826 * Returns LTTng Synthetic Provider ID used for current view
830 protected abstract int getProviderId();