1 /*******************************************************************************
2 * Copyright (c) 2012 Ericsson
4 * All rights reserved. This program and the accompanying materials are made
5 * 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
9 * Contributors: Matthew Khouzam - Initial API and implementation
10 *******************************************************************************/
12 package org
.eclipse
.linuxtools
.tmf
.core
.ctfadaptor
;
14 import org
.eclipse
.core
.resources
.IProject
;
15 import org
.eclipse
.core
.resources
.IResource
;
16 import org
.eclipse
.core
.runtime
.CoreException
;
17 import org
.eclipse
.linuxtools
.ctf
.core
.trace
.CTFReaderException
;
18 import org
.eclipse
.linuxtools
.ctf
.core
.trace
.CTFTrace
;
19 import org
.eclipse
.linuxtools
.tmf
.core
.ctfadaptor
.CtfTmfTimestamp
.TimestampType
;
20 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfTimestamp
;
21 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
22 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimestamp
;
23 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.TmfTraceException
;
24 import org
.eclipse
.linuxtools
.tmf
.core
.statesystem
.IStateSystemQuerier
;
25 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfContext
;
26 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfEventParser
;
27 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.ITmfLocation
;
28 import org
.eclipse
.linuxtools
.tmf
.core
.trace
.TmfTrace
;
31 * The CTf trace handler
34 * @author Matthew khouzam
36 public class CtfTmfTrace
extends TmfTrace
implements ITmfEventParser
{
39 //-------------------------------------------
41 //-------------------------------------------
43 * Default cache size for CTF traces
45 protected static final int DEFAULT_CACHE_SIZE
= 50000;
47 //-------------------------------------------
49 //-------------------------------------------
51 /** Reference to the state system assigned to this trace */
52 protected IStateSystemQuerier ss
= null;
54 /* Reference to the CTF Trace */
55 private CTFTrace fTrace
;
59 //-------------------------------------------
61 //-------------------------------------------
66 * The resource associated with this trace
68 * The path to the trace file
70 * The type of events that will be read from this trace
71 * @throws TmfTraceException
72 * If something when wrong while reading the trace
75 public void initTrace(final IResource resource
, final String path
, final Class
<?
extends ITmfEvent
> eventType
)
76 throws TmfTraceException
{
78 * Set the cache size. This has to be done before the call to super()
79 * because the super needs to know the cache size.
82 super.initTrace(resource
, path
, eventType
);
84 @SuppressWarnings("unused")
88 this.fTrace
= new CTFTrace(path
);
89 CtfIteratorManager
.addTrace(this);
90 CtfTmfLightweightContext ctx
;
91 /* Set the start and (current) end times for this trace */
92 ctx
= new CtfTmfLightweightContext(this);
93 ctx
.setLocation(new CtfLocation(0L));
94 if(ctx
.getLocation().equals(CtfIterator
.NULL_LOCATION
)) {
95 /* Handle the case where the trace is empty */
96 this.setStartTime(TmfTimestamp
.BIG_BANG
);
98 final ITmfTimestamp curTime
= ctx
.getCurrentEvent().getTimestamp();
99 this.setStartTime(curTime
);
100 this.setEndTime(curTime
);
103 } catch (final CTFReaderException e
) {
105 * If it failed at the init(), we can assume it's because the file
106 * was not found or was not recognized as a CTF trace. Throw into
107 * the new type of exception expected by the rest of TMF.
109 throw new TmfTraceException(e
.getMessage(), e
);
112 //FIXME This should be called via the ExperimentUpdated signal
115 /* Refresh the project, so it can pick up new files that got created. */
116 if ( resource
!= null) {
118 resource
.getProject().refreshLocal(IResource
.DEPTH_INFINITE
, null);
119 } catch (CoreException e
) {
120 throw new TmfTraceException(e
.getMessage(), e
);
126 * @see org.eclipse.linuxtools.tmf.core.trace.TmfTrace#dispose()
129 public synchronized void dispose() {
130 CtfIteratorManager
.removeTrace(this);
136 * @param project IProject
139 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#validate(IProject, String)
142 public boolean validate(final IProject project
, final String path
) {
144 final CTFTrace temp
= new CTFTrace(path
);
145 return temp
.majortIsSet(); // random test
146 } catch (final CTFReaderException e
) {
147 /* Nope, not a CTF trace we can read */
153 * Method getCurrentLocation. This is not applicable in CTF
154 * @return null, since the trace has no knowledge of the current location
155 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getCurrentLocation()
158 public ITmfLocation
<?
> getCurrentLocation() {
165 public double getLocationRatio(ITmfLocation
<?
> location
) {
166 final CtfLocation curLocation
= (CtfLocation
) location
;
167 final CtfTmfLightweightContext context
= new CtfTmfLightweightContext(this);
168 context
.setLocation(curLocation
);
169 context
.seek(curLocation
.getLocation());
170 final long currentTime
= ((Long
)context
.getLocation().getLocation());
171 final long startTime
= getIterator(this, context
).getStartTime();
172 final long endTime
= getIterator(this, context
).getEndTime();
173 return ((double) currentTime
- startTime
)
174 / (endTime
- startTime
);
182 * @see org.eclipse.linuxtools.tmf.core.trace.TmfTrace#seekEvent(org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp)
185 public synchronized ITmfContext
seekEvent(ITmfTimestamp timestamp
) {
186 if( timestamp
instanceof CtfTmfTimestamp
){
187 CtfTmfLightweightContext iter
= new CtfTmfLightweightContext(this);
188 iter
.seek(timestamp
.getValue());
191 return super.seekEvent(timestamp
);
196 * @param location ITmfLocation<?>
197 * @return ITmfContext
200 public ITmfContext
seekEvent(final ITmfLocation
<?
> location
) {
201 CtfLocation currentLocation
= (CtfLocation
) location
;
202 CtfTmfLightweightContext context
= new CtfTmfLightweightContext(this);
204 * The rank is set to 0 if the iterator seeks the beginning. If not, it
205 * will be set to UNKNOWN_RANK, since CTF traces don't support seeking
208 if (currentLocation
== null) {
209 currentLocation
= new CtfLocation(0L);
212 if (currentLocation
.getLocation() == CtfLocation
.INVALID_LOCATION
) {
213 ((CtfTmfTimestamp
) getEndTime()).setType(TimestampType
.NANOS
);
214 currentLocation
.setLocation(getEndTime().getValue() + 1);
216 context
.setLocation(currentLocation
);
217 if(context
.getRank() != 0) {
218 context
.setRank(ITmfContext
.UNKNOWN_RANK
);
225 public ITmfContext
seekEvent(double ratio
) {
226 CtfTmfLightweightContext context
= new CtfTmfLightweightContext(this);
227 context
.seek((long) (this.getNbEvents() * ratio
));
228 context
.setRank(ITmfContext
.UNKNOWN_RANK
);
233 * Method readNextEvent.
234 * @param context ITmfContext
235 * @return CtfTmfEvent
236 * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getNext(ITmfContext)
239 public synchronized CtfTmfEvent
getNext(final ITmfContext context
) {
240 CtfTmfEvent event
= null;
241 if (context
instanceof CtfTmfLightweightContext
) {
242 if (CtfLocation
.INVALID_LOCATION
.equals(context
.getLocation().getLocation())) {
245 CtfTmfLightweightContext ctfContext
= (CtfTmfLightweightContext
) context
;
246 event
= ctfContext
.getCurrentEvent();
249 updateAttributes(context
, event
.getTimestamp());
250 ctfContext
.advance();
251 ctfContext
.increaseRank();
259 * Suppressing the warning, because the 'throws' will usually happen in
262 * @throws TmfTraceException
264 @SuppressWarnings("unused")
265 protected void buildStateSystem() throws TmfTraceException
{
267 * Nothing is done in the basic implementation, please specify
268 * how/if to build a state system in derived classes.
274 * Method getStateSystem.
276 * @return IStateSystemQuerier
278 public IStateSystemQuerier
getStateSystem() {
283 * gets the CTFtrace that this is wrapping
284 * @return the CTF trace
286 public CTFTrace
getCTFTrace() {
291 //-------------------------------------------
292 // Environment Parameters
293 //-------------------------------------------
295 * Method getNbEnvVars.
299 public int getNbEnvVars() {
300 return this.fTrace
.getEnvironment().size();
304 * Method getEnvNames.
308 public String
[] getEnvNames() {
309 final String
[] s
= new String
[getNbEnvVars()];
310 return this.fTrace
.getEnvironment().keySet().toArray(s
);
314 * Method getEnvValue.
320 public String
getEnvValue(final String key
) {
321 return this.fTrace
.getEnvironment().get(key
);
324 //-------------------------------------------
326 //-------------------------------------------
329 * gets the clock offset
330 * @return the clock offset in ns
332 public long getOffset(){
333 if( fTrace
!= null ) {
334 return fTrace
.getOffset();
339 //-------------------------------------------
341 //-------------------------------------------
344 public CtfTmfEvent
parseEvent(ITmfContext context
) {
345 CtfTmfEvent event
= null;
346 if( context
instanceof CtfTmfLightweightContext
){
347 CtfTmfLightweightContext itt
= (CtfTmfLightweightContext
) context
.clone();
348 event
= itt
.getCurrentEvent();
354 * Sets the cache size for a CtfTmfTrace.
356 protected void setCacheSize() {
357 setCacheSize(DEFAULT_CACHE_SIZE
);
360 //-------------------------------------------
362 //-------------------------------------------
364 private static CtfIterator
getIterator(CtfTmfTrace trace
, CtfTmfLightweightContext context
) {
365 return CtfIteratorManager
.getIterator(trace
, context
);