1 /*******************************************************************************
2 * Copyright (c) 2009 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 * Francois Chouinard - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.tmf
.trace
;
15 import java
.util
.HashSet
;
17 import java
.util
.Vector
;
19 import org
.eclipse
.linuxtools
.tmf
.event
.TmfEvent
;
20 import org
.eclipse
.linuxtools
.tmf
.event
.TmfTimeRange
;
21 import org
.eclipse
.linuxtools
.tmf
.event
.TmfTimestamp
;
22 import org
.eclipse
.linuxtools
.tmf
.request
.ITmfRequestHandler
;
23 import org
.eclipse
.linuxtools
.tmf
.request
.TmfDataRequest
;
24 import org
.eclipse
.linuxtools
.tmf
.stream
.ITmfEventStream
;
25 import org
.eclipse
.linuxtools
.tmf
.stream
.TmfStreamUpdateEvent
;
26 import org
.eclipse
.linuxtools
.tmf
.stream
.ITmfEventStream
.StreamContext
;
29 * <b><u>TmfEventLog</u></b>
31 * TmfEventLog represents a time-ordered set of events tied to a single event
32 * stream. It keeps track of the global information about the event log:
34 * <li> the epoch, a reference timestamp for the whole log (t0)
35 * <li> the span of the log i.e. the timestamps range
36 * <li> the total number of events
38 * As an ITmfRequestHandler, it provides an implementation of process()
39 * which handles event requests.
41 * TODO: Handle concurrent and possibly overlapping requests in a way that
42 * optimizes the stream access and event parsing.
44 public class TmfTrace
implements ITmfRequestHandler
<TmfEvent
> {
46 // ========================================================================
48 // ========================================================================
50 private final String fId
;
51 private final ITmfEventStream fStream
;
52 private final TmfTimestamp fEpoch
;
55 private Set
<ITmfTraceEventListener
> fListeners
= new HashSet
<ITmfTraceEventListener
>();
57 // ========================================================================
58 // Constructors/Destructors
59 // ========================================================================
61 public TmfTrace(String id
, ITmfEventStream stream
) {
62 this(id
, stream
, TmfTimestamp
.BigBang
);
65 public TmfTrace(String id
, ITmfEventStream stream
, TmfTimestamp epoch
) {
66 assert stream
!= null;
70 fStream
.addListener(this);
73 public void dispose() {
74 fStream
.removeListener(this);
77 // ========================================================================
79 // ========================================================================
81 public String
getId() {
85 public ITmfEventStream
getStream() {
89 public TmfTimestamp
getEpoch() {
93 public TmfTimeRange
getTimeRange() {
94 return fStream
.getTimeRange();
97 public int getNbEvents() {
98 return fStream
.getNbEvents();
101 // ========================================================================
103 // ========================================================================
106 * @see org.eclipse.linuxtools.tmf.eventlog.ITmfRequestHandler#processRequest(org.eclipse.linuxtools.tmf.eventlog.TmfDataRequest, boolean)
108 public void processRequest(TmfDataRequest
<TmfEvent
> request
, boolean waitForCompletion
) {
109 if (request
.getRange() != null) {
110 serviceEventRequestByTimestamp(request
);
112 serviceEventRequestByIndex(request
);
114 if (waitForCompletion
) {
115 request
.waitForCompletion();
119 public void addListener(ITmfTraceEventListener listener
) {
120 fListeners
.add(listener
);
123 public void removeListener(ITmfTraceEventListener listener
) {
124 fListeners
.remove(listener
);
127 public void handleEvent(TmfStreamUpdateEvent event
) {
128 for (ITmfTraceEventListener listener
: fListeners
) {
129 listener
.handleEvent(new TmfTraceUpdateEvent(this));
133 // ========================================================================
135 // ========================================================================
141 private void serviceEventRequestByTimestamp(final TmfDataRequest
<TmfEvent
> request
) {
142 Thread thread
= new Thread() {
145 TmfTimestamp startTime
= request
.getRange().getStartTime();
146 TmfTimestamp endTime
= request
.getRange().getEndTime();
147 int blockSize
= request
.getBlockize();
149 int nbRequestedEvents
= request
.getNbRequestedItems();
150 if (nbRequestedEvents
== -1) {
151 nbRequestedEvents
= Integer
.MAX_VALUE
;
154 Vector
<TmfEvent
> events
= new Vector
<TmfEvent
>();
157 StreamContext context
= new StreamContext(null);
158 TmfEvent event
= fStream
.getEvent(context
, startTime
);
160 while (!request
.isCancelled() && nbEvents
< nbRequestedEvents
&& event
!= null &&
161 event
.getTimestamp().compareTo(endTime
, false) <= 0 )
164 if (++nbEvents
% blockSize
== 0) {
165 TmfEvent
[] result
= new TmfEvent
[events
.size()];
166 events
.toArray(result
);
167 request
.setData(result
);
168 request
.handlePartialResult();
169 events
.removeAllElements();
171 // To avoid an unnecessary read passed the last event requested
172 if (nbEvents
< nbRequestedEvents
)
173 event
= fStream
.getNextEvent(context
);
175 TmfEvent
[] result
= new TmfEvent
[events
.size()];
176 events
.toArray(result
);
177 request
.setData(result
);
179 request
.handlePartialResult();
190 private void serviceEventRequestByIndex(final TmfDataRequest
<TmfEvent
> request
) {
191 Thread thread
= new Thread() {
194 int blockSize
= request
.getBlockize();
196 int nbRequestedEvents
= request
.getNbRequestedItems();
197 if (nbRequestedEvents
== -1) {
198 nbRequestedEvents
= Integer
.MAX_VALUE
;
201 Vector
<TmfEvent
> events
= new Vector
<TmfEvent
>();
204 StreamContext context
= new StreamContext(null);
205 TmfEvent event
= fStream
.getEvent(context
, request
.getIndex());
207 while (!request
.isCancelled() && nbEvents
< nbRequestedEvents
&& event
!= null)
210 if (++nbEvents
% blockSize
== 0) {
211 TmfEvent
[] result
= new TmfEvent
[events
.size()];
212 events
.toArray(result
);
213 request
.setData(result
);
214 request
.handlePartialResult();
215 events
.removeAllElements();
217 // To avoid an unnecessary read passed the last event requested
218 if (nbEvents
< nbRequestedEvents
)
219 event
= fStream
.getNextEvent(context
);
221 TmfEvent
[] result
= new TmfEvent
[events
.size()];
222 events
.toArray(result
);
224 request
.setData(result
);
225 request
.handlePartialResult();