Contribute CNF based TMF project handling
[deliverable/tracecompass.git] / org.eclipse.linuxtools.lttng / src / org / eclipse / linuxtools / lttng / trace / LTTngExperiment.java
CommitLineData
82e04272
FC
1/*******************************************************************************
2 * Copyright (c) 2010 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
13package org.eclipse.linuxtools.lttng.trace;
14
a79913eb
FC
15import org.eclipse.linuxtools.lttng.event.LttngEvent;
16import org.eclipse.linuxtools.lttng.event.LttngTimestamp;
17import org.eclipse.linuxtools.lttng.jni.JniTrace;
82e04272 18import org.eclipse.linuxtools.tmf.event.TmfEvent;
a79913eb 19import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
82e04272
FC
20import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
21import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
22import org.eclipse.linuxtools.tmf.experiment.TmfExperimentContext;
23import org.eclipse.linuxtools.tmf.experiment.TmfExperimentLocation;
a79913eb
FC
24import org.eclipse.linuxtools.tmf.request.ITmfDataRequest;
25import org.eclipse.linuxtools.tmf.request.ITmfDataRequest.ExecutionType;
26import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
27import org.eclipse.linuxtools.tmf.signal.TmfExperimentRangeUpdatedSignal;
28import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
82e04272
FC
29import org.eclipse.linuxtools.tmf.signal.TmfSignalManager;
30import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
31import org.eclipse.linuxtools.tmf.trace.TmfContext;
32
33/**
34 * <b><u>LTTngExperiment</u></b>
35 * <p>
36 * Temporary class to resolve a basic incompatibility between TMF and LTTng.
37 * <p>
38 */
12c155f5 39public class LTTngExperiment<T extends TmfEvent> extends TmfExperiment<T> {
82e04272 40
a79913eb 41 private static final int DEFAULT_INDEX_PAGE_SIZE = 50000;
82e04272 42
a79913eb 43 // ------------------------------------------------------------------------
82e04272
FC
44 // Constructors
45 // ------------------------------------------------------------------------
46
47 /**
48 * @param type
49 * @param id
50 * @param traces
51 * @param epoch
52 * @param indexPageSize
53 */
12c155f5 54 public LTTngExperiment(Class<T> type, String id, ITmfTrace<T>[] traces, TmfTimestamp epoch, int indexPageSize) {
82e04272 55 this(type, id, traces, TmfTimestamp.Zero, indexPageSize, false);
a79913eb 56 }
82e04272 57
12c155f5 58 public LTTngExperiment(Class<T> type, String id, ITmfTrace<T>[] traces, TmfTimestamp epoch, int indexPageSize, boolean preIndexExperiment) {
a79913eb
FC
59 super(type, id, traces, epoch, indexPageSize, preIndexExperiment);
60 }
82e04272
FC
61
62 /**
63 * @param type
64 * @param id
65 * @param traces
66 */
12c155f5 67 public LTTngExperiment(Class<T> type, String id, ITmfTrace<T>[] traces) {
82e04272
FC
68 this(type, id, traces, TmfTimestamp.Zero, DEFAULT_INDEX_PAGE_SIZE);
69 }
70
71 /**
72 * @param type
73 * @param id
74 * @param traces
75 * @param indexPageSize
76 */
12c155f5 77 public LTTngExperiment(Class<T> type, String id, ITmfTrace<T>[] traces, int indexPageSize) {
82e04272
FC
78 this(type, id, traces, TmfTimestamp.Zero, indexPageSize);
79 }
a79913eb 80
12c155f5 81 @SuppressWarnings("unchecked")
82e04272 82 public LTTngExperiment(LTTngExperiment<T> other) {
a79913eb
FC
83 super(other.getName() + "(clone)", other.fType); //$NON-NLS-1$
84
85 fEpoch = other.fEpoch;
86 fIndexPageSize = other.fIndexPageSize;
87
88 fTraces = new ITmfTrace[other.fTraces.length];
89 for (int trace = 0; trace < other.fTraces.length; trace++) {
12c155f5 90 fTraces[trace] = other.fTraces[trace].copy();
a79913eb
FC
91 }
92
93 fNbEvents = other.fNbEvents;
94 fTimeRange = other.fTimeRange;
95 }
96
97 @Override
12c155f5 98 public LTTngExperiment<T> copy() {
a79913eb
FC
99 LTTngExperiment<T> experiment = new LTTngExperiment<T>(this);
100 TmfSignalManager.deregister(experiment);
101 return experiment;
82e04272 102 }
a79913eb
FC
103
104 // ------------------------------------------------------------------------
82e04272
FC
105 // ITmfTrace trace positioning
106 // ------------------------------------------------------------------------
107
a79913eb
FC
108 @Override
109 public synchronized TmfEvent getNextEvent(TmfContext context) {
82e04272 110
a79913eb
FC
111 // Validate the context
112 if (!(context instanceof TmfExperimentContext)) {
113 return null; // Throw an exception?
114 }
82e04272 115
a79913eb 116 if (!context.equals(fExperimentContext)) {
82e04272 117// Tracer.trace("Ctx: Restoring context");
a79913eb
FC
118 fExperimentContext = seekLocation(context.getLocation());
119 }
120
121 TmfExperimentContext expContext = (TmfExperimentContext) context;
82e04272
FC
122
123// dumpContext(expContext, true);
124
a79913eb
FC
125 // If an event was consumed previously, get the next one from that trace
126 int lastTrace = expContext.getLastTrace();
127 if (lastTrace != TmfExperimentContext.NO_TRACE) {
128 TmfContext traceContext = expContext.getContexts()[lastTrace];
129 expContext.getEvents()[lastTrace] = expContext.getTraces()[lastTrace].getNextEvent(traceContext);
130 expContext.setLastTrace(TmfExperimentContext.NO_TRACE);
131 }
132
133 // Scan the candidate events and identify the "next" trace to read from
134 TmfEvent eventArray[] = expContext.getEvents();
135 if (eventArray == null) {
136 return null;
137 }
138 int trace = TmfExperimentContext.NO_TRACE;
139 TmfTimestamp timestamp = TmfTimestamp.BigCrunch;
140 if (eventArray.length == 1) {
141 if (eventArray[0] != null) {
142 timestamp = eventArray[0].getTimestamp();
143 trace = 0;
144 }
145 } else {
146 for (int i = 0; i < eventArray.length; i++) {
147 TmfEvent event = eventArray[i];
148 if (event != null && event.getTimestamp() != null) {
149 TmfTimestamp otherTS = event.getTimestamp();
150 if (otherTS.compareTo(timestamp, true) < 0) {
151 trace = i;
152 timestamp = otherTS;
153 }
154 }
155 }
156 }
157
158 // Update the experiment context and set the "next" event
159 TmfEvent event = null;
160 if (trace != TmfExperimentContext.NO_TRACE) {
82e04272
FC
161// updateIndex(expContext, timestamp);
162
a79913eb
FC
163 TmfContext traceContext = expContext.getContexts()[trace];
164 TmfExperimentLocation expLocation = (TmfExperimentLocation) expContext.getLocation();
165 expLocation.getLocation().locations[trace] = traceContext.getLocation();
82e04272 166
a79913eb 167 updateIndex(expContext, timestamp);
82e04272 168
a79913eb
FC
169 expLocation.getRanks()[trace] = traceContext.getRank();
170 expContext.setLastTrace(trace);
171 expContext.updateRank(1);
172 event = expContext.getEvents()[trace];
173 fExperimentContext = expContext;
174 }
82e04272
FC
175
176// if (event != null) {
177// Tracer.trace("Exp: " + (expContext.getRank() - 1) + ": " + event.getTimestamp().toString());
178// dumpContext(expContext, false);
179// Tracer.trace("Ctx: Event returned= " + event.getTimestamp().toString());
180// }
181
a79913eb
FC
182 return event;
183 }
184
185 @SuppressWarnings("unchecked")
186 @Override
187 protected void indexExperiment(final boolean waitForCompletion) {
188 if (waitForCompletion) {
189 TmfExperimentRangeUpdatedSignal signal = new TmfExperimentRangeUpdatedSignal(LTTngExperiment.this, LTTngExperiment.this,
190 TmfTimeRange.Eternity);
191 broadcast(signal);
192 while (isIndexingBusy()) {
193 try {
194 Thread.sleep(100);
195 } catch (InterruptedException e) {
196 e.printStackTrace();
197 }
198 }
199 ;
200 return;
201 }
202 for (ITmfTrace trace : fTraces) {
203 if (trace instanceof LTTngTrace) {
204 JniTrace jniTrace = ((LTTngTrace) trace).getCurrentJniTrace();
205 if (jniTrace != null && !jniTrace.isLiveTraceSupported()) {
206 updateTimeRange();
207 TmfExperimentRangeUpdatedSignal signal = new TmfExperimentRangeUpdatedSignal(LTTngExperiment.this, LTTngExperiment.this,
208 getTimeRange());
209 broadcast(signal);
210 return;
211 }
212 }
213 }
214 final Thread thread = new Thread("Streaming Monitor for " + getName()) { //$NON-NLS-1$
215 LttngTimestamp safeTimestamp = null;
216 TmfTimeRange timeRange = null;
82e04272 217
a79913eb
FC
218 @Override
219 public void run() {
220 while (!fExecutor.isShutdown()) {
221 final TmfEventRequest<LttngEvent> request = new TmfEventRequest<LttngEvent>(LttngEvent.class, TmfTimeRange.Eternity, 0,
222 ExecutionType.FOREGROUND) {
223 @Override
224 public void handleCompleted() {
225 super.handleCompleted();
226 if (isIndexingBusy()) {
227 timeRange = null;
228 return;
229 }
230 long startTime = Long.MAX_VALUE;
231 long endTime = Long.MIN_VALUE;
232 for (ITmfTrace trace : getTraces()) {
233 if (trace instanceof LTTngTrace) {
234 LTTngTrace lttngTrace = (LTTngTrace) trace;
235 JniTrace jniTrace = lttngTrace.getCurrentJniTrace();
236 jniTrace.updateTrace();
74237cc3 237 startTime = Math.min(startTime, lttngTrace.getStartTime().getValue());
a79913eb
FC
238 endTime = Math.max(endTime, jniTrace.getEndTime().getTime());
239 }
240 }
241 LttngTimestamp startTimestamp = new LttngTimestamp(startTime);
242 LttngTimestamp endTimestamp = new LttngTimestamp(endTime);
243 if (safeTimestamp != null && safeTimestamp.compareTo(getTimeRange().getEndTime(), false) > 0) {
244 timeRange = new TmfTimeRange(startTimestamp, safeTimestamp);
245 } else {
246 timeRange = null;
247 }
248 safeTimestamp = endTimestamp;
249 }
250 };
251 try {
252 sendRequest((ITmfDataRequest<T>) request);
253 request.waitForCompletion();
b626c6f7 254 if (timeRange != null && !timeRange.equals(TmfTimeRange.Null)) {
a79913eb
FC
255 TmfExperimentRangeUpdatedSignal signal = new TmfExperimentRangeUpdatedSignal(LTTngExperiment.this, LTTngExperiment.this,
256 timeRange);
257 broadcast(signal);
258 }
74237cc3 259 Thread.sleep(2000);
a79913eb
FC
260 } catch (InterruptedException e) {
261 e.printStackTrace();
262 }
263 }
264 }
265 };
266 thread.start();
267 }
268
269 @TmfSignalHandler
270 public void experimentRangeUpdated(TmfExperimentRangeUpdatedSignal signal) {
271 indexExperiment(false, (int) fNbEvents, signal.getRange());
272 }
273
274 /*
275 * (non-Javadoc)
276 *
277 * @see java.lang.Object#toString()
278 */
279 @Override
3b38ea61 280 @SuppressWarnings("nls")
a79913eb
FC
281 public String toString() {
282 return "[LTTngExperiment (" + getName() + ")]";
283 }
82e04272
FC
284
285}
This page took 0.038573 seconds and 5 git commands to generate.