tmf: Move timestamps to their own package
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core / src / org / eclipse / linuxtools / tmf / core / ctfadaptor / CtfTmfTrace.java
index 33f0ba457dc033ace485e34af54f40b618c4fb71..c7981f683a866afbfaa3062619cf6f1adc0d164f 100644 (file)
@@ -1,40 +1,38 @@
 /*******************************************************************************
- * Copyright (c) 2012 Ericsson
+ * Copyright (c) 2012, 2013 Ericsson
  *
  * 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
  *******************************************************************************/
 
-
 package org.eclipse.linuxtools.tmf.core.ctfadaptor;
 
-import java.util.ArrayList;
-import java.util.ListIterator;
-
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
 import org.eclipse.linuxtools.ctf.core.trace.CTFReaderException;
 import org.eclipse.linuxtools.ctf.core.trace.CTFTrace;
-import org.eclipse.linuxtools.tmf.core.ctfadaptor.CtfTmfTimestamp.TimestampType;
-import org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp;
-import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;
+import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
 import org.eclipse.linuxtools.tmf.core.exceptions.TmfTraceException;
-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.ITmfEventParser;
 import org.eclipse.linuxtools.tmf.core.trace.ITmfLocation;
 import org.eclipse.linuxtools.tmf.core.trace.TmfTrace;
 
 /**
- * @author Matthew Khouzam
- * A trace type that reads CTF.
+ * The CTf trace handler
+ *
+ * @version 1.0
+ * @author Matthew khouzam
  */
-public class CtfTmfTrace extends TmfTrace<CtfTmfEvent> implements ITmfEventParser<CtfTmfEvent>{
+public class CtfTmfTrace extends TmfTrace implements ITmfEventParser {
 
 
     //-------------------------------------------
@@ -44,66 +42,57 @@ public class CtfTmfTrace extends TmfTrace<CtfTmfEvent> implements ITmfEventParse
      * Default cache size for CTF traces
      */
     protected static final int DEFAULT_CACHE_SIZE = 50000;
-    private static final int ITER_POOL_SIZE = 128;
 
     //-------------------------------------------
     //        Fields
     //-------------------------------------------
 
-    /** Reference to the state system assigned to this trace */
-    protected IStateSystemQuerier ss = null;
-
     /* Reference to the CTF Trace */
     private CTFTrace fTrace;
 
-    /*
-     * The iterator pool. This is a necessary change since larger traces will
-     * need many contexts and each context must have to a file pointer. Since
-     * the OS supports only so many handles on a given file, but the UI must
-     * still be responsive, parallel seeks (up to ITER_POOL_SIZE requests)
-     * can be made with a fast response time.
-     * */
-    private ArrayList<CtfIterator> fIterators;
-    private ListIterator<CtfIterator> nextIter;
+
 
     //-------------------------------------------
     //        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
+     *             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 {
         /*
          * 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);
 
         @SuppressWarnings("unused")
         CtfTmfEventType type;
 
         try {
             this.fTrace = new CTFTrace(path);
-            fIterators = new ArrayList<CtfIterator>(ITER_POOL_SIZE);
-            for(int i = 0 ; i < ITER_POOL_SIZE; i++){
-                fIterators.add(new CtfIterator(this, 0, 0));
-            }
-            nextIter = fIterators.listIterator(0);
+            CtfIteratorManager.addTrace(this);
+            CtfTmfContext ctx;
             /* Set the start and (current) end times for this trace */
-            final CtfIterator iterator = getIterator();
-            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());
-                this.setEndTime(iterator.getCurrentEvent().getTimestamp());
+                final ITmfTimestamp curTime = event.getTimestamp();
+                this.setStartTime(curTime);
+                this.setEndTime(curTime);
             }
 
         } catch (final CTFReaderException e) {
@@ -115,17 +104,20 @@ public class CtfTmfTrace extends TmfTrace<CtfTmfEvent> implements ITmfEventParse
             throw new TmfTraceException(e.getMessage(), e);
         }
 
-        //FIXME This should be called via the ExperimentUpdated signal
-        buildStateSystem();
+        super.initTrace(resource, path, eventType);
+    }
 
-        /* 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(), e);
-            }
+    /* (non-Javadoc)
+     * @see org.eclipse.linuxtools.tmf.core.trace.TmfTrace#dispose()
+     */
+    @Override
+    public synchronized void dispose() {
+        CtfIteratorManager.removeTrace(this);
+        if (fTrace != null) {
+            fTrace.dispose();
+            fTrace = null;
         }
+        super.dispose();
     }
 
     /**
@@ -139,7 +131,9 @@ public class CtfTmfTrace extends TmfTrace<CtfTmfEvent> implements ITmfEventParse
     public boolean validate(final IProject project, final String path) {
         try {
             final CTFTrace temp = new CTFTrace(path);
-            return temp.majortIsSet(); // random test
+            boolean valid = temp.majortIsSet(); // random test
+            temp.dispose();
+            return valid;
         } catch (final CTFReaderException e) {
             /* Nope, not a CTF trace we can read */
             return false;
@@ -152,46 +146,21 @@ public class CtfTmfTrace extends TmfTrace<CtfTmfEvent> implements ITmfEventParse
      * @see org.eclipse.linuxtools.tmf.core.trace.ITmfTrace#getCurrentLocation()
      */
     @Override
