298b7bbd243564714696bb13c87f22800d0fa3a3
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf / src / org / eclipse / linuxtools / tmf / trace / TmfTrace.java
1 /*******************************************************************************
2 * Copyright (c) 2009 Ericsson
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 * Francois Chouinard - Initial API and implementation
11 *******************************************************************************/
12
13 package org.eclipse.linuxtools.tmf.trace;
14
15 import java.util.HashSet;
16 import java.util.Set;
17 import java.util.Vector;
18
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;
27
28 /**
29 * <b><u>TmfEventLog</u></b>
30 * <p>
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:
33 * <ul>
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
37 * </ul>
38 * As an ITmfRequestHandler, it provides an implementation of process()
39 * which handles event requests.
40 * <p>
41 * TODO: Handle concurrent and possibly overlapping requests in a way that
42 * optimizes the stream access and event parsing.
43 */
44 public class TmfTrace implements ITmfRequestHandler<TmfEvent> {
45
46 // ========================================================================
47 // Attributes
48 // ========================================================================
49
50 private final String fId;
51 private final ITmfEventStream fStream;
52 private final TmfTimestamp fEpoch;
53
54 // The listeners
55 private Set<ITmfTraceEventListener> fListeners = new HashSet<ITmfTraceEventListener>();
56
57 // ========================================================================
58 // Constructors/Destructors
59 // ========================================================================
60
61 public TmfTrace(String id, ITmfEventStream stream) {
62 this(id, stream, TmfTimestamp.BigBang);
63 }
64
65 public TmfTrace(String id, ITmfEventStream stream, TmfTimestamp epoch) {
66 assert stream != null;
67 fId = id;
68 fStream = stream;
69 fEpoch = epoch;
70 fStream.addListener(this);
71 }
72
73 public void dispose() {
74 fStream.removeListener(this);
75 }
76
77 // ========================================================================
78 // Accessors
79 // ========================================================================
80
81 public String getId() {
82 return fId;
83 }
84
85 public ITmfEventStream getStream() {
86 return fStream;
87 }
88
89 public TmfTimestamp getEpoch() {
90 return fEpoch;
91 }
92
93 public TmfTimeRange getTimeRange() {
94 return fStream.getTimeRange();
95 }
96
97 public int getNbEvents() {
98 return fStream.getNbEvents();
99 }
100
101 // ========================================================================
102 // Operators
103 // ========================================================================
104
105 /* (non-Javadoc)
106 * @see org.eclipse.linuxtools.tmf.eventlog.ITmfRequestHandler#processRequest(org.eclipse.linuxtools.tmf.eventlog.TmfDataRequest, boolean)
107 */
108 public void processRequest(TmfDataRequest<TmfEvent> request, boolean waitForCompletion) {
109 if (request.getRange() != null) {
110 serviceEventRequestByTimestamp(request);
111 } else {
112 serviceEventRequestByIndex(request);
113 }
114 if (waitForCompletion) {
115 request.waitForCompletion();
116 }
117 }
118
119 public void addListener(ITmfTraceEventListener listener) {
120 fListeners.add(listener);
121 }
122
123 public void removeListener(ITmfTraceEventListener listener) {
124 fListeners.remove(listener);
125 }
126
127 public void handleEvent(TmfStreamUpdateEvent event) {
128 for (ITmfTraceEventListener listener : fListeners) {
129 listener.handleEvent(new TmfTraceUpdateEvent(this));
130 }
131 }
132
133 // ========================================================================
134 // Helper functions
135 // ========================================================================
136
137 /* (non-Javadoc)
138 *
139 * @param request
140 */
141 private void serviceEventRequestByTimestamp(final TmfDataRequest<TmfEvent> request) {
142 Thread thread = new Thread() {
143 @Override
144 public void run() {
145 TmfTimestamp startTime = request.getRange().getStartTime();
146 TmfTimestamp endTime = request.getRange().getEndTime();
147 int blockSize = request.getBlockize();
148
149 int nbRequestedEvents = request.getNbRequestedItems();
150 if (nbRequestedEvents == -1) {
151 nbRequestedEvents = Integer.MAX_VALUE;
152 }
153
154 Vector<TmfEvent> events = new Vector<TmfEvent>();
155 int nbEvents = 0;
156
157 StreamContext context = new StreamContext(null);
158 TmfEvent event = fStream.getEvent(context, startTime);
159
160 while (!request.isCancelled() && nbEvents < nbRequestedEvents && event != null &&
161 event.getTimestamp().compareTo(endTime, false) <= 0 )
162 {
163 events.add(event);
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();
170 }
171 // To avoid an unnecessary read passed the last event requested
172 if (nbEvents < nbRequestedEvents)
173 event = fStream.getNextEvent(context);
174 }
175 TmfEvent[] result = new TmfEvent[events.size()];
176 events.toArray(result);
177 request.setData(result);
178
179 request.handlePartialResult();
180 request.done();
181 }
182 };
183 thread.start();
184 }
185
186 /* (non-Javadoc)
187 *
188 * @param request
189 */
190 private void serviceEventRequestByIndex(final TmfDataRequest<TmfEvent> request) {
191 Thread thread = new Thread() {
192 @Override
193 public void run() {
194 int blockSize = request.getBlockize();
195
196 int nbRequestedEvents = request.getNbRequestedItems();
197 if (nbRequestedEvents == -1) {
198 nbRequestedEvents = Integer.MAX_VALUE;
199 }
200
201 Vector<TmfEvent> events = new Vector<TmfEvent>();
202 int nbEvents = 0;
203
204 StreamContext context = new StreamContext(null);
205 TmfEvent event = fStream.getEvent(context, request.getIndex());
206
207 while (!request.isCancelled() && nbEvents < nbRequestedEvents && event != null)
208 {
209 events.add(event);
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();
216 }
217 // To avoid an unnecessary read passed the last event requested
218 if (nbEvents < nbRequestedEvents)
219 event = fStream.getNextEvent(context);
220 }
221 TmfEvent[] result = new TmfEvent[events.size()];
222 events.toArray(result);
223
224 request.setData(result);
225 request.handlePartialResult();
226 request.done();
227 }
228 };
229 thread.start();
230 }
231
232 }
This page took 0.035651 seconds and 4 git commands to generate.