1 package org
.eclipse
.linuxtools
.lttng
.ui
.views
.histogram
;
3 import org
.eclipse
.linuxtools
.lttng
.event
.LttngEvent
;
4 import org
.eclipse
.linuxtools
.tmf
.event
.TmfEvent
;
5 import org
.eclipse
.linuxtools
.tmf
.event
.TmfTimeRange
;
6 import org
.eclipse
.linuxtools
.tmf
.request
.TmfEventRequest
;
8 public class HistogramRequest
extends TmfEventRequest
<LttngEvent
> {
10 final static int MAX_EVENTS_PER_REQUEST
= 1;
11 final static int REDRAW_EVERY_NB_EVENTS
= 10000;
13 private HistogramContent histogramContent
= null;
15 private int lastPos
= 0;
16 private long lastRangeTime
= 0L;
17 private long nbEventsInRange
= 1;
19 private int nbPosNotEmpty
= 1;
20 private int nbEventRead
= 0;
22 private TraceCanvas parentCanvas
= null;
24 private boolean requestCompleted
= false;
26 @SuppressWarnings("unchecked")
27 public HistogramRequest(Class
<?
extends TmfEvent
> dataType
, TmfTimeRange range
, int nbRequested
, HistogramContent newContent
, TraceCanvas newParentCanvas
, Long timeInterval
) {
28 super((Class
<LttngEvent
>)dataType
, range
, nbRequested
, MAX_EVENTS_PER_REQUEST
);
31 // This does not work! The request won't be processed or the number of events returned is wrong!
32 // We cannot use this !
33 //super((Class<LttngEvent>)dataType, range);
35 histogramContent
= newContent
;
36 parentCanvas
= newParentCanvas
;
38 histogramContent
.resetContentData();
39 histogramContent
.setStartTime(range
.getStartTime().getValue());
40 histogramContent
.setEndTime(range
.getEndTime().getValue());
41 histogramContent
.setIntervalTime(timeInterval
);
42 histogramContent
.resetTable();
44 lastRangeTime
= histogramContent
.getStartTime();
48 public void handleData() {
49 TmfEvent
[] result
= getData();
50 TmfEvent
[] evt
= new TmfEvent
[1];
52 evt
[0] = (result
.length
> 0) ? result
[0] : null;
56 // The request by timerange only does not work! (see constructor above)
57 // However, the request with number of events will loop until it reach its number or EOF
58 // We have to filter out ourself the extra useless events!
60 if ( (evt
[0] != null) && (requestCompleted
== false) ) {
61 LttngEvent tmpEvent
= (LttngEvent
)evt
[0];
63 // This check is linked to the evil fix mentionned above
64 if ( tmpEvent
.getTimestamp().getValue() <= histogramContent
.getEndTime() ) {
66 long distance
= ( tmpEvent
.getTimestamp().getValue() - lastRangeTime
);
68 if ( distance
> histogramContent
.getIntervalTime() ) {
70 histogramContent
.getElementByIndex(lastPos
).intervalNbEvents
= nbEventsInRange
;
71 lastRangeTime
= tmpEvent
.getTimestamp().getValue();
73 lastPos
= (int)((lastRangeTime
- histogramContent
.getStartTime()) / histogramContent
.getIntervalTime() );
76 // Because of the threads, weird phenomenons seem to happen here, like a position after the
77 // element range because another request was issued.
78 // This enforce the position but may result in slightly inconsistent result (i.e. a weird misplaced bar sometime).
82 else if ( lastPos
>= histogramContent
.getNbElement() ) {
83 lastPos
= (histogramContent
.getNbElement()-1);
86 histogramContent
.getElementByIndex(lastPos
).firstIntervalTimestamp
= lastRangeTime
;
87 histogramContent
.setReadyUpToPosition(lastPos
);
94 if ( nbEventsInRange
> histogramContent
.getHeighestEventCount() ) {
95 histogramContent
.setHeighestEventCount(nbEventsInRange
);
101 if ( nbEventRead
% REDRAW_EVERY_NB_EVENTS
== 0 ) {
102 redrawAsyncronously();
108 // Because of the other evil bug (see above), we have to ignore extra useless events we will get
109 // However, we might be far away from the end so we better start a redraw now
110 redrawAsyncronously();
111 requestCompleted
= true;
113 // Althought it won't do anything, try to call control functions to stop the request
122 public void handleCompleted() {
123 redrawAsyncronously();
127 public void handleSuccess() {
128 // Nothing different from completed.
132 public void handleFailure() {
133 // Nothing different from cancel.
137 public void handleCancel() {
138 redrawAsyncronously();
139 requestCompleted
= true;
143 public void updateEventsInfo() {
144 int averageNumberOfEvents
= nbEventRead
/ nbPosNotEmpty
;
145 histogramContent
.setAverageNumberOfEvents(averageNumberOfEvents
);
146 histogramContent
.recalculateEventHeight();
149 public void redrawAsyncronously() {
151 // canvas redraw is already asynchronous
152 parentCanvas
.redrawAsynchronously();