-    public ITmfLocation<?> getCurrentLocation() {
+    public ITmfLocation getCurrentLocation() {
         return null;
     }
 
-
-
     @Override
-    public double getLocationRatio(ITmfLocation<?> location) {
+    public double getLocationRatio(ITmfLocation location) {
         final CtfLocation curLocation = (CtfLocation) location;
-        CtfIterator iterator = getIterator();
-        CtfTmfLightweightContext ctx = new CtfTmfLightweightContext(fIterators, nextIter);
-        ctx.setLocation(curLocation);
-        ctx.seek(curLocation.getLocation());
-        long currentTime = ((Long)ctx.getLocation().getLocation());
-
-        return ((double) currentTime - iterator.getStartTime())
-                / (iterator.getEndTime() - iterator.getStartTime());
-    }
-
-    /**
-     * @return
-     */
-    private CtfIterator getIterator() {
-        if( !nextIter.hasNext()){
-            nextIter = fIterators.listIterator(0);
-        }
-        return nextIter.next();
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.linuxtools.tmf.core.trace.TmfTrace#seekEvent(org.eclipse.linuxtools.tmf.core.event.ITmfTimestamp)
-     */
-    @Override
-    public synchronized ITmfContext seekEvent(ITmfTimestamp timestamp) {
-        if( timestamp instanceof CtfTmfTimestamp){
-            CtfTmfLightweightContext iter = new CtfTmfLightweightContext(fIterators, nextIter);
-            iter.seek(timestamp.getValue());
-            return iter;
-        }
-        return super.seekEvent(timestamp);
+        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);
     }
 
     /**
@@ -200,23 +169,33 @@ public class CtfTmfTrace extends TmfTrace<CtfTmfEvent> implements ITmfEventParse
      * @return ITmfContext
      */
     @Override
-    public ITmfContext seekEvent(final ITmfLocation<?> location) {
+    public synchronized ITmfContext seekEvent(final ITmfLocation location) {
         CtfLocation currentLocation = (CtfLocation) location;
-        CtfTmfLightweightContext context = new CtfTmfLightweightContext(fIterators, nextIter);
+        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(0L);
+            currentLocation = new CtfLocation(new CtfLocationInfo(0L, 0L));
             context.setRank(0);
         }
-        if (currentLocation.getLocation() == CtfLocation.INVALID_LOCATION) {
-            ((CtfTmfTimestamp) getEndTime()).setType(TimestampType.NANOS);
-            currentLocation.setLocation(getEndTime().getValue() + 1);
+        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);
+            }
+        }
         if(context.getRank() != 0) {
             context.setRank(ITmfContext.UNKNOWN_RANK);
         }
@@ -225,9 +204,18 @@ public class CtfTmfTrace extends TmfTrace<CtfTmfEvent> implements ITmfEventParse
 
 
     @Override
-    public ITmfContext seekEvent(double ratio) {
-        CtfTmfLightweightContext context = new CtfTmfLightweightContext(fIterators, nextIter);
-        context.seek((long) (this.getNbEvents() * ratio));
+    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;
     }
@@ -240,9 +228,15 @@ public class CtfTmfTrace extends TmfTrace<CtfTmfEvent> implements ITmfEventParse
      */
     @Override
     public synchronized CtfTmfEvent getNext(final ITmfContext context) {
+        if (fTrace == null) {
+            return null;
+        }
         CtfTmfEvent event = null;
-        if (context instanceof CtfTmfLightweightContext) {
-            CtfTmfLightweightContext ctfContext = (CtfTmfLightweightContext) context;
+        if (context instanceof CtfTmfContext) {
+            if (context.getLocation() == null || CtfLocation.INVALID_LOCATION.equals(context.getLocation().getLocationInfo())) {
+                return null;
+            }
+            CtfTmfContext ctfContext = (CtfTmfContext) context;
             event = ctfContext.getCurrentEvent();
 
             if (event != null) {
@@ -255,29 +249,6 @@ public class CtfTmfTrace extends TmfTrace<CtfTmfEvent> implements ITmfEventParse
         return event;
     }
 
-    /**
-     * Suppressing the warning, because the 'throws' will usually happen in
-     * sub-classes.
-     * @throws TmfTraceException
-     */
-    @SuppressWarnings({ "static-method" })
-    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;
-    }
-
-    /**
-     * Method getStateSystem.
-     *
-     * @return IStateSystemQuerier
-     */
-    public IStateSystemQuerier getStateSystem() {
-        return this.ss;
-    }
-
     /**
      * gets the CTFtrace that this is wrapping
      * @return the CTF trace
@@ -342,9 +313,9 @@ public class CtfTmfTrace extends TmfTrace<CtfTmfEvent> implements ITmfEventParse
     @Override
     public CtfTmfEvent parseEvent(ITmfContext context) {
         CtfTmfEvent event = null;
-        if( context instanceof CtfTmfLightweightContext ){
-            CtfTmfLightweightContext itt = (CtfTmfLightweightContext) context.clone();
-            event = itt.getCurrentEvent();
+        if (context instanceof CtfTmfContext) {
+            final ITmfContext tmpContext = seekEvent(context.getLocation());
+            event = getNext(tmpContext);
         }
         return event;
     }
@@ -356,4 +327,21 @@ public class CtfTmfTrace extends TmfTrace<CtfTmfEvent> implements ITmfEventParse
         setCacheSize(DEFAULT_CACHE_SIZE);
     }
 
+    //-------------------------------------------
+    //          Helpers
+    //-------------------------------------------
+
+    private static CtfIterator getIterator(CtfTmfTrace trace,  CtfTmfContext context) {
+        return CtfIteratorManager.getIterator(trace, context);
+    }
+
+    /**
+     * Get an iterator to the trace
+     *
+     * @return an iterator to the trace
+     * @since 2.0
+     */
+    public CtfIterator createIterator(){
+        return new CtfIterator(this);
+    }
 }
This page took 0.030774 seconds and 5 git commands to generate.