/*******************************************************************************
- * Copyright (c) 2012 Ericsson
+ * Copyright (c) 2012, 2013 Ericsson, École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
- * Contributors: Matthew Khouzam - Initial API and implementation
+ * Contributors:
+ * Matthew Khouzam - Initial API and implementation
+ * Patrick Tasse - Updated for removal of context clone
+ * Geneviève Bastien - Added the createTimestamp function
*******************************************************************************/
package org.eclipse.linuxtools.tmf.core.ctfadaptor;
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.Map;
+
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.linuxtools.ctf.core.event.EventDeclaration;
-import org.eclipse.linuxtools.ctf.core.event.EventDefinition;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.linuxtools.ctf.core.event.CTFClock;
+import org.eclipse.linuxtools.ctf.core.event.IEventDeclaration;
import org.eclipse.linuxtools.ctf.core.trace.CTFReaderException;
import org.eclipse.linuxtools.ctf.core.trace.CTFTrace;
-import org.eclipse.linuxtools.tmf.core.component.TmfEventProvider;
-import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTimestamp.TimestampType;
-import org.eclipse.linuxtools.tmf.core.event.ITmfEventField;
-import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;
-import org.eclipse.linuxtools.tmf.core.event.TmfTimeRange;
-import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;
+import org.eclipse.linuxtools.ctf.core.trace.CTFTraceReader;
+import org.eclipse.linuxtools.internal.tmf.core.Activator;
+import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
-import org.eclipse.linuxtools.tmf.core.request.ITmfDataRequest;
-import org.eclipse.linuxtools.tmf.core.request.ITmfEventRequest;
-import org.eclipse.linuxtools.tmf.core.signal.TmfSignal;
-import org.eclipse.linuxtools.tmf.core.signal.TmfSignalManager;
-import org.eclipse.linuxtools.tmf.core.statesystem.IStateSystemQuerier;
+import org.eclipse.linuxtools.tmf.core.timestamp.ITmfTimestamp;
+import org.eclipse.linuxtools.tmf.core.timestamp.TmfTimestamp;
import org.eclipse.linuxtools.tmf.core.trace.ITmfContext;
-import org.eclipse.linuxtools.tmf.core.trace.ITmfLocation;
-import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;
+import org.eclipse.linuxtools.tmf.core.trace.ITmfEventParser;
+import org.eclipse.linuxtools.tmf.core.trace.ITmfTraceProperties;
+import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
+import org.eclipse.linuxtools.tmf.core.trace.indexer.ITmfPersistentlyIndexable;
+import org.eclipse.linuxtools.tmf.core.trace.indexer.ITmfTraceIndexer;
+import org.eclipse.linuxtools.tmf.core.trace.indexer.TmfBTreeTraceIndexer;
+import org.eclipse.linuxtools.tmf.core.trace.indexer.checkpoint.ITmfCheckpoint;
+import org.eclipse.linuxtools.tmf.core.trace.indexer.checkpoint.TmfCheckpoint;
+import org.eclipse.linuxtools.tmf.core.trace.location.ITmfLocation;
/**
+ * The CTf trace handler
+ *
+ * @version 1.0
+ * @author Matthew khouzam
*/
-public class CtfTmfTrace extends TmfEventProvider<CtfTmfEvent> implements ITmfTrace<CtfTmfEvent> {
+public class CtfTmfTrace extends TmfTrace
+ implements ITmfEventParser, ITmfTraceProperties, ITmfPersistentlyIndexable {
- // ------------------------------------------------------------------------
+ // -------------------------------------------
// Constants
- // ------------------------------------------------------------------------
-
- // ------------------------------------------------------------------------
- // Attributes
- // ------------------------------------------------------------------------
-
- // the Ctf Trace
- private CTFTrace fTrace;
-
- // The number of events collected
- protected long fNbEvents = 0;
-
- // The time span of the event stream
- private ITmfTimestamp fStartTime = TmfTimestamp.BIG_CRUNCH;
- private ITmfTimestamp fEndTime = TmfTimestamp.BIG_BANG;
-
- // The trace resource
- private IResource fResource;
+ // -------------------------------------------
+ /**
+ * Default cache size for CTF traces
+ */
+ protected static final int DEFAULT_CACHE_SIZE = 50000;
- /* Reference to the state system assigned to this trace */
- protected IStateSystemQuerier ss = null;
+ /*
+ * The Ctf clock unique identifier field
+ */
+ private static final String CLOCK_HOST_PROPERTY = "uuid"; //$NON-NLS-1$
- // ------------------------------------------------------------------------
- // Constructors
- // ------------------------------------------------------------------------
+ // -------------------------------------------
+ // Fields
+ // -------------------------------------------
- public CtfTmfTrace() {
- super();
- }
+ /* Reference to the CTF Trace */
+ private CTFTrace fTrace;
+ // -------------------------------------------
+ // TmfTrace Overrides
+ // -------------------------------------------
/**
* Method initTrace.
- * @param resource IResource
- * @param path String
- * @param eventType Class<CtfTmfEvent>
+ *
+ * @param resource
+ * The resource associated with this trace
+ * @param path
+ * The path to the trace file
+ * @param eventType
+ * The type of events that will be read from this trace
* @throws TmfTraceException
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#initTrace(IResource, String, Class<CtfTmfEvent>)
+ * If something when wrong while reading the trace
*/
@Override
- public void initTrace(final IResource resource, final String path, final Class<CtfTmfEvent> eventType)
+ public void initTrace(final IResource resource, final String path, final Class<? extends ITmfEvent> eventType)
throws TmfTraceException {
- EventDeclaration ed;
- ITmfEventField eventField;
- @SuppressWarnings("unused")
- CtfTmfEventType type;
+ /*
+ * Set the cache size. This has to be done before the call to super()
+ * because the super needs to know the cache size.
+ */
+ setCacheSize();
+
+ super.initTrace(resource, path, eventType);
- this.fResource = resource;
try {
this.fTrace = new CTFTrace(path);
- for( int i =0 ; i< this.fTrace.getNbEventTypes(); i++) {
- ed = this.fTrace.getEventType(i);
- eventField = parseDeclaration(ed);
- /*
- * Populate the event manager with event types that are there in
- * the beginning.
- */
- type = new CtfTmfEventType(ed.getName(), eventField);
- }
-
+ CtfIteratorManager.addTrace(this);
+ CtfTmfContext ctx;
/* Set the start and (current) end times for this trace */
- final CtfIterator iterator = new CtfIterator(this, 0, 0);
- if(iterator.getLocation().equals(CtfIterator.NULL_LOCATION)) {
+ ctx = (CtfTmfContext) seekEvent(0L);
+ CtfTmfEvent event = getNext(ctx);
+ if ((ctx.getLocation().equals(CtfIterator.NULL_LOCATION)) || (ctx.getCurrentEvent() == null)) {
/* Handle the case where the trace is empty */
this.setStartTime(TmfTimestamp.BIG_BANG);
} else {
- this.setStartTime(iterator.getCurrentEvent().getTimestamp());
- /*
- * is the trace empty
- */
- if( iterator.hasMoreEvents()){
- iterator.goToLastEvent();
- }
- this.setEndTime(iterator.getCurrentEvent().getTimestamp());
+ final ITmfTimestamp curTime = event.getTimestamp();
+ this.setStartTime(curTime);
+ this.setEndTime(curTime);
}
} catch (final CTFReaderException e) {
* was not found or was not recognized as a CTF trace. Throw into
* the new type of exception expected by the rest of TMF.
*/
- throw new TmfTraceException(e.getMessage());
- }
-
- TmfSignalManager.register(this);
- //FIXME This should be called via the ExperimentUpdated signal
- buildStateSystem();
-
- /* Refresh the project, so it can pick up new files that got created. */
- if ( resource != null) {
- try {
- resource.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
- } catch (CoreException e) {
- throw new TmfTraceException(e.getMessage());
- }
+ throw new TmfTraceException(e.getMessage(), e);
}
}
- private static ITmfEventField parseDeclaration(EventDeclaration ed) {
- EventDefinition eventDef = ed.createDefinition(null);
- return new CtfTmfContent(ITmfEventField.ROOT_FIELD_ID,
- CtfTmfEvent.parseFields(eventDef));
- }
-
- /**
- * Method dispose.
- * @see org.eclipse.linuxtools.tmf.core.component.ITmfComponent#dispose()
- */
- @Override
- public void dispose() {
- TmfSignalManager.deregister(this);
- }
-
- /**
- * Method broadcast.
- * @param signal TmfSignal
- * @see org.eclipse.linuxtools.tmf.core.component.ITmfComponent#broadcast(TmfSignal)
- */
@Override
- public void broadcast(final TmfSignal signal) {
- TmfSignalManager.dispatchSignal(signal);
+ public synchronized void dispose() {
+ CtfIteratorManager.removeTrace(this);
+ if (fTrace != null) {
+ fTrace.dispose();
+ fTrace = null;
+ }
+ super.dispose();
}
/**
* Method validate.
- * @param project IProject
- * @param path String
- * @return boolean
+ *
+ * @param project
+ * IProject
+ * @param path
+ * String
+ * @return IStatus IStatus.error or Status.OK_STATUS
* @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#validate(IProject, String)
+ * @since 2.0
*/
@Override
- public boolean validate(final IProject project, final String path) {
+ public IStatus validate(final IProject project, final String path) {
+ IStatus validTrace = Status.OK_STATUS;
try {
final CTFTrace temp = new CTFTrace(path);
- return temp.majortIsSet(); // random test
+ if (!temp.majortIsSet()) {
+ validTrace = new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.CtfTmfTrace_MajorNotSet);
+ } else {
+ CTFTraceReader ctfTraceReader = new CTFTraceReader(temp);
+ if (!ctfTraceReader.hasMoreEvents()) {
+ // TODO: This will need an additional check when we support live traces
+ // because having no event is valid for a live trace
+ validTrace = new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.CtfTmfTrace_NoEvent);
+ }
+ ctfTraceReader.dispose();
+ }
+ temp.dispose();
} catch (final CTFReaderException e) {
- /* Nope, not a CTF trace we can read */
- return false;
+ validTrace = new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.CtfTmfTrace_ReadingError +": " + e.toString()); //$NON-NLS-1$
+ } catch (final BufferOverflowException e){
+ validTrace = new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.CtfTmfTrace_ReadingError +": " + Messages.CtfTmfTrace_BufferOverflowErrorMessage); //$NON-NLS-1$
}
- }
-
- // ------------------------------------------------------------------------
- // Accessors
- // ------------------------------------------------------------------------
-
- /**
- * Method getEventType.
- * @return the trace path
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getEventType()
- */
- @Override
- public Class<CtfTmfEvent> getEventType() {
- return fType;
- }
-
- /**
- * Method getNbEnvVars.
- * @return int
- */
- public int getNbEnvVars() {
- return this.fTrace.getEnvironment().size();
- }
-
- /**
- * Method getEnvNames.
- * @return String[]
- */
- public String[] getEnvNames() {
- final String[] s = new String[getNbEnvVars()];
- return this.fTrace.getEnvironment().keySet().toArray(s);
+ return validTrace;
}
/**
- * Method getEnvValue.
- * @param key String
- * @return String
+ * Method getCurrentLocation. This is not applicable in CTF
+ *
+ * @return null, since the trace has no knowledge of the current location
+ * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getCurrentLocation()
+ * @since 3.0
*/
- public String getEnvValue(final String key) {
- return this.fTrace.getEnvironment().get(key);
+ @Override
+ public ITmfLocation getCurrentLocation() {
+ return null;
}
-
/**
-
- * @return the trace path * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getPath()
+ * @since 3.0
*/
@Override
- public String getPath() {
- return this.fTrace.getPath();
+ public double getLocationRatio(ITmfLocation location) {
+ final CtfLocation curLocation = (CtfLocation) location;
+ final CtfTmfContext context = new CtfTmfContext(this);
+ context.setLocation(curLocation);
+ context.seek(curLocation.getLocationInfo());
+ final CtfLocationInfo currentTime = ((CtfLocationInfo) context.getLocation().getLocationInfo());
+ final long startTime = getIterator(this, context).getStartTime();
+ final long endTime = getIterator(this, context).getEndTime();
+ return ((double) currentTime.getTimestamp() - startTime)
+ / (endTime - startTime);
}
/**
- * Method getName.
- * @return String
- * @see org.eclipse.linuxtools.tmf.core.component.ITmfComponent#getName()
+ * Method seekEvent.
+ *
+ * @param location
+ * ITmfLocation<?>
+ * @return ITmfContext
+ * @since 3.0
*/
@Override
- public String getName() {
- String traceName = (fResource != null) ? fResource.getName() : null;
- // If no resource was provided, extract the display name the trace path
- if (traceName == null) {
- final String path = this.fTrace.getPath();
- final int sep = path.lastIndexOf(IPath.SEPARATOR);
- traceName = (sep >= 0) ? path.substring(sep + 1) : path;
+ public synchronized ITmfContext seekEvent(final ITmfLocation location) {
+ CtfLocation currentLocation = (CtfLocation) location;
+ CtfTmfContext context = new CtfTmfContext(this);
+ if (fTrace == null) {
+ context.setLocation(null);
+ context.setRank(ITmfContext.UNKNOWN_RANK);
+ return context;
+ }
+ /*
+ * The rank is set to 0 if the iterator seeks the beginning. If not, it
+ * will be set to UNKNOWN_RANK, since CTF traces don't support seeking
+ * by rank for now.
+ */
+ if (currentLocation == null) {
+ currentLocation = new CtfLocation(new CtfLocationInfo(0L, 0L));
+ context.setRank(0);
+ }
+ if (currentLocation.getLocationInfo() == CtfLocation.INVALID_LOCATION) {
+ currentLocation = new CtfLocation(getEndTime().getValue() + 1, 0L);
+ }
+ context.setLocation(currentLocation);
+ if (location == null) {
+ CtfTmfEvent event = getIterator(this, context).getCurrentEvent();
+ if (event != null) {
+ currentLocation = new CtfLocation(event.getTimestamp().getValue(), 0);
+ }
}
- return traceName;
+ if (context.getRank() != 0) {
+ context.setRank(ITmfContext.UNKNOWN_RANK);
+ }
+ return context;
}
- /**
- * Method getCacheSize.
- * @return int
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getCacheSize()
- */
@Override
- public int getCacheSize() {
- return 50000; // not true, but it works
+ public synchronized ITmfContext seekEvent(double ratio) {
+ CtfTmfContext context = new CtfTmfContext(this);
+ if (fTrace == null) {
+ context.setLocation(null);
+ context.setRank(ITmfContext.UNKNOWN_RANK);
+ return context;
+ }
+ final long end = this.getEndTime().getValue();
+ final long start = this.getStartTime().getValue();
+ final long diff = end - start;
+ final long ratioTs = Math.round(diff * ratio) + start;
+ context.seek(ratioTs);
+ context.setRank(ITmfContext.UNKNOWN_RANK);
+ return context;
}
/**
- * Method getNbEvents.
- * @return long
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getNbEvents()
+ * Method readNextEvent.
+ *
+ * @param context
+ * ITmfContext
+ * @return CtfTmfEvent
+ * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getNext(ITmfContext)
*/
@Override
- public long getNbEvents() {
- return this.fNbEvents;
- }
+ public synchronized CtfTmfEvent getNext(final ITmfContext context) {
+ if (fTrace == null) {
+ return null;
+ }
+ CtfTmfEvent event = null;
+ if (context instanceof CtfTmfContext) {
+ if (context.getLocation() == null || CtfLocation.INVALID_LOCATION.equals(context.getLocation().getLocationInfo())) {
+ return null;
+ }
+ CtfTmfContext ctfContext = (CtfTmfContext) context;
+ event = ctfContext.getCurrentEvent();
- /**
- * Method getTimeRange.
- * @return TmfTimeRange
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getTimeRange()
- */
- @Override
- public TmfTimeRange getTimeRange() {
- return new TmfTimeRange(this.fStartTime, this.fEndTime);
+ if (event != null) {
+ updateAttributes(context, event.getTimestamp());
+ ctfContext.advance();
+ ctfContext.increaseRank();
+ }
+ }
+
+ return event;
}
/**
- * Method getStartTime.
- * @return ITmfTimestamp
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getStartTime()
+ * gets the CTFtrace that this is wrapping
+ *
+ * @return the CTF trace
*/
- @Override
- public ITmfTimestamp getStartTime() {
- return this.fStartTime;
+ public CTFTrace getCTFTrace() {
+ return fTrace;
}
/**
- * Method getEndTime.
- * @return ITmfTimestamp
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getEndTime()
+ * Ctf traces have a clock with a unique uuid that will be used to identify
+ * the host. Traces with the same clock uuid will be known to have been made
+ * on the same machine.
+ *
+ * Note: uuid is an optional field, it may not be there for a clock.
*/
@Override
- public ITmfTimestamp getEndTime() {
- return this.fEndTime;
+ public String getHostId() {
+ CTFClock clock = getCTFTrace().getClock();
+ if (clock != null) {
+ String clockHost = (String) clock.getProperty(CLOCK_HOST_PROPERTY);
+ if (clockHost != null) {
+ return clockHost;
+ }
+ }
+ return super.getHostId();
}
+ // -------------------------------------------
+ // ITmfTraceProperties
+ // -------------------------------------------
+
/**
- * Method getCurrentLocation. This is not applicable in CTF
- * @return null, since the trace has no knowledge of the current location
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getCurrentLocation()
+ * @since 2.0
*/
@Override
- public ITmfLocation<?> getCurrentLocation() {
- return null;
+ public Map<String, String> getTraceProperties() {
+ return Collections.unmodifiableMap(fTrace.getEnvironment());
}
- // ------------------------------------------------------------------------
- // Operators
- // ------------------------------------------------------------------------
+ // -------------------------------------------
+ // Clocks
+ // -------------------------------------------
/**
- * Method setTimeRange.
- * @param range TmfTimeRange
+ * gets the clock offset
+ *
+ * @return the clock offset in ns
*/
- protected void setTimeRange(final TmfTimeRange range) {
- this.fStartTime = range.getStartTime();
- this.fEndTime = range.getEndTime();
+ public long getOffset() {
+ if (fTrace != null) {
+ return fTrace.getOffset();
+ }
+ return 0;
}
/**
- * Method setStartTime.
- * @param startTime ITmfTimestamp
+ * Returns whether or not an event is in the metadata of the trace,
+ * therefore if it can possibly be in the trace. It does not verify whether
+ * or not the event is actually in the trace
+ *
+ * @param eventName
+ * The name of the event to check
+ * @return Whether the event is in the metadata or not
+ * @since 2.1
*/
- protected void setStartTime(final ITmfTimestamp startTime) {
- this.fStartTime = startTime;
+ public boolean hasEvent(final String eventName) {
+ Map<Long, IEventDeclaration> events = fTrace.getEvents(0L);
+ if (events != null) {
+ for (IEventDeclaration decl : events.values()) {
+ if (decl.getName().equals(eventName)) {
+ return true;
+ }
+ }
+ }
+ return false;
}
/**
- * Method setEndTime.
- * @param endTime ITmfTimestamp
+ * Return whether all requested events are in the metadata
+ *
+ * @param names
+ * The array of events to check for
+ * @return Whether all events are in the metadata
+ * @since 2.1
*/
- protected void setEndTime(final ITmfTimestamp endTime) {
- this.fEndTime = endTime;
+ public boolean hasAllEvents(String[] names) {
+ for (String name : names) {
+ if (!hasEvent(name)) {
+ return false;
+ }
+ }
+ return true;
}
- // ------------------------------------------------------------------------
- // TmfProvider
- // ------------------------------------------------------------------------
-
/**
- * Method armRequest.
- * @param request ITmfDataRequest<CtfTmfEvent>
- * @return ITmfContext
+ * Returns whether the metadata contains at least one of the requested
+ * events
+ *
+ * @param names
+ * The array of event names of check for
+ * @return Whether one of the event is present in trace metadata
+ * @since 2.1
*/
- @Override
- public ITmfContext armRequest(final ITmfDataRequest<CtfTmfEvent> request) {
- if ((request instanceof ITmfEventRequest<?>)
- && !TmfTimestamp.BIG_BANG
- .equals(((ITmfEventRequest<CtfTmfEvent>) request)
- .getRange().getStartTime())
- && (request.getIndex() == 0)) {
- final ITmfContext context = seekEvent(((ITmfEventRequest<CtfTmfEvent>) request)
- .getRange().getStartTime());
- ((ITmfEventRequest<CtfTmfEvent>) request)
- .setStartIndex((int) context.getRank());
- return context;
+ public boolean hasAtLeastOneOfEvents(String[] names) {
+ for (String name : names) {
+ if (hasEvent(name)) {
+ return true;
+ }
}
- return seekEvent(request.getIndex());
+ return false;
}
-// /**
-// * The trace reader keeps its own iterator: the "context" parameter here
-// * will be ignored.
-// *
-// * If you wish to specify a new context, instantiate a new CtfIterator and
-// * seek() it to where you want, and use that to read events.
-// *
-// * FIXME merge with getNextEvent below once they both use the same parameter
-// * type.
-// * @param context ITmfContext
-// * @return CtfTmfEvent
-// */
-// @Override
-// public CtfTmfEvent getNext(final ITmfContext context) {
-// return readNextEvent(context);
-// }
-
- // ------------------------------------------------------------------------
- // ITmfTrace
- // ------------------------------------------------------------------------
+ // -------------------------------------------
+ // Parser
+ // -------------------------------------------
- /**
- * Method seekEvent.
- * @param location ITmfLocation<?>
- * @return ITmfContext
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#seekEvent(ITmfLocation<?>)
- */
@Override
- public ITmfContext seekEvent(final ITmfLocation<?> location) {
- CtfLocation currentLocation = (CtfLocation) location;
- if (currentLocation == null) {
- currentLocation = new CtfLocation(0L);
- }
- CtfIterator context = new CtfIterator(this);
-
- if (currentLocation.getLocation() == CtfLocation.INVALID_LOCATION) {
- ((CtfTmfTimestamp) getEndTime()).setType(TimestampType.NANOS);
- currentLocation.setLocation(getEndTime().getValue() + 1);
+ public CtfTmfEvent parseEvent(ITmfContext context) {
+ CtfTmfEvent event = null;
+ if (context instanceof CtfTmfContext) {
+ final ITmfContext tmpContext = seekEvent(context.getLocation());
+ event = getNext(tmpContext);
}
- context.setLocation(currentLocation);
- context.setRank(ITmfContext.UNKNOWN_RANK);
- return context;
+ return event;
}
/**
- * Method getLocationRatio.
- * @param location ITmfLocation<?>
- * @return double
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getLocationRatio(ITmfLocation<?>)
+ * Sets the cache size for a CtfTmfTrace.
*/
- @Override
- public double getLocationRatio(final ITmfLocation<?> location) {
- final CtfLocation curLocation = (CtfLocation) location;
- CtfIterator iterator = new CtfIterator(this);
- iterator.seek(curLocation.getLocation());
- return ((double) iterator.getCurrentEvent().getTimestampValue() - iterator
- .getStartTime())
- / (iterator.getEndTime() - iterator.getStartTime());
+ protected void setCacheSize() {
+ setCacheSize(DEFAULT_CACHE_SIZE);
}
- /**
- * Method getStreamingInterval.
- * @return long
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getStreamingInterval()
- */
- @Override
- public long getStreamingInterval() {
- return 0;
- }
+ // -------------------------------------------
+ // Helpers
+ // -------------------------------------------
- /**
- * Method seekEvent.
- * @param timestamp ITmfTimestamp
- * @return ITmfContext
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#seekEvent(ITmfTimestamp)
- */
- @Override
- public ITmfContext seekEvent(final ITmfTimestamp timestamp) {
- CtfIterator context = new CtfIterator(this);
- context.seek(timestamp.getValue());
- context.setRank(ITmfContext.UNKNOWN_RANK);
- return context;
+ private static CtfIterator getIterator(CtfTmfTrace trace, CtfTmfContext context) {
+ return CtfIteratorManager.getIterator(trace, context);
}
/**
- * Seek by rank
- * @param rank long
- * @return ITmfContext
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#seekEvent(long)
+ * Get an iterator to the trace
+ *
+ * @return an iterator to the trace
+ * @since 2.0
*/
- @Override
- public ITmfContext seekEvent(final long rank) {
- CtfIterator context = new CtfIterator(this);
- context.seekRank(rank);
- context.setRank(rank);
- return context;
+ public CtfIterator createIterator() {
+ return new CtfIterator(this);
}
- /**
- * Seek rank ratio
- * @param ratio double
- * @return ITmfContext
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#seekEvent(double)
- */
- @Override
- public ITmfContext seekEvent(final double ratio) {
- CtfIterator context = new CtfIterator(this);
- context.seek((long) (this.fNbEvents * ratio));
- context.setRank(ITmfContext.UNKNOWN_RANK);
- return context;
- }
+ // ------------------------------------------------------------------------
+ // Timestamp transformation functions
+ // ------------------------------------------------------------------------
/**
- * Method readNextEvent.
- * @param context ITmfContext
- * @return CtfTmfEvent
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getNext(ITmfContext)
+ * @since 3.0
*/
@Override
- public CtfTmfEvent getNext(final ITmfContext context) {
- CtfTmfEvent event = null;
- if (context instanceof CtfIterator) {
- CtfIterator ctfIterator = (CtfIterator) context;
- event = ctfIterator.getCurrentEvent();
- ctfIterator.advance();
- }
- return event;
+ public CtfTmfTimestamp createTimestamp(long ts) {
+ return new CtfTmfTimestamp(getTimestampTransform().transform(ts));
}
- /**
- * Method getResource.
- * @return IResource
- * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getResource()
- */
+ private static int fCheckpointSize = -1;
+
@Override
- public IResource getResource() {
- return this.fResource;
- }
+ public synchronized int getCheckpointSize() {
+ if (fCheckpointSize == -1) {
+ TmfCheckpoint c = new TmfCheckpoint(new CtfTmfTimestamp(0), new CtfLocation(0, 0), 0);
+ ByteBuffer b = ByteBuffer.allocate(ITmfCheckpoint.MAX_SERIALIZE_SIZE);
+ b.clear();
+ c.serialize(b);
+ fCheckpointSize = b.position();
+ }
- /**
- * Method getStateSystem.
- * @return IStateSystemQuerier
- */
- public IStateSystemQuerier getStateSystem() {
- return this.ss;
+ return fCheckpointSize;
}
- /**
- * Method getCTFTrace.
- * @return CTFTrace
- */
- CTFTrace getCTFTrace() {
- return fTrace;
+ @Override
+ protected ITmfTraceIndexer createIndexer(int interval) {
+ return new TmfBTreeTraceIndexer(this, interval);
}
-
- /**
- * Suppressing the warning, because the 'throws' will usually happen in
- * sub-classes.
- * @throws TmfTraceException
- */
- @SuppressWarnings({ "static-method", "unused" })
- protected void buildStateSystem() throws TmfTraceException {
- /*
- * Nothing is done in the basic implementation, please specify
- * how/if to build a state system in derived classes.
- */
- return;
+ @Override
+ public ITmfLocation restoreLocation(ByteBuffer bufferIn) {
+ return new CtfLocation(bufferIn);
}
-
}