May 31
authorAlvaro Sanchez-Leon <alvsan09@gmail.com>
Mon, 31 May 2010 19:40:01 +0000 (19:40 +0000)
committerAlvaro Sanchez-Leon <alvsan09@gmail.com>
Mon, 31 May 2010 19:40:01 +0000 (19:40 +0000)
Commit large TMF patch as base
+ Introduction of partial and complete (large) data requests
+ Others

Commit lttng impacts from TMF re-structure
+ State system checkpoints build on the new common data requests

55 files changed:
org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/control/LTTngSyntheticEventProviderTest.java
org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/model/LTTngTreeNodeTest.java
org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/state/resource/LTTngStateResourceTest.java
org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/tests/state/StateManagerFactoryTestSupport.java
org.eclipse.linuxtools.lttng.ui.tests/stubs/org/eclipse/linuxtools/lttng/stubs/LTTngTraceStub.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/common/AbsTimeUpdateView.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/ControlFlowView.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/histogram/HistogramCanvasMouseListener.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/histogram/HistogramView.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/project/ProjectView.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/ResourcesView.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/evProcessor/ResourcesEventToHandlerFactory.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/statistics/StatisticsView.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/statistics/evProcessor/StatsTimeCountHandlers.java
org.eclipse.linuxtools.lttng/.options [new file with mode: 0644]
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/control/LttngSyntheticEventProvider.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/event/LttngEvent.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/event/LttngEventContent.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/event/LttngSyntheticEvent.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/model/LTTngTreeNode.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/model/LTTngTreeNodeGeneric.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/request/LttngSyntEventRequest.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/evProcessor/state/AbsStateUpdate.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/experiment/IStateExperimentManager.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/experiment/StateExperimentManager.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/experiment/StateManagerFactory.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/resource/LTTngStateResource.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/trace/IStateTraceManager.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/state/trace/StateTraceManager.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTextTrace.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/trace/LTTngTrace.java
org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/TmfExperimentTest.java
org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/TmfMultiTraceExperimentTest.java
org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfContextTest.java
org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfExperimentTest.java
org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfTraceTest.java
org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfSyntheticEventProviderStub.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/TmfEventsView.java
org.eclipse.linuxtools.tmf/.options
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/Tracer.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/ITmfDataProvider.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfComponent.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/component/TmfDataProvider.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/event/TmfTimeRange.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/experiment/TmfExperiment.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/ITmfDataRequest.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/TmfCoalescedEventRequest.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/TmfDataRequest.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/request/TmfRequestExecutor.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/signal/TmfSignalManager.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfContext.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/ITmfTrace.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfCheckpoint.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfContext.java
org.eclipse.linuxtools.tmf/src/org/eclipse/linuxtools/tmf/trace/TmfTrace.java

index a2621bbe0568af80c22bc929657b8b80b4772013..c7fdd476d0b1e5e763d690ef353f8fd5be418dd3 100644 (file)
@@ -60,7 +60,7 @@ public class LTTngSyntheticEventProviderTest extends LttngTestPreparation {
                // experiment selected, build experiment selection context and trigger
                // check point creation
                expManager.experimentSelected_prep(experiment);
-               // Action trigger
+               // buils check points in parallel
                expManager.experimentSelected(this, experiment);
 
                // Obtain the singleton event provider
index 87e68dd60545806f0e00bc32318caae6271ead0d..472199f27fb7dc95672a2a5b4f68ed1be35bb43a 100644 (file)
@@ -42,6 +42,7 @@ public class LTTngTreeNodeTest extends TestCase {
        /* (non-Javadoc)
         * @see junit.framework.TestCase#setUp()
         */
+       @Override
        protected void setUp() throws Exception {
                super.setUp();
                // Create state resources and assign a parent
@@ -86,6 +87,7 @@ public class LTTngTreeNodeTest extends TestCase {
        /* (non-Javadoc)
         * @see junit.framework.TestCase#tearDown()
         */
+       @Override
        protected void tearDown() throws Exception {
                super.tearDown();
        }
index c538e95a0b301f3c64d4aca252718059da697afb..be0d1e810018c94ec269d7356776f915ebc0bbef 100644 (file)
@@ -52,6 +52,7 @@ public class LTTngStateResourceTest extends TestCase {
        /* (non-Javadoc)
         * @see junit.framework.TestCase#setUp()
         */
+       @Override
        protected void setUp() throws Exception {
                super.setUp();
                context = getContext();
@@ -124,6 +125,7 @@ public class LTTngStateResourceTest extends TestCase {
        /* (non-Javadoc)
         * @see junit.framework.TestCase#tearDown()
         */
+       @Override
        protected void tearDown() throws Exception {
                super.tearDown();
        }
index b1b9e9569cbf4f2ec21482783586a3e2be7b42e0..c2b2db70636cb62ab588aa2847051a52f853b3dd 100644 (file)
@@ -19,8 +19,6 @@ import org.eclipse.linuxtools.lttng.control.LttngCoreProviderFactory;
 import org.eclipse.linuxtools.lttng.event.LttngSyntheticEvent;
 import org.eclipse.linuxtools.lttng.model.LTTngTreeNode;
 import org.eclipse.linuxtools.lttng.state.LttngStateException;
-import org.eclipse.linuxtools.lttng.state.model.LttngTraceState;
-import org.eclipse.linuxtools.lttng.state.model.StateModelFactory;
 import org.eclipse.linuxtools.lttng.state.trace.IStateTraceManager;
 import org.eclipse.linuxtools.lttng.state.trace.StateTraceManager;
 import org.eclipse.linuxtools.tmf.component.TmfEventProvider;
@@ -57,7 +55,8 @@ public class StateManagerFactoryTestSupport {
                        return instanceBook.get(traceUniqueId);
                }
 
-               LttngTraceState traceModel = StateModelFactory.getStateEntryInstance();
+               // LttngTraceState traceModel =
+               // StateModelFactory.getStateEntryInstance();
                IStateTraceManager manager = null;
 
                if (feventProvider == null) {
@@ -69,9 +68,7 @@ public class StateManagerFactoryTestSupport {
                LTTngTreeNode parent = null;
 
                try {
-                       manager = new StateTraceManager(id, parent, traceUniqueId, trace,
-                                       traceModel,
-                                       feventProvider);
+                       manager = new StateTraceManager(id, parent, traceUniqueId, trace, feventProvider);
                } catch (LttngStateException e) {
                        e.printStackTrace();
                }
index 3395776f44cefbc275b070b0d10d4c5ab0c1e587..91ba9941e59044281be4eeffa15c03ebfdcfb88a 100644 (file)
@@ -65,7 +65,7 @@ public class LTTngTraceStub extends TmfTrace<LttngEvent> {
         super(filename, LttngEvent.class, filename, cacheSize);
         fTrace = new RandomAccessFile(filename, "r");
        fParser = new LTTngEventParserStub();
-       indexTrace(true);
+//     indexTrace(true);
     }
     
        public ITmfTrace createTraceCopy() {
index 58b8e65258bf34b55a959d0981fa2de6385d47fe..5870292a31bbac9fe1eb3c8ccc54166ea7bb4ab4 100644 (file)
@@ -347,6 +347,7 @@ public abstract class AbsTimeUpdateView extends TmfView implements
                         * org.eclipse.linuxtools.lttng.request.LttngSyntEventRequest#handleData
                         * ()
                         */
+                       @Override
                        public void handleData() {
                                TmfEvent[] result = getData();
        
@@ -385,6 +386,7 @@ public abstract class AbsTimeUpdateView extends TmfView implements
                                notifyStarting();
                        }
        
+                       @Override
                        public void handleCompleted() {
                                super.handleCompleted();
 
index db480780a322716f327f1ae6e3d2b68c8a985d22..342fb026ec60e25f292f00330721c21d4147e6df 100644 (file)
@@ -836,6 +836,7 @@ public class ControlFlowView extends AbsTimeUpdateView implements
         * (org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeSelectionEvent
         * )
         */
+       @Override
        public void tsfTmProcessSelEvent(TmfTimeSelectionEvent event) {
                // common implementation
                super.tsfTmProcessSelEvent(event);
@@ -855,6 +856,7 @@ public class ControlFlowView extends AbsTimeUpdateView implements
         * #tsfTmProcessTimeScaleEvent(org.eclipse.linuxtools
         * .tmf.ui.viewers.timeAnalysis.TmfTimeScaleSelectionEvent)
         */
+       @Override
        public synchronized void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event) {
                super.tsfTmProcessTimeScaleEvent(event);
        }
@@ -878,6 +880,7 @@ public class ControlFlowView extends AbsTimeUpdateView implements
         * ITmfTimeAnalysisEntry[], long, long, boolean, long, long,
         * java.lang.Object)
         */
+       @Override
        public void displayModel(final ITmfTimeAnalysisEntry[] items,
                        final long startBoundTime, final long endBoundTime,
                        final boolean updateTimeBounds, final long startVisibleWindow,
@@ -973,6 +976,7 @@ public class ControlFlowView extends AbsTimeUpdateView implements
         * 
         * @param signal
         */
+       @Override
        @TmfSignalHandler
        public void synchToTime(TmfTimeSynchSignal signal) {
                super.synchToTime(signal);
index 7c06cd6ae0e3429de6d5bcc6fb37361f33832e44..c27715bcf49542e15d60bb5e50d3b0d7b64df7c3 100644 (file)
@@ -83,7 +83,7 @@ public class HistogramCanvasMouseListener implements MouseMoveListener, MouseLis
         * @param event  The generated mouse event when the mouse double-click was issued.
         */
        public void mouseDoubleClick(MouseEvent event) {
-               System.out.println("mouseDoubleClick");
+//             System.out.println("mouseDoubleClick");
        }
        
        /**
index 25df24c23a41bd46a7e8a3f9582afa7fd0d540f7..48d73aec04f25e63597e82b05862e11919cd7475 100644 (file)
@@ -13,6 +13,8 @@ package org.eclipse.linuxtools.lttng.ui.views.histogram;
 
 import org.eclipse.linuxtools.lttng.event.LttngEvent;
 import org.eclipse.linuxtools.lttng.event.LttngTimestamp;
+import org.eclipse.linuxtools.tmf.component.ITmfDataProvider.ExecutionType;
+import org.eclipse.linuxtools.tmf.event.TmfEvent;
 import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
 import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
 import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
@@ -21,6 +23,8 @@ import org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal;
 import org.eclipse.linuxtools.tmf.signal.TmfRangeSynchSignal;
 import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
 import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal;
+import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
+import org.eclipse.linuxtools.tmf.trace.TmfContext;
 import org.eclipse.linuxtools.tmf.ui.views.TmfView;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ControlEvent;
@@ -506,17 +510,20 @@ public class HistogramView extends TmfView implements ControlListener {
        // Save the experiment we are about to use
        lastUsedExperiment = newExperiment;
        
-       // Create a copy of the trace that will be use only by the full experiment request
-       TmfExperiment<LttngEvent> experimentCopy = newExperiment.createTraceCopy();
+//     // Create a copy of the trace that will be use only by the full experiment request
+//     TmfExperiment<LttngEvent> experimentCopy = newExperiment.createTraceCopy();
        
        // Create the content for the full experiment. 
        // This NEED to be created first, as we use it in the selectedWindowCanvas
                fullExperimentCanvas.createNewHistogramContent(fullExperimentCanvas.getSize().x, FULL_TRACE_BAR_WIDTH, FULL_TRACE_CANVAS_HEIGHT, FULL_TRACE_DIFFERENCE_TO_AVERAGE);
                fullExperimentCanvas.createNewSelectedWindow(DEFAULT_WINDOW_SIZE);
-               currentEventTime = newExperiment.getStartTime().getValue();
-       // Set the window of the fullTrace canvas visible.
+
+               TmfTimeRange timeRange = getExperimentTimeRange(newExperiment);
+               currentEventTime = timeRange.getStartTime().getValue();
+
+               // Set the window of the fullTrace canvas visible.
                fullExperimentCanvas.getCurrentWindow().setSelectedWindowVisible(true);
-               fullExperimentCanvas.getHistogramContent().resetTable(newExperiment.getStartTime().getValue(), newExperiment.getEndTime().getValue());
+               fullExperimentCanvas.getHistogramContent().resetTable(timeRange.getStartTime().getValue(), timeRange.getEndTime().getValue());
                
                // Create the content for the selected window. 
                selectedWindowCanvas.createNewHistogramContent(selectedWindowCanvas.getSize().x ,SELECTED_WINDOW_BAR_WIDTH, SELECTED_WINDOW_CANVAS_HEIGHT, SELECTED_WINDOW_DIFFERENCE_TO_AVERAGE);
@@ -539,9 +546,34 @@ public class HistogramView extends TmfView implements ControlListener {
                // Perform both request. 
                // Order is important here, the small/synchronous request for the selection window should go first
                performSelectedWindowEventsRequest(newExperiment);
-               performAllTraceEventsRequest(experimentCopy);
+//             performAllTraceEventsRequest(experimentCopy);
+               performAllTraceEventsRequest(newExperiment);
     }
-    
+
+       // Before completing its indexing, the experiment doesn't know start/end time.
+       // However, LTTng individual traces have this knowledge so we should ask them
+       // directly.
+    private TmfTimeRange getExperimentTimeRange(TmfExperiment<LttngEvent> experiment) {
+       // Before completing its indexing, the experiment doesn't know start/end time.
+       // However, LTTng individual traces have this knowledge so we should ask them
+       // directly.
+               TmfTimestamp startTime = TmfTimestamp.BigCrunch;
+               TmfTimestamp endTime   = TmfTimestamp.BigBang;
+               for (ITmfTrace trace : experiment.getTraces()) {
+                       TmfContext context = trace.seekLocation(null);
+                       context.setRank(0);
+                       TmfEvent event = trace.getNextEvent(context);
+                       TmfTimestamp traceStartTime = event.getTimestamp();
+                       if (traceStartTime.compareTo(startTime, true) < 0)
+                               startTime = traceStartTime;
+                       TmfTimestamp traceEndTime = trace.getEndTime();
+                       if (traceEndTime.compareTo(endTime, true) > 0)
+                               endTime = traceEndTime;
+       }
+        TmfTimeRange tmpRange = new TmfTimeRange(startTime, endTime);
+        return tmpRange;
+    }
+
     /**
      * Perform a new request for the Selection window.<p>
      * This assume the full experiment canvas has correct information about the selected window; 
@@ -553,7 +585,7 @@ public class HistogramView extends TmfView implements ControlListener {
        
        HistogramSelectedWindow curSelectedWindow = fullExperimentCanvas.getCurrentWindow();
        
-       // If no selection window exists, we will try to cerate one; 
+       // If no selection window exists, we will try to create one; 
        //      however this will most likely fail as the content is probably not created either
        if ( curSelectedWindow == null ) {
                fullExperimentCanvas.createNewSelectedWindow( DEFAULT_WINDOW_SIZE );
@@ -569,7 +601,7 @@ public class HistogramView extends TmfView implements ControlListener {
         // Set a (dynamic) time interval
         long intervalTime = ( (ts2.getValue() - ts1.getValue()) / selectedWindowCanvas.getHistogramContent().getNbElement() );
         
-        selectedWindowRequest = performRequest(experiment, selectedWindowCanvas, tmpRange, intervalTime);
+        selectedWindowRequest = performRequest(experiment, selectedWindowCanvas, tmpRange, intervalTime, ExecutionType.SHORT);
         selectedWindowCanvas.redrawAsynchronously();
     }
     
@@ -582,12 +614,16 @@ public class HistogramView extends TmfView implements ControlListener {
     public void performAllTraceEventsRequest(TmfExperiment<LttngEvent> experiment) {
        // Create a new time range from "start" to "end"
         //     That way, we will get "everything" in the trace
-        LttngTimestamp ts1 = new LttngTimestamp( experiment.getStartTime() );
-        LttngTimestamp ts2 = new LttngTimestamp( experiment.getEndTime() );
-        TmfTimeRange tmpRange = new TmfTimeRange(ts1, ts2);
+//        LttngTimestamp ts1 = new LttngTimestamp( experiment.getStartTime() );
+//        LttngTimestamp ts2 = new LttngTimestamp( experiment.getEndTime() );
+//        TmfTimeRange tmpRange = new TmfTimeRange(ts1, ts2);
+       
+        TmfTimeRange tmpRange  = getExperimentTimeRange(experiment);
+               TmfTimestamp startTime = tmpRange.getStartTime();
+               TmfTimestamp endTime   = tmpRange.getEndTime();
         
         // Set a (dynamic) time interval
-        long intervalTime = ( (ts2.getValue() - ts1.getValue()) / fullExperimentCanvas.getHistogramContent().getNbElement() );
+        long intervalTime = ( (endTime.getValue() - startTime.getValue()) / fullExperimentCanvas.getHistogramContent().getNbElement() );
         
         // *** VERIFY ***
         // This would enable "fixed interval" instead of dynamic one.
@@ -599,7 +635,7 @@ public class HistogramView extends TmfView implements ControlListener {
         // It would be interesting if there was a way to tell the framework to run the request "in parallel" here.
         // Mean a completetly independant copy of the Expereiment would be done and we would proceed on that.
         //
-        dataBackgroundFullRequest = performRequest(experiment, fullExperimentCanvas, tmpRange, intervalTime);
+        dataBackgroundFullRequest = performRequest(experiment, fullExperimentCanvas, tmpRange, intervalTime, ExecutionType.LONG);
         fullExperimentCanvas.redrawAsynchronously();
     }
     
@@ -616,7 +652,7 @@ public class HistogramView extends TmfView implements ControlListener {
      * @param newRange                 The range of the request
      * @param newInterval              The interval of time we use to store the result into the HistogramContent
      */
-    public synchronized HistogramRequest performRequest(TmfExperiment<LttngEvent> experiment, HistogramCanvas targetCanvas, TmfTimeRange newRange, long newInterval) {
+    private synchronized HistogramRequest performRequest(TmfExperiment<LttngEvent> experiment, HistogramCanvas targetCanvas, TmfTimeRange newRange, long newInterval, ExecutionType execType) {
        HistogramRequest returnedRequest = null;
        
         // *** FIXME ***
@@ -627,7 +663,7 @@ public class HistogramView extends TmfView implements ControlListener {
         returnedRequest = new HistogramRequest(newRange, Integer.MAX_VALUE, targetCanvas, newInterval );
         
         // Send the request to the framework : it will be queued and processed later
-        experiment.sendRequest(returnedRequest);
+        experiment.sendRequest(returnedRequest, execType);
         
         return returnedRequest;
     }
@@ -642,7 +678,7 @@ public class HistogramView extends TmfView implements ControlListener {
        
        if ( lastUsedExperiment != null ) {
                // If a request is ongoing, try to stop it
-               if ( selectedWindowRequest.isCompleted() == false ) {
+               if ( selectedWindowRequest != null && selectedWindowRequest.isCompleted() == false ) {
                        selectedWindowRequest.cancel();
                }
                
index c76654f77e11d8dcb6e130d4b712c215f9efaf5f..64894c7473c608e283eba3ba1cfa5793d2be616c 100644 (file)
@@ -168,8 +168,11 @@ public class ProjectView extends TmfView {
         */
        public void selectExperiment(LTTngExperimentNode experiment) {
        String expId = experiment.getName();
-        if (fSelectedExperiment != null)
+        if (fSelectedExperiment != null) {
+               System.out.println(fSelectedExperiment.getName() + ": nbEvents=" + fSelectedExperiment.getNbEvents() + 
+                               ", nbReads=" + ((LTTngTrace) fSelectedExperiment.getTraces()[0]).nbEventsRead);
                fSelectedExperiment.dispose();
+        }
         try {
                LTTngTraceNode[] traceEntries = experiment.getTraces();
                int nbTraces = traceEntries.length;
@@ -181,7 +184,7 @@ public class ProjectView extends TmfView {
                 traces[i] = trace;
                }
             fSelectedExperiment = new TmfExperiment<LttngEvent>(LttngEvent.class, expId, traces);
-            fSelectedExperiment.indexExperiment(waitForCompletion);
+
                        // Make sure the lttng-core, experiment selection context is ready
                        // for an event request from any view
                        StateManagerFactory.getExperimentManager().experimentSelected_prep(
index c658ac2b10103de1194a119e8b83436be982fb2f..8dde5f3b35ee897919617f87b496f1e336c5a128 100644 (file)
@@ -407,6 +407,7 @@ public class ResourcesView extends AbsTimeUpdateView implements
         * (org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeSelectionEvent
         * )
         */
+       @Override
        public void tsfTmProcessSelEvent(TmfTimeSelectionEvent event) {
                // common implementation
                super.tsfTmProcessSelEvent(event);
@@ -420,6 +421,7 @@ public class ResourcesView extends AbsTimeUpdateView implements
         * #tsfTmProcessTimeScaleEvent(org.eclipse.linuxtools
         * .tmf.ui.viewers.timeAnalysis.TmfTimeScaleSelectionEvent)
         */
+       @Override
        public void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event) {
                super.tsfTmProcessTimeScaleEvent(event);
        }
@@ -433,6 +435,7 @@ public class ResourcesView extends AbsTimeUpdateView implements
         * ITmfTimeAnalysisEntry[], long, long, boolean, long, long,
         * java.lang.Object)
         */
+       @Override
        public void displayModel(final ITmfTimeAnalysisEntry[] items, final long startBoundTime,
                        final long endBoundTime, final boolean updateTimeBounds, final long startVisibleWindow,
                        final long endVisibleWindow, final Object source) {
@@ -466,6 +469,7 @@ public class ResourcesView extends AbsTimeUpdateView implements
         * 
         * @param signal
         */
+       @Override
        @TmfSignalHandler
        public void synchToTime(TmfTimeSynchSignal signal) {
                super.synchToTime(signal);
@@ -543,6 +547,7 @@ public class ResourcesView extends AbsTimeUpdateView implements
         * @see org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#
         * getParamsUpdater()
         */
+       @Override
        protected ParamsUpdater getParamsUpdater() {
                return ResourceModelFactory.getParamsUpdater();
        }
index 234435cffd43d2426cad79f4a7471f297e4a3f43..9d823306d15cbe7b0b26ae80f52b686cb935c579 100644 (file)
@@ -132,6 +132,7 @@ public class ResourcesEventToHandlerFactory extends AbsEventToHandlerResolver {
                return finishProcessor;
        }
 
+       @Override
        public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
                if (trcEvent instanceof LttngSyntheticEvent) {
 
index ccce8ea741deecede8d68f8a7f924333ea626c2e..269b0beb682b81f3624ec5f0a4fe366597f727c1 100644 (file)
@@ -478,6 +478,7 @@ public class StatisticsView extends AbsTimeUpdateView {
        /**
         * @return
         */
+       @Override
        public AbsEventToHandlerResolver getEventProcessor() {
                return StatsTimeCountHandlerFactory.getInstance();
        }
@@ -489,6 +490,7 @@ public class StatisticsView extends AbsTimeUpdateView {
         * org.eclipse.linuxtools.lttng.ui.views.common.AbsTimeUpdateView#waitCursor
         * (boolean)
         */
+       @Override
        protected void waitCursor(final boolean waitInd) {
                if (treeViewer == null) {
                        return;
index 2fb581e2e37ec0288eb5f66e1c8d2125573bb41f..889082948943aea6488ad9ce246aaf68ed713b3e 100644 (file)
@@ -157,6 +157,7 @@ class StatsTimeCountHandlers {
        final ILttngEventProcessor getAfterHandler() {
                AbstractStatsEventHandler handler = new StatsModeChangeHandler(null) {
                        int sched_hash = StateStrings.Events.LTT_EVENT_SCHED_SCHEDULE.getInName().hashCode();
+                       @Override
                        public boolean process(LttngEvent event, LttngTraceState traceState) {
                                // Step the event counter for any after event
                                stepCount(event, traceState);
diff --git a/org.eclipse.linuxtools.lttng/.options b/org.eclipse.linuxtools.lttng/.options
new file mode 100644 (file)
index 0000000..d9ec6c2
--- /dev/null
@@ -0,0 +1,3 @@
+org.eclipse.linuxtools.lttng/debug=false
+org.eclipse.linuxtools.lttng/info=false
+org.eclipse.linuxtools.lttng/warn=false
index 1f9074154ccbf8e96fefb1990eb5443f1cfd362f..b5d61d527ee09c782adcb5e7c92287a9ccadfc66 100644 (file)
@@ -34,7 +34,6 @@ import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
 import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
 import org.eclipse.linuxtools.tmf.request.ITmfDataRequest;
 import org.eclipse.linuxtools.tmf.request.ITmfEventRequest;
-import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
 import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
 import org.eclipse.linuxtools.tmf.trace.ITmfContext;
 import org.eclipse.linuxtools.tmf.trace.TmfContext;
@@ -57,10 +56,10 @@ public class LttngSyntheticEventProvider extends
 
        // TmfDataProvider<LttngEvent> fExtProvider = null;
        private ITmfDataRequest<LttngSyntheticEvent> fmainRequest = null;
-       private final Map<IStateTraceManager, LttngBaseEventRequest> feventProviderRequests = new HashMap<IStateTraceManager, LttngBaseEventRequest>();
+       private final Map<IStateTraceManager, LttngBaseEventRequest> fEventProviderRequests = new HashMap<IStateTraceManager, LttngBaseEventRequest>();
        private final LttngSyntheticEvent fStatusEvent;
        private final LttngSyntheticEvent fStatusEventAck;
-       private int fmainReqEventCount = 0;
+       private int fMainReqEventCount = 0;
        volatile boolean startIndSent = false;
        private LTTngTreeNode fExperiment = null;
        private ITransEventProcessor fstateUpdateProcessor = StateEventToHandlerFactory
@@ -97,6 +96,7 @@ public class LttngSyntheticEventProvider extends
        // ========================================================================
        // Methods
        // ========================================================================
+
        @SuppressWarnings("unchecked")
        @Override
        public ITmfContext armRequest(
@@ -119,7 +119,7 @@ public class LttngSyntheticEventProvider extends
                reset(fExperiment);
 
                // At least one base provider shall be available
-               if (feventProviderRequests.size() < 1) {
+               if (fEventProviderRequests.size() < 1) {
                        request.cancel();
                        TraceDebug.debug("No Base event providers available");
                        return null;
@@ -133,27 +133,31 @@ public class LttngSyntheticEventProvider extends
                TraceDebug.debug("Main Synthethic event request started on thread:  " + Thread.currentThread().getName());
 
                // loop for every traceManager in current experiment
-               for (IStateTraceManager traceManager : feventProviderRequests
-                               .keySet()) {
+               boolean subRequestQueued = false;
+               for (IStateTraceManager traceManager : fEventProviderRequests.keySet()) {
 
                        // restore trace state system to nearest check point
                        TmfTimestamp checkPoint = traceManager
                                        .restoreCheckPointByTimestamp(reqWindow.getStartTime());
+
+                       // adjust start time bound to check point
+
                        // validate so checkpoint restore is within requested bounds
                        TmfTimeRange traceRange = traceManager.getTrace().getTimeRange();
-                       if (!(checkPoint.getValue() >= traceRange.getStartTime().getValue()
-                                       && checkPoint.getValue() <= traceRange.getEndTime()
-                                                       .getValue() && checkPoint.getValue() < reqWindow
-                                       .getEndTime().getValue())) {
+                       if ((checkPoint != null) && !(
+                                       checkPoint.getValue() >= traceRange.getStartTime().getValue() &&
+                                       checkPoint.getValue() <= traceRange.getEndTime().getValue() && 
+                                       checkPoint.getValue() < reqWindow.getEndTime().getValue())
+                                       ) {
                                // checkpoint is out of trace bounds
                                continue;
                        }
+                       TmfTimeRange adjustedRange = reqWindow;
+                       if (checkPoint != null) {
+                               adjustedRange = new TmfTimeRange(checkPoint, reqWindow.getEndTime());
+                       }
 
-                       // adjust start time bound to check point
-                       TmfTimeRange adjustedRange = new TmfTimeRange(checkPoint, reqWindow
-                                       .getEndTime());
-
-                       LttngTraceState traceModel = traceManager.getStateModel();
+                       LttngTraceState traceModel = traceManager.getStateModel(checkPoint);
                        // create sub-request for one trace within experiment
                        final LttngBaseEventRequest subRequest = new LttngBaseEventRequest(
                                        adjustedRange, reqWindow.getStartTime(), 0,
@@ -214,36 +218,37 @@ public class LttngSyntheticEventProvider extends
                                        // queue the new event data and an ACK
                                        updateSynEvent(e);
 
-
-
                                        // If time at or above requested time, update application
-                                       if (eventTime >= fDispatchTime) {
-                                               // Before update
-                                               syntheticEvent.setSequenceInd(SequenceInd.BEFORE);
-                                               queueResult(syntheticEvent);
-                                               queueResult(syntheticAckIndicator);
-
-                                               // Update state locally
-                                               syntheticEvent.setSequenceInd(SequenceInd.UPDATE);
-                                               fstateUpdateProcessor.process(syntheticEvent,
+                                       try {
+                                               if (eventTime >= fDispatchTime) {
+                                                       // Before update
+                                                       syntheticEvent.setSequenceInd(SequenceInd.BEFORE);
+                                                       queueResult(syntheticEvent);
+                                                       queueResult(syntheticAckIndicator);
+
+                                                       // Update state locally
+                                                       syntheticEvent.setSequenceInd(SequenceInd.UPDATE);
+                                                       fstateUpdateProcessor.process(syntheticEvent,
                                                                fTraceModel);
 
-                                               // After Update
-                                               syntheticEvent.setSequenceInd(SequenceInd.AFTER);
-                                               queueResult(syntheticEvent);
-                                               queueResult(syntheticAckIndicator);
-
-                                               // increment once per dispatch
-                                               incrementSynEvenCount();
-                                               subEventCount++;
-                                       } else {
-                                               // event time is between checkpoint adjusted time and
-                                               // requested time i.e. application does not expect the
-                                               // event, however the state system needs to be re-built
-                                               // to the dispatch point
-                                               syntheticEvent.setSequenceInd(SequenceInd.UPDATE);
-                                               fstateUpdateProcessor.process(syntheticEvent,
-                                                               fTraceModel);
+                                                       // After Update
+                                                       syntheticEvent.setSequenceInd(SequenceInd.AFTER);
+                                                       queueResult(syntheticEvent);
+                                                       queueResult(syntheticAckIndicator);
+
+                                                       // increment once per dispatch
+                                                       incrementSynEvenCount();
+                                                       subEventCount++;
+                                               } else {
+                                                       // event time is between checkpoint adjusted time and
+                                                       // requested time i.e. application does not expect the
+                                                       // event, however the state system needs to be re-built
+                                                       // to the dispatch point
+                                                       syntheticEvent.setSequenceInd(SequenceInd.UPDATE);
+                                                       fstateUpdateProcessor.process(syntheticEvent, fTraceModel);
+                                               }
+                                       } catch (InterruptedException e1) {
+                                               e1.printStackTrace();
                                        }
                                }
 
@@ -278,19 +283,20 @@ public class LttngSyntheticEventProvider extends
                                        return syntheticEvent;
                                }
                        };
-                       
+                                               
                        // preserve the associated sub request to control it e.g.
                        // cancellation
-                       feventProviderRequests.put(traceManager, subRequest);
+                       fEventProviderRequests.put(traceManager, subRequest);
 
                        // start request
                        TmfTrace<LttngEvent> provider = (TmfTrace<LttngEvent>) traceManager
                                        .getTrace();
-                       provider.sendRequest(subRequest);
+                       provider.sendRequest(subRequest, ExecutionType.LONG);
+                       subRequestQueued = true;
                }
 
                // Return a dummy context, not used for relay provider
-               return new TmfContext();
+               return (subRequestQueued) ? new TmfContext() : null;
        }
 
        /**
@@ -302,8 +308,12 @@ public class LttngSyntheticEventProvider extends
                startIndEvent.setSequenceInd(SequenceInd.STARTREQ);
 
                // Notify application
-               queueResult(startIndEvent);
-               queueResult(fStatusEventAck);
+               try {
+                       queueResult(startIndEvent);
+                       queueResult(fStatusEventAck);
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
+               }
 
                // Notify state event processor
                fstateUpdateProcessor.process(startIndEvent, null);
@@ -321,7 +331,7 @@ public class LttngSyntheticEventProvider extends
                // handle completion and cancellations properly
 
                // Close the main request when all sub-requests are marked completed
-               for (LttngBaseEventRequest subRequest : feventProviderRequests.values()) {
+               for (LttngBaseEventRequest subRequest : fEventProviderRequests.values()) {
                        if (subRequest != null) {
                                if (!subRequest.isCompleted()) {
                                        // Not ready to complete main request
@@ -336,24 +346,29 @@ public class LttngSyntheticEventProvider extends
                LttngSyntheticEvent finishEvent = new LttngSyntheticEvent(fStatusEvent);
                finishEvent.setSequenceInd(SequenceInd.ENDREQ);
                finishEvent.setTraceModel(traceModel);
-               queueResult(finishEvent);
-               queueResult(fStatusEventAck);
-               // End the loop in the main request
-               queueResult(LttngSyntheticEvent.NullEvent);
+
+               try {
+                       queueResult(finishEvent);
+                       queueResult(fStatusEventAck);
+                       // End the loop in the main request
+                       queueResult(LttngSyntheticEvent.NullEvent);
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
+               }
        }
 
        /**
         * Increment the global event counter i.e. events from any sub requests
         */
        private synchronized void incrementSynEvenCount() {
-               fmainReqEventCount++;
+               fMainReqEventCount++;
        }
 
        /**
         * @return
         */
        public synchronized int getSynEvenCount() {
-               return fmainReqEventCount;
+               return fMainReqEventCount;
        }
 
        /**
@@ -366,14 +381,14 @@ public class LttngSyntheticEventProvider extends
                fmainRequest = null;
 
                // Make sure previous request are terminated
-               for (LttngBaseEventRequest tmpRequest : feventProviderRequests.values()) {
+               for (LttngBaseEventRequest tmpRequest : fEventProviderRequests.values()) {
                        if (tmpRequest != null && !tmpRequest.isCompleted()) {
                                tmpRequest.cancel();
                        }
                }
 
-               feventProviderRequests.clear();
-               fmainReqEventCount = 0;
+               fEventProviderRequests.clear();
+               fMainReqEventCount = 0;
                startIndSent = false;
 
                // set of base event providers
@@ -381,7 +396,7 @@ public class LttngSyntheticEventProvider extends
                        LTTngTreeNode[] traces = fExperiment.getChildren();
                        for (LTTngTreeNode trace : traces) {
                                IStateTraceManager traceBaseEventProvider = (IStateTraceManager) trace;
-                               feventProviderRequests.put(traceBaseEventProvider, null);
+                               fEventProviderRequests.put(traceBaseEventProvider, null);
                        }
                }
 
@@ -413,7 +428,7 @@ public class LttngSyntheticEventProvider extends
         * org.eclipse.linuxtools.tmf.component.TmfDataProvider#sendRequest(org.
         * eclipse.linuxtools.tmf.request.TmfDataRequest)
         */
-       public void sendRequest(final TmfDataRequest<LttngSyntheticEvent> request) {
+       public void sendRequest(final ITmfDataRequest<LttngSyntheticEvent> request) {
                super.sendRequest(request);
                if (waitForRequest) {
                        try {
index 3204207bb93794ab883d4cbe785689e567c0a610..ea4a01025b9ec40d848f600c1c22746d31358cb8 100644 (file)
@@ -170,13 +170,13 @@ public class LttngEvent extends TmfEvent {
     
     @Override
        public String toString() {
-       String returnedData="";
+       StringBuffer result= new StringBuffer("[LttngEvent(");
+       result.append("Timestamp:" + getTimestamp().getValue());
+       result.append(",Channel:"  + getChannelName());
+       result.append(",CPU:"      + getCpuId());
+       result.append(",Marker:"   + getMarkerName());
+       result.append(",Content:"  + getContent() + ")]");
        
-       returnedData += "Event timestamp:" + this.getTimestamp().getValue() + " ";
-       returnedData += "Channel:" + getChannelName() + " ";
-       returnedData += "CPU:" + getCpuId() + " ";
-       returnedData += "Marker:" + getMarkerName() + " ";
-       
-       return returnedData;
+       return result.toString();
     }
 }
index 116b90e058907f7d576ce465b2d014b9b54f801d..c8b6d454082c79711811b4c684d3766a419da3a4 100644 (file)
@@ -255,6 +255,7 @@ public class LttngEventContent extends TmfEventContent {
         
         StringBuffer strBuffer = new StringBuffer();
         for ( int pos=0; pos < allFields.length; pos++) {
+               if (pos != 0) strBuffer.append(",");
                strBuffer.append(allFields[pos].toString());
         }
         
index 52aee15cd5950a9c2bd6f58ba09eb3861a72f972..d348e161dc135655b8b6ce4cc3608219dccedbe1 100644 (file)
@@ -125,7 +125,8 @@ public class LttngSyntheticEvent extends LttngEvent {
         * 
         * @see org.eclipse.linuxtools.lttng.event.LttngEvent#getParentTrace()
         */
-    public TmfTrace<LttngEvent> getParentTrace() {
+       @Override
+   public TmfTrace<LttngEvent> getParentTrace() {
                if (baseEvent != null) {
                        return baseEvent.getParentTrace();
                } else {
@@ -140,6 +141,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * org.eclipse.linuxtools.lttng.event.LttngEvent#setParentTrace(org.eclipse
         * .linuxtools.tmf.trace.TmfTrace)
         */
+       @Override
        public void setParentTrace(TmfTrace<LttngEvent> parentTrace) {
                if (baseEvent != null) {
                        baseEvent.setParentTrace(parentTrace);
@@ -153,6 +155,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * 
         * @see org.eclipse.linuxtools.lttng.event.LttngEvent#getChannelName()
         */
+       @Override
        public String getChannelName() {
                if (baseEvent != null) {
                        return baseEvent.getChannelName();
@@ -166,6 +169,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * 
         * @see org.eclipse.linuxtools.lttng.event.LttngEvent#getCpuId()
         */
+       @Override
        public long getCpuId() {
                if (baseEvent != null) {
                        return baseEvent.getCpuId();
@@ -179,6 +183,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * 
         * @see org.eclipse.linuxtools.lttng.event.LttngEvent#getMarkerName()
         */
+       @Override
        public String getMarkerName() {
                if (baseEvent != null) {
                        return baseEvent.getMarkerName();
@@ -192,6 +197,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * 
         * @see org.eclipse.linuxtools.lttng.event.LttngEvent#getContent()
         */
+       @Override
        public LttngEventContent getContent() {
                if (baseEvent != null) {
                        return baseEvent.getContent();
@@ -207,6 +213,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * org.eclipse.linuxtools.lttng.event.LttngEvent#setContent(org.eclipse.
         * linuxtools.lttng.event.LttngEventContent)
         */
+       @Override
        public void setContent(LttngEventContent newContent) {
                if (baseEvent != null) {
                        baseEvent.setContent(newContent);
@@ -220,6 +227,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * 
         * @see org.eclipse.linuxtools.lttng.event.LttngEvent#getType()
         */
+       @Override
        public LttngEventType getType() {
                if (baseEvent != null) {
                        return baseEvent.getType();
@@ -235,6 +243,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * org.eclipse.linuxtools.lttng.event.LttngEvent#setType(org.eclipse.linuxtools
         * .lttng.event.LttngEventType)
         */
+       @Override
        public void setType(LttngEventType newType) {
                if (baseEvent != null) {
                        baseEvent.setType(newType);
@@ -250,6 +259,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * org.eclipse.linuxtools.lttng.event.LttngEvent#updateJniEventReference
         * (org.eclipse.linuxtools.lttng.jni.JniEvent)
         */
+       @Override
        public void updateJniEventReference(JniEvent newJniEventReference) {
                if (baseEvent != null) {
                        baseEvent.updateJniEventReference(newJniEventReference);
@@ -263,6 +273,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * 
         * @see org.eclipse.linuxtools.lttng.event.LttngEvent#convertEventTmfToJni()
         */
+       @Override
        public JniEvent convertEventTmfToJni() {
                if (baseEvent != null) {
                        return baseEvent.convertEventTmfToJni();
@@ -276,6 +287,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * 
         * @see org.eclipse.linuxtools.lttng.event.LttngEvent#isNullRef()
         */
+       @Override
        public boolean isNullRef() {
                return this == NullEvent;
        }
@@ -285,6 +297,7 @@ public class LttngSyntheticEvent extends LttngEvent {
         * 
         * @see org.eclipse.linuxtools.lttng.event.LttngEvent#toString()
         */
+       @Override
        public String toString() {
                if (baseEvent != null) {
                        return baseEvent.toString();
index 65f40aca75a07a073b88d277459af821d1f236f1..65de900fdcd61ec868056ce2b69bc54352dab544 100644 (file)
@@ -60,6 +60,7 @@ public class LTTngTreeNode extends
         * @see
         * org.eclipse.linuxtools.lttng.model.LTTngTreeNodeGeneric#getChildren()
         */
+       @Override
        public LTTngTreeNode[] getChildren() {
                return childrenToArray(fchildren.values(), this.getClass());
        }
index b46cc52d757131f684370f255fbc0a47b680e295..9f3a1426d10279e25cc2f7c9b8971b78a69d4cdf 100644 (file)
@@ -345,6 +345,7 @@ public abstract class LTTngTreeNodeGeneric<E extends LTTngTreeNodeGeneric<E>>
         * 
         * @see org.eclipse.linuxtools.tmf.event.TmfData#isNullRef()
         */
+       @Override
        public boolean isNullRef() {
                return false;
        }
index ee8bd416dcd27e78ecbcb7b342dd374c33c78fb0..c7fb6b91b022f3800fd50b56cca9f1e87185e747 100644 (file)
@@ -165,6 +165,7 @@ public class LttngSyntEventRequest extends TmfEventRequest<LttngSyntheticEvent>
         * 
         * @see org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleCompleted()
         */
+       @Override
        public void handleCompleted() {
                // notify listeners
                notifyCompletion();
index 2acc221d079376e6b9bffa4c40b4d75ea8ed799b..26fbc4cfce03034ca269a7fdfac63d40b01e0f4d 100644 (file)
@@ -48,7 +48,8 @@ public abstract class AbsStateUpdate extends AbsStateProcessing implements
                exe_state.setEntry_Time(eventTime.getValue());
                exe_state.setChange_Time(eventTime.getValue());
                exe_state.setCum_cpu_time(0L);
-               exe_state.setProc_status(process.getState().getProc_status());
+//             if (process != null)
+                       exe_state.setProc_status(process.getState().getProc_status());
                process.pushToExecutionStack(exe_state);
        }
 
index ad3a37cecebcb4e613a2158b1485c5da17033746..9258dc13f830638d7e0d4f98d822f608ba0a8789 100644 (file)
@@ -14,40 +14,37 @@ package org.eclipse.linuxtools.lttng.state.experiment;
 
 import org.eclipse.linuxtools.lttng.event.LttngEvent;
 import org.eclipse.linuxtools.lttng.model.LTTngTreeNode;
-import org.eclipse.linuxtools.lttng.request.ILttngSyntEventRequest;
-import org.eclipse.linuxtools.lttng.request.IRequestStatusListener;
-import org.eclipse.linuxtools.lttng.state.evProcessor.ITransEventProcessor;
 import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
 import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
 
 public interface IStateExperimentManager {
 
-       /**
-        * Read all available traces from the nearest checkpoint from start position
-        * to the end of a specified time range. One request per trace in the
-        * experiment will be triggered
-        * 
-        * @param trange
-        * @param obs
-        * @param transactionID
-        * @param display
-        * @return
-        */
-       public abstract ILttngSyntEventRequest readExperimentTimeWindow(
-                       TmfTimeRange trange,
-                       Object origin, IRequestStatusListener listener,
-                       ITransEventProcessor processor);
-
-       /**
-        * Read available traces from the Experiment start time, One request per
-        * trace in the Experiment
-        * 
-        * @param source
-        * @param listener
-        * @param processor
-        */
-       public abstract void readExperiment(Object source,
-                       IRequestStatusListener listener, ITransEventProcessor processor);
+//     /**
+//      * Read all available traces from the nearest checkpoint from start position
+//      * to the end of a specified time range. One request per trace in the
+//      * experiment will be triggered
+//      * 
+//      * @param trange
+//      * @param obs
+//      * @param transactionID
+//      * @param display
+//      * @return
+//      */
+//     public abstract ILttngSyntEventRequest readExperimentTimeWindow(
+//                     TmfTimeRange trange,
+//                     Object origin, IRequestStatusListener listener,
+//                     ITransEventProcessor processor);
+//
+//     /**
+//      * Read available traces from the Experiment start time, One request per
+//      * trace in the Experiment
+//      * 
+//      * @param source
+//      * @param listener
+//      * @param processor
+//      */
+//     public abstract void readExperiment(Object source,
+//                     IRequestStatusListener listener, ITransEventProcessor processor);
 
        /**
         * A new Experiment selected, notification received from the framework
index 1efc21dd6c6ffae899fcb6bec2249ca16001f04f..b00fd22a0f5ae9b077070357e13c825aafd48be4 100644 (file)
  *******************************************************************************/
 package org.eclipse.linuxtools.lttng.state.experiment;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.eclipse.linuxtools.lttng.TraceDebug;
 import org.eclipse.linuxtools.lttng.control.LttngCoreProviderFactory;
 import org.eclipse.linuxtools.lttng.control.LttngSyntheticEventProvider;
 import org.eclipse.linuxtools.lttng.event.LttngEvent;
+import org.eclipse.linuxtools.lttng.event.LttngSyntheticEvent;
+import org.eclipse.linuxtools.lttng.event.LttngSyntheticEvent.SequenceInd;
 import org.eclipse.linuxtools.lttng.model.LTTngTreeNode;
-import org.eclipse.linuxtools.lttng.request.ILttngSyntEventRequest;
-import org.eclipse.linuxtools.lttng.request.IRequestStatusListener;
 import org.eclipse.linuxtools.lttng.signal.ILttExperimentSelectedListener;
 import org.eclipse.linuxtools.lttng.signal.StateExperimentListener;
-import org.eclipse.linuxtools.lttng.state.evProcessor.ITransEventProcessor;
 import org.eclipse.linuxtools.lttng.state.trace.IStateTraceManager;
+import org.eclipse.linuxtools.tmf.event.TmfEvent;
 import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
 import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
+import org.eclipse.linuxtools.tmf.request.ITmfEventRequest;
+import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
+import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
 import org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal;
 import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
 
@@ -41,6 +47,13 @@ public class StateExperimentManager extends LTTngTreeNode implements
                                                                                                                // supported
        private final StateExperimentListener fexperimentListener;
        private boolean fwaitForCompletion = false;
+       /**
+        * Used to route incoming events to proper trace manager, during check point
+        * building
+        */
+       private final Map<ITmfTrace, IStateTraceManager> ftraceToManagerMap = new HashMap<ITmfTrace, IStateTraceManager>();
+       private LttngSyntheticEvent syntheticEvent = null;
+       private ITmfEventRequest<LttngEvent> fStateCheckPointRequest = null;
 
 
        // ========================================================================
@@ -57,55 +70,55 @@ public class StateExperimentManager extends LTTngTreeNode implements
        // Methods
        // =======================================================================
 
-       /* (non-Javadoc)
-        * @see org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager#readExperimentTimeWindow(org.eclipse.linuxtools.tmf.event.TmfTimeRange, java.lang.String, org.eclipse.linuxtools.lttng.state.IStateDataRequestListener)
-        */
-       public ILttngSyntEventRequest readExperimentTimeWindow(TmfTimeRange trange,
-                       Object source, IRequestStatusListener listener,
-                       ITransEventProcessor processor) {
-
-               ILttngSyntEventRequest request = null;
-
-               // validate
-               if (fSelectedExperiment != null) {
-                       // Get all trace manager nodes
-                       LTTngTreeNode[] traceMgrs = fSelectedExperiment.getChildren();
-
-                       if (traceMgrs != null && traceMgrs.length > 0) {
-                               IStateTraceManager traceManager;
-                               // Trigger one request per trace
-                               for (LTTngTreeNode traceNode : traceMgrs) {
-                                       traceManager = (IStateTraceManager) traceNode;
-                                       request = traceManager.executeDataRequest(trange, source,
-                                                       listener,
-                                                       processor);
-                               }
-                       }
-               } else {
-                       if (fSelectedExperiment == null) {
-                               TraceDebug.debug("No experiment selected");
-                       }
-               }
-
-               return request;
-       }
+//     /* (non-Javadoc)
+//      * @see org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager#readExperimentTimeWindow(org.eclipse.linuxtools.tmf.event.TmfTimeRange, java.lang.String, org.eclipse.linuxtools.lttng.state.IStateDataRequestListener)
+//      */
+//     public ILttngSyntEventRequest readExperimentTimeWindow(TmfTimeRange trange,
+//                     Object source, IRequestStatusListener listener,
+//                     ITransEventProcessor processor) {
+//
+//             ILttngSyntEventRequest request = null;
+//
+//             // validate
+//             if (fSelectedExperiment != null) {
+//                     // Get all trace manager nodes
+//                     LTTngTreeNode[] traceMgrs = fSelectedExperiment.getChildren();
+//
+//                     if (traceMgrs != null && traceMgrs.length > 0) {
+//                             IStateTraceManager traceManager;
+//                             // Trigger one request per trace
+//                             for (LTTngTreeNode traceNode : traceMgrs) {
+//                                     traceManager = (IStateTraceManager) traceNode;
+//                                     request = traceManager.executeDataRequest(trange, source,
+//                                                     listener,
+//                                                     processor);
+//                             }
+//                     }
+//             } else {
+//                     if (fSelectedExperiment == null) {
+//                             TraceDebug.debug("No experiment selected");
+//                     }
+//             }
+//
+//             return request;
+//     }
 
-       /* (non-Javadoc)
-        * @see org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager#readExperiment(java.lang.String, org.eclipse.linuxtools.lttng.state.IStateDataRequestListener)
-        */
-       @SuppressWarnings("unchecked")
-       public void readExperiment(Object source, IRequestStatusListener listener,
-                       ITransEventProcessor processor) {
-               // validate
-               if (fSelectedExperiment != null) {
-                       TmfExperiment<LttngEvent> experiment = (TmfExperiment<LttngEvent>) fSelectedExperiment
-                                       .getValue();
-                       TmfTimeRange trange = experiment.getTimeRange();
-                       readExperimentTimeWindow(trange, source, listener, processor);
-               } else {
-                       TraceDebug.debug("No selected experiment available");
-               }
-       }
+//     /* (non-Javadoc)
+//      * @see org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager#readExperiment(java.lang.String, org.eclipse.linuxtools.lttng.state.IStateDataRequestListener)
+//      */
+//     @SuppressWarnings("unchecked")
+//     public void readExperiment(Object source, IRequestStatusListener listener,
+//                     ITransEventProcessor processor) {
+//             // validate
+//             if (fSelectedExperiment != null) {
+//                     TmfExperiment<LttngEvent> experiment = (TmfExperiment<LttngEvent>) fSelectedExperiment
+//                                     .getValue();
+//                     TmfTimeRange trange = experiment.getTimeRange();
+//                     readExperimentTimeWindow(trange, source, listener, processor);
+//             } else {
+//                     TraceDebug.debug("No selected experiment available");
+//             }
+//     }
        
 
 
@@ -177,25 +190,35 @@ public class StateExperimentManager extends LTTngTreeNode implements
        public void experimentSelected(Object source,
                        TmfExperiment<LttngEvent> experiment) {
                // validate
-               if (experiment == null) {
+               if (experiment == null) { 
+                       TraceDebug.debug("Received expriment is null");
                        return;
                }
 
-               LTTngTreeNode experimentNode = getChildByName(experiment.getName());
-               if (experimentNode != null) {
-                       // get the trace manager nodes
-                       LTTngTreeNode[] traceNodes = experimentNode.getChildren();
-                       for (LTTngTreeNode traceStateManagerNode : traceNodes) {
-                               // The trace node needs to perform its first data request
-                               // for this experiment with the main goal of building its
-                               // checkpoints
-                               if (traceStateManagerNode instanceof ILttExperimentSelectedListener) {
-                                       // no need to provide the trace to the trace manager
-                                       ((ILttExperimentSelectedListener) traceStateManagerNode).experimentUpdated(
-                                                       new TmfExperimentUpdatedSignal(source, experiment, null), fwaitForCompletion);
-                               }
-                       }
+               // If previous request is ongoing, cancel it before requesting a new
+               // one.
+               if (fStateCheckPointRequest != null && !fStateCheckPointRequest.isCompleted()) {
+                       fStateCheckPointRequest.cancel();
                }
+
+               // trigger data request to build the state system check points
+               fStateCheckPointRequest = buildCheckPoints(experiment);
+
+//             LTTngTreeNode experimentNode = getChildByName(experiment.getName());
+//             if (experimentNode != null) {
+//                     // get the trace manager nodes
+//                     LTTngTreeNode[] traceNodes = experimentNode.getChildren();
+//                     for (LTTngTreeNode traceStateManagerNode : traceNodes) {
+//                             // The trace node needs to perform its first data request
+//                             // for this experiment with the main goal of building its
+//                             // checkpoints
+//                             if (traceStateManagerNode instanceof ILttExperimentSelectedListener) {
+//                                     // no need to provide the trace to the trace manager
+//                                     ((ILttExperimentSelectedListener) traceStateManagerNode).experimentUpdated(
+//                                                     new TmfExperimentUpdatedSignal(source, experiment, null), fwaitForCompletion);
+//                             }
+//                     }
+//             }
        }
 
        /*
@@ -238,6 +261,7 @@ public class StateExperimentManager extends LTTngTreeNode implements
         * 
         * @see java.lang.Object#finalize()
         */
+       @Override
        protected void finalize() {
                fexperimentListener.dispose();
        }
@@ -254,4 +278,156 @@ public class StateExperimentManager extends LTTngTreeNode implements
                fwaitForCompletion = wait;
        }
 
+       private ITmfEventRequest<LttngEvent> buildCheckPoints(TmfExperiment<LttngEvent> experiment) {
+               // validate
+               if (experiment == null) {
+                       TraceDebug.debug("Received expriment is null");
+                       return null;
+               }
+               
+               LTTngTreeNode experimentNode = getChildByName(experiment.getName());
+               if (experimentNode == null) {
+                       TraceDebug.debug("Expriment Node " + experiment.getName() + " does not exist");
+                       return null;
+               }
+               
+               // get the trace manager nodes associated to the experiment
+               LTTngTreeNode[] traceNodes = experimentNode.getChildren();
+               synchronized (ftraceToManagerMap) {
+                       ftraceToManagerMap.clear();
+               }
+               
+               for (LTTngTreeNode traceStateManagerNode : traceNodes) {
+                       IStateTraceManager traceManager;
+                       try {
+                               traceManager = (IStateTraceManager) traceStateManagerNode;
+                       } catch (ClassCastException e) {
+                               System.out.println(e.getStackTrace().toString());
+                               return null;
+                       }
+               
+                       // Clear all previously created check points as preparation to
+                       // re-build
+                       traceManager.clearCheckPoints();
+               
+                       // build the trace to manager mapping for event dispatching
+                       synchronized (ftraceToManagerMap) {
+                               ftraceToManagerMap.put(traceManager.getTrace(), traceManager);
+                       }
+               }
+               
+               // if no trace mapping
+               if (ftraceToManagerMap.size() < 1) {
+                       TraceDebug.debug("No traces associated to experiment " + experiment.getName());
+                       return null;
+               }
+               
+               // Prepare event data request to build state model
+               ITmfEventRequest<LttngEvent> request = new TmfEventRequest<LttngEvent>(
+                               LttngEvent.class, TmfTimeRange.Eternity,
+                               TmfDataRequest.ALL_DATA, 1) {
+               
+                       Long nbEvents = 0L;
+               
+                       /*
+                        * (non-Javadoc)
+                        * 
+                        * @see
+                        * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleData()
+                        */
+                       @Override
+                       public void handleData() {
+                               TmfEvent[] events = getData();
+                               if (events.length > 0) {
+                                       nbEvents++;
+               
+                                       LttngEvent event = (LttngEvent) events[0];
+                                       ITmfTrace trace = event.getParentTrace();
+                                       IStateTraceManager traceManager = ftraceToManagerMap
+                                                       .get(trace);
+                                       if (traceManager != null) {
+                                               // obtain synthetic event
+                                               LttngSyntheticEvent synEvent = updateSynEvent(event,
+                                                               traceManager);
+                                               // update state system, and save check points as needed
+                                               traceManager.handleEvent(synEvent, nbEvents);
+                                       } else {
+                                               TraceDebug
+                                                               .debug("StateTraceManager not found for trace"
+                                                                               + trace.getName());
+                                       }
+                               }
+                       }
+               
+                       /*
+                        * (non-Javadoc)
+                        * 
+                        * @see
+                        * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleFailure()
+                        */
+                       public void handleFailure() {
+                               printCompletedMessage();
+                       }
+                       
+                       /*
+                        * (non-Javadoc)
+                        * 
+                        * @see
+                        * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleCancel()
+                        */
+                       public void handleCancel() {
+                               printCompletedMessage();
+                       }
+               
+                       /*
+                        * (non-Javadoc)
+                        * 
+                        * @see
+                        * org.eclipse.linuxtools.tmf.request.TmfDataRequest#handleSuccess()
+                        */
+                       public void handleSuccess() {
+                               printCompletedMessage();
+                       }
+               
+                       /**
+                        * @param header
+                        */
+                       private void printCompletedMessage() {
+                               // super.handleCompleted();
+                               if (TraceDebug.isDEBUG()) {
+                                       TraceDebug.debug("Trace check point building completed, number of events handled: " + nbEvents
+                                                       + "\n\t\t");
+                                       for (IStateTraceManager traceMgr : ftraceToManagerMap.values()) {
+                                               TraceDebug.debug(traceMgr.toString() + "\n\t\t");
+                                       }
+                               }
+                       }
+               };
+               
+               // Execute event data request
+               experiment.sendRequest(request);
+               if (fwaitForCompletion) {
+                       try {
+                               request.waitForCompletion();
+                       } catch (InterruptedException e) {
+                               e.printStackTrace();
+                       }
+               }
+               
+               return request;
+               }
+               
+               private LttngSyntheticEvent updateSynEvent(LttngEvent e,
+                               IStateTraceManager stateTraceManager) {
+                       if (syntheticEvent == null || syntheticEvent.getBaseEvent() != e) {
+                               syntheticEvent = new LttngSyntheticEvent(e);
+                       }
+               
+                       // Trace model needed by application handlers
+                       syntheticEvent.setTraceModel(stateTraceManager.getStateModel());
+                       syntheticEvent.setSequenceInd(SequenceInd.UPDATE);
+                               
+                       return syntheticEvent;
+               }
+
 }
\ No newline at end of file
index 0c336bee9bb1caf2b15a5722eedf2167d0e56bef..95c2b3cfef0008d9acb2d9f8c9a7598ad461ec28 100644 (file)
@@ -16,8 +16,6 @@ import org.eclipse.linuxtools.lttng.TraceDebug;
 import org.eclipse.linuxtools.lttng.control.LttngCoreProviderFactory;
 import org.eclipse.linuxtools.lttng.model.LTTngTreeNode;
 import org.eclipse.linuxtools.lttng.state.LttngStateException;
-import org.eclipse.linuxtools.lttng.state.model.LttngTraceState;
-import org.eclipse.linuxtools.lttng.state.model.StateModelFactory;
 import org.eclipse.linuxtools.lttng.state.trace.IStateTraceManager;
 import org.eclipse.linuxtools.lttng.state.trace.StateTraceManager;
 import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
@@ -71,13 +69,13 @@ public class StateManagerFactory {
                        return managerNode;
                }
 
-               LttngTraceState traceModel = StateModelFactory.getStateEntryInstance();
+//             LttngTraceState traceModel = 
+//             StateModelFactory.getStateEntryInstance();
                StateTraceManager manager = null;
 
                // catch potential construction problems
                try {
-                       manager = new StateTraceManager(experiment.getNextUniqueId(),
-                                       experiment, traceUniqueId, rtrace, traceModel,
+                       manager = new StateTraceManager(experiment.getNextUniqueId(), experiment, traceUniqueId, rtrace,
                                        LttngCoreProviderFactory.getEventProvider());
 
                        // Allow the possibility to configure the trace state check point
index adffb37a88ed316122aa8ea0e8ebb77bdaa79121..7f66a982ec35d5e22ff75bf20898ddaf9741fdb9 100644 (file)
@@ -54,6 +54,7 @@ public class LTTngStateResource extends
         * org.eclipse.linuxtools.lttng.control.LTTngStateTreeNodeGeneric#getChildren
         * ()
         */
+       @Override
        public LTTngStateResource[] getChildren() {
                return childrenToArray(fchildren.values(), this.getClass());
        }
index 29ed0cf1ee7d5ef33486a7c2078479dc3e4d2b5a..ab26333a9bbc204aece0476b91ee5d3327b5a92b 100644 (file)
@@ -1,30 +1,28 @@
 package org.eclipse.linuxtools.lttng.state.trace;
 
-import org.eclipse.linuxtools.lttng.request.ILttngSyntEventRequest;
-import org.eclipse.linuxtools.lttng.request.IRequestStatusListener;
+import org.eclipse.linuxtools.lttng.event.LttngSyntheticEvent;
 import org.eclipse.linuxtools.lttng.signal.ILttExperimentSelectedListener;
-import org.eclipse.linuxtools.lttng.state.evProcessor.ITransEventProcessor;
 import org.eclipse.linuxtools.lttng.state.model.LttngTraceState;
 import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
 import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
 import org.eclipse.linuxtools.tmf.trace.ITmfTrace;
 
 public interface IStateTraceManager extends ILttExperimentSelectedListener {
-       /**
-        * TODO: Not ready for threading
-        * <p>
-        * Read events within specific time window, e.g. time range selection
-        * </p>
-        * 
-        * @param trange
-        * @param source
-        * @param listener
-        * @param processor
-        * @return
-        */
-       public abstract ILttngSyntEventRequest executeDataRequest(
-                       TmfTimeRange trange, Object source,
-                       IRequestStatusListener listener, ITransEventProcessor processor);
+//     /**
+//      * TODO: Not ready for threading
+//      * <p>
+//      * Read events within specific time window, e.g. time range selection
+//      * </p>
+//      * 
+//      * @param trange
+//      * @param source
+//      * @param listener
+//      * @param processor
+//      * @return
+//      */
+//     public abstract ILttngSyntEventRequest executeDataRequest(
+//                     TmfTimeRange trange, Object source,
+//                     IRequestStatusListener listener, ITransEventProcessor processor);
 
        /**
         * used to obtain details on the log associated with this manager e.g.
@@ -55,10 +53,37 @@ public interface IStateTraceManager extends ILttExperimentSelectedListener {
        public abstract TmfTimeRange getExperimentTimeWindow();
 
        /**
+        * Returns the State model instance associated with this Trace and given
+        * checkPointReference e.g. check point building state model, UI state
+        * model, etc.
+        * 
+        * @return
+        */
+       public abstract LttngTraceState getStateModel(TmfTimestamp startingCheckPointReference);
+
+       /**
+        * Returns the State model instance associated with this Trace i.e. not the
+        * checkpoint build state model
         * Returns the State model instance associated with this Trace
         * 
         * @return
         */
        public abstract LttngTraceState getStateModel();
 
-}
\ No newline at end of file
+               
+       /**
+        * Reset previously stored check points, and initialize the associated state
+        * model
+        */
+       public void clearCheckPoints();
+
+       /**
+        * handles incoming events used to build the associated check points, The
+        * user must call clearCheckPoints before the processing the first synthetic
+        * event.
+        * 
+        * @param synEvent
+        * @param eventCount
+        */
+       public void handleEvent(LttngSyntheticEvent synEvent, Long eventCount);
+}
index 479e8d1b4d3340f81cb4aabc6d843988f75a0582..4fc00a079491618c93e16b27a86031e301dc21ae 100644 (file)
@@ -58,6 +58,7 @@ public class StateTraceManager extends LTTngTreeNode implements
 
        // immutable Objects
        private final ITmfTrace fTrace;
+       private final TmfTimestamp fCheckPointsStartTime;       
        private int fcpuNumber = -1;
        private final ITransEventProcessor fStateUpdateProcessor;
 
@@ -65,6 +66,7 @@ public class StateTraceManager extends LTTngTreeNode implements
        private final HashMap<Long, LttngTraceState> stateCheckpointsList = new HashMap<Long, LttngTraceState>();
        private final Vector<TmfCheckpoint> timestampCheckpointsList = new Vector<TmfCheckpoint>();
        private LttngTraceState fStateModel;
+       private LttngTraceState fCheckPointStateModel;
        private int selectionCount = 0;
 
        // locks
@@ -91,7 +93,7 @@ public class StateTraceManager extends LTTngTreeNode implements
         * @throws LttngStateException
         */
        public StateTraceManager(Long id, LTTngTreeNode parent, String name,
-                       ITmfTrace trace, LttngTraceState stateModel,
+                       ITmfTrace trace,
                        TmfEventProvider<LttngSyntheticEvent> eventProvider)
                        throws LttngStateException {
                super(id, parent, name, trace);
@@ -101,11 +103,17 @@ public class StateTraceManager extends LTTngTreeNode implements
                }
 
                fTrace = trace;
-               fStateModel = stateModel;
-               fStateModel.init(this);
+               fCheckPointsStartTime = trace.getStartTime().clone();
                fStateUpdateProcessor = StateEventToHandlerFactory.getInstance();
                fSynEventProvider = eventProvider;
+
                init();
+               
+               fStateModel = StateModelFactory.getStateEntryInstance(this);
+               fStateModel.init(this);
+
+               fCheckPointStateModel = StateModelFactory.getStateEntryInstance(this);
+               fCheckPointStateModel.init(this);
        }
 
        // =======================================================================
@@ -157,8 +165,8 @@ public class StateTraceManager extends LTTngTreeNode implements
                // requested time window from trace start to end, this to
                // make sure one thread is used so the events arrive in order for proper
                // building of the checkpoints
-               TmfTimeRange adjustedRange = new TmfTimeRange(fTrace.getTimeRange()
-                               .getStartTime(), fTrace.getTimeRange().getEndTime());
+               TmfTimeRange adjustedRange = new TmfTimeRange(fCheckPointsStartTime, fTrace.getTimeRange().getEndTime());
+
                // Obtain a dataRequest to pass to the processRequest function
                ILttngSyntEventRequest request = getDataRequestStateSave(adjustedRange,
                                null, fStateUpdateProcessor);
@@ -173,47 +181,47 @@ public class StateTraceManager extends LTTngTreeNode implements
                }
        }
 
-       /*
-        * (non-Javadoc)
-        * 
-        * @see org.eclipse.linuxtools.lttng.state.trace.IStateTraceManager#
-        * executeDataRequest(org.eclipse.linuxtools.tmf.event.TmfTimeRange,
-        * java.lang.Object,
-        * org.eclipse.linuxtools.lttng.request.IRequestStatusListener,
-        * org.eclipse.linuxtools.lttng.state.evProcessor.ITransEventProcessor)
-        */
-       public ILttngSyntEventRequest executeDataRequest(TmfTimeRange trange,
-                       Object source,
-                       IRequestStatusListener listener, ITransEventProcessor processor) {
-               TmfTimestamp restoredStartTime = restoreCheckPointByTimestamp(trange
-                               .getStartTime());
-               // Adjust the time range to consider rewinding to the start time
-               trange = new TmfTimeRange(restoredStartTime, trange.getEndTime());
-               // Get a data request for the time range we want (nearest checkpoint
-               // to timestamp wanted)
-
-               // Process request to that point
-               ILttngSyntEventRequest request = getDataRequestByTimeRange(trange,
-                               listener, processor);
-               request.setSource(source);
-
-               // don't wait for completion i.e. allow cancellations
-               request.startRequestInd(fSynEventProvider);
-               // fSynEventProvider
-               // .sendRequest((TmfDataRequest<LttngSyntheticEvent>) request);
-
-               if (TraceDebug.isDEBUG()) {
-                       TraceDebug
-                                       .debug(" Time Window requested, (start adjusted to checkpoint): "
-                                                       + trange.getStartTime()
-                                                       + "-"
-                                                       + trange.getEndTime()
-                                                       + " Total number of processes in the State provider: "
-                                                       + fStateModel.getProcesses().length + " Completed");
-               }
-
-               return request;
-       }
+//     /*
+//      * (non-Javadoc)
+//      * 
+//      * @see org.eclipse.linuxtools.lttng.state.trace.IStateTraceManager#
+//      * executeDataRequest(org.eclipse.linuxtools.tmf.event.TmfTimeRange,
+//      * java.lang.Object,
+//      * org.eclipse.linuxtools.lttng.request.IRequestStatusListener,
+//      * org.eclipse.linuxtools.lttng.state.evProcessor.ITransEventProcessor)
+//      */
+//     public ILttngSyntEventRequest executeDataRequest(TmfTimeRange trange,
+//                     Object source,
+//                     IRequestStatusListener listener, ITransEventProcessor processor) {
+//             TmfTimestamp restoredStartTime = restoreCheckPointByTimestamp(trange
+//                             .getStartTime());
+//             // Adjust the time range to consider rewinding to the start time
+//             trange = new TmfTimeRange(restoredStartTime, trange.getEndTime());
+//             // Get a data request for the time range we want (nearest checkpoint
+//             // to timestamp wanted)
+//
+//             // Process request to that point
+//             ILttngSyntEventRequest request = getDataRequestByTimeRange(trange,
+//                             listener, processor);
+//             request.setSource(source);
+//
+//             // don't wait for completion i.e. allow cancellations
+//             request.startRequestInd(fSynEventProvider);
+//             // fSynEventProvider
+//             // .sendRequest((TmfDataRequest<LttngSyntheticEvent>) request);
+//
+//             if (TraceDebug.isDEBUG()) {
+//                     TraceDebug
+//                                     .debug(" Time Window requested, (start adjusted to checkpoint): "
+//                                                     + trange.getStartTime()
+//                                                     + "-"
+//                                                     + trange.getEndTime()
+//                                                     + " Total number of processes in the State provider: "
+//                                                     + fStateModel.getProcesses().length + " Completed");
+//             }
+//
+//             return request;
+//     }
 
        /*
         * (non-Javadoc)
@@ -242,8 +250,8 @@ public class StateTraceManager extends LTTngTreeNode implements
                // Save a checkpoint every LTTNG_STATE_SAVE_INTERVAL event
                if ((eventCounter.longValue() % fcheckPointInterval) == 0) {
                        LttngTraceState stateCheckPoint;
-                       synchronized (fStateModel) {
-                               stateCheckPoint = fStateModel.clone();
+                       synchronized (fCheckPointStateModel) {
+                               stateCheckPoint = fCheckPointStateModel.clone();
                        }
 
                        TraceDebug.debug("Check point created here: " + eventCounter
@@ -278,16 +286,11 @@ public class StateTraceManager extends LTTngTreeNode implements
                this.fcheckPointInterval = check_point_interval;
        }
 
-       /*
-        * (non-Javadoc)
-        * 
-        * @see
-        * org.eclipse.linuxtools.lttng.state.IStateManager#restoreCheckPointByTimestamp
-        * (org.eclipse.linuxtools.tmf.event.TmfTimestamp)
+       /* (non-Javadoc)
+        * @see org.eclipse.linuxtools.lttng.state.trace.IStateTraceManager#restoreCheckPointByTimestamp(org.eclipse.linuxtools.tmf.event.TmfTimestamp)
         */
        @SuppressWarnings("unchecked")
-       public TmfTimestamp restoreCheckPointByTimestamp(TmfTimestamp eventTime) {
-               TmfTimeRange experimentRange = fExperiment.getTimeRange();
+       public TmfTimestamp restoreCheckPointByTimestamp(TmfTimestamp eventTime) { TmfTimeRange experimentRange = fExperiment.getTimeRange();
                TmfTimestamp nearestTimeStamp = fTrace.getStartTime();
 
                // The GUI can have time limits higher than this log, since GUI can
@@ -297,44 +300,93 @@ public class StateTraceManager extends LTTngTreeNode implements
                        return null;
                }
 
-               // The GUI can have time limits lower than this trace, since experiment
-               // can handle multiple traces
-               if ((eventTime.getValue() < fTrace.getStartTime().getValue())) {
-                       eventTime = fTrace.getStartTime();
-               }
-
-               // Sort the checkpoints, required before the binary search
-               Collections.sort(timestampCheckpointsList);
-               // Initiate the compare with a checkpoint containing the target time
-               // stamp to find
-               int index = Collections.binarySearch(timestampCheckpointsList,
-                               new TmfCheckpoint(eventTime, new TmfLocation<Long>(0L)));
-               // adjust index to round down to earlier checkpoint when exact match not
-               // found
-               index = getPrevIndex(index);
-
+//             // The GUI can have time limits lower than this trace, since experiment
+//             // can handle multiple traces
+//             if ((eventTime.getValue() < fTrace.getStartTime().getValue())) {
+//                     eventTime = fTrace.getStartTime();
+//             }
+//
+//             // Sort the checkpoints, required before the binary search
+//             Collections.sort(timestampCheckpointsList);
+//             // Initiate the compare with a checkpoint containing the target time
+//             // stamp to find
+//             int index = Collections.binarySearch(timestampCheckpointsList,
+//                             new TmfCheckpoint(eventTime, new TmfLocation<Long>(0L)));
+//             // adjust index to round down to earlier checkpoint when exact match not
+//             // found
+//             index = getPrevIndex(index);
+//
                LttngTraceState traceState;
-               if (index == 0) {
-                       // No checkpoint restore is needed, start with a brand new
-                       // TraceState
+//             if (index == 0) {
+//                     // No checkpoint restore is needed, start with a brand new
+//                     // TraceState
+//                     traceState = StateModelFactory.getStateEntryInstance(this);
+
+               // The reference to fCheckPointsStartTime is used as the indicator to
+               // identify a state check point building request
+               if (eventTime == fCheckPointsStartTime) {
+                       // indicates state checkpoint building request
+                       nearestTimeStamp = fCheckPointsStartTime;
+                       // starting from the trace start time with an empty state model
                        traceState = StateModelFactory.getStateEntryInstance(this);
-               } else {
-                       synchronized (checkPointsLock) {
-                               // Useful CheckPoint found
-                               TmfCheckpoint checkpoint = timestampCheckpointsList.get(index);
-                               nearestTimeStamp = checkpoint.getTimestamp();
-                               // get the location associated with the checkpoint
-                               TmfLocation<Long> location = (TmfLocation<Long>) checkpoint
-                                               .getLocation();
-                               // reference a new copy of the checkpoint template
-                               traceState = stateCheckpointsList.get(location.getLocation())
-                                               .clone();
+                       // update the instance field variable pointing the the check point
+                       // building state model
+                       synchronized (fCheckPointStateModel) {
+                               fCheckPointStateModel = traceState;
                        }
-               }
 
-               // Restore the stored traceState
-               synchronized (fStateModel) {
-                       fStateModel = traceState;
+               } else {
+//                     synchronized (checkPointsLock) {
+//                             // Useful CheckPoint found
+//                             TmfCheckpoint checkpoint = timestampCheckpointsList.get(index);
+//                             nearestTimeStamp = checkpoint.getTimestamp();
+//                             // get the location associated with the checkpoint
+//                             TmfLocation<Long> location = (TmfLocation<Long>) checkpoint
+//                                             .getLocation();
+//                             // reference a new copy of the checkpoint template
+//                             traceState = stateCheckpointsList.get(location.getLocation())
+//                                             .clone();
+                               // The GUI requests can have time limits lower than this trace,
+                               // since experiment can handle multiple traces
+                               if ((eventTime.getValue() < fTrace.getStartTime().getValue())) {
+                                       eventTime = fTrace.getStartTime();
+                       }
+//             }
+
+//             // Restore the stored traceState
+//             synchronized (fStateModel) {
+//                     fStateModel = traceState;
+                               // Sort the checkpoints, required before the binary search
+                               Collections.sort(timestampCheckpointsList);
+                               // Initiate the compare with a checkpoint containing the target time
+                               // stamp to find
+                               int index = Collections.binarySearch(timestampCheckpointsList, new TmfCheckpoint(eventTime,
+                                               new TmfLocation<Long>(0L)));
+                               // adjust index to round down to earlier checkpoint when exact match
+                               // not
+                               // found
+                               index = getPrevIndex(index);
+                               
+                               if (index == 0) {
+                                       // No checkpoint restore is needed, start with a brand new
+                                       // TraceState
+                                       traceState = StateModelFactory.getStateEntryInstance(this);
+                               } else {
+                                       synchronized (checkPointsLock) {
+                                               // Useful CheckPoint found
+                                               TmfCheckpoint checkpoint = timestampCheckpointsList.get(index);
+                                               nearestTimeStamp = checkpoint.getTimestamp();
+                                               // get the location associated with the checkpoint
+                                               TmfLocation<Long> location = (TmfLocation<Long>) checkpoint.getLocation();
+                                               // reference a new copy of the checkpoint template
+                                               traceState = stateCheckpointsList.get(location.getLocation()).clone();
+                                       }
+                               }
+                               
+                               // Restore the stored traceState
+                               synchronized (fStateModel) {
+                                       fStateModel = traceState;
+                               }
                }
 
                return nearestTimeStamp;
@@ -388,6 +440,9 @@ public class StateTraceManager extends LTTngTreeNode implements
                                DEFAULT_OFFSET, TmfDataRequest.ALL_DATA, DEFAULT_CHUNK,
                                requestListener, getExperimentTimeWindow(), processor) {
 
+                       /* (non-Javadoc)
+                        * @see org.eclipse.linuxtools.lttng.request.LttngSyntEventRequest#handleCompleted()
+                        */
                        @Override
                        public void handleCompleted() {
                                if (isCancelled() || isFailed()) {
@@ -409,8 +464,10 @@ public class StateTraceManager extends LTTngTreeNode implements
                                                                        + "\tEvents for a different trace state received: "
                                                                        + fprocessor.getFilteredOutEventCount()
                                                                        + "\n\t"
-                                                                       + "Total number of processes in the State provider: "
-                                                                       + fStateModel.getProcesses().length);
+                                                                       + fStateModel.getProcesses().length 
+                                                                       + "\n\t" 
+                                                                       + "Total number of processes in the Check point State model: " 
+                                                                       + fCheckPointStateModel.getProcesses().length);
 
                                        TmfTimeRange logTimes = fTrace.getTimeRange();
                                        sb.append("\n\tTrace time interval for trace "
@@ -431,13 +488,10 @@ public class StateTraceManager extends LTTngTreeNode implements
                                }
                        }
 
-                       /*
-                        * (non-Javadoc)
-                        * 
-                        * @see
-                        * org.eclipse.linuxtools.lttng.request.LttngEventRequest#saveCheckPoint
-                        * (java.lang.Long, org.eclipse.linuxtools.tmf.event.TmfTimestamp)
+                       /* (non-Javadoc)
+                        * @see org.eclipse.linuxtools.lttng.state.trace.StateTraceManager.StateTraceManagerRequest#saveCheckPoint(java.lang.Long, org.eclipse.linuxtools.tmf.event.TmfTimestamp)
                         */
+                       @Override
                        public void saveCheckPoint(Long count, TmfTimestamp time) {
                                saveCheckPointIfNeeded(count, time);
                        }
@@ -475,6 +529,34 @@ public class StateTraceManager extends LTTngTreeNode implements
                }
        }
 
+       /*
+        * (non-Javadoc)
+        * 
+        * @see
+        * org.eclipse.linuxtools.lttng.state.trace.IStateTraceManager#getStateModel
+        * (org.eclipse.linuxtools.tmf.event.TmfTimestamp)
+        */
+       public LttngTraceState getStateModel(TmfTimestamp checkPointReference) {
+               // validate
+               if (checkPointReference == null) {
+                       return null;
+               }
+                       
+               // Only two state models supported at this time e.g. one for checkpoint
+               // building and the second one is shared for UI requests which are
+               // either coalesced or sequential (i.e. within the same trace data
+               // provider)
+               if (checkPointReference == fCheckPointsStartTime) {
+                       synchronized (fCheckPointStateModel) {
+                               return fCheckPointStateModel;
+                       }
+               } else {
+                       synchronized (fStateModel) {
+                               return fStateModel;
+                       }
+               }
+       }
+
        /**
         * @return the stateCheckpointsList
         */
@@ -634,4 +716,64 @@ public class StateTraceManager extends LTTngTreeNode implements
        public ITmfTrace getTraceIdRef() {
                return fTrace;
        }
-}
\ No newline at end of file
+
+       /*
+        * (non-Javadoc)
+        * 
+        * @see
+        * org.eclipse.linuxtools.lttng.state.trace.IStateTraceManager#clearCheckPoints
+        * ()
+        */
+       public void clearCheckPoints() {
+               synchronized (checkPointsLock) {
+                       stateCheckpointsList.clear();
+                       timestampCheckpointsList.clear();
+                       
+                       fCheckPointStateModel = StateModelFactory
+                                       .getStateEntryInstance(this);
+                       try {
+                               fCheckPointStateModel.init(this);
+                       } catch (LttngStateException e) {
+                               e.printStackTrace();
+                       }
+               }
+       }
+       
+       /*
+        * (non-Javadoc)
+        * 
+        * @see
+        * org.eclipse.linuxtools.lttng.state.trace.IStateTraceManager#handleEvent
+        * (org.eclipse.linuxtools.lttng.event.LttngSyntheticEvent, java.lang.Long)
+        */
+       public void handleEvent(LttngSyntheticEvent synEvent, Long eventCount) {
+               fStateUpdateProcessor.process(synEvent, fCheckPointStateModel);
+       
+               // Save checkpoint as needed
+               saveCheckPointIfNeeded(eventCount - 1, synEvent.getTimestamp());
+       }
+               
+       /*
+        * (non-Javadoc)
+        * 
+        * @see java.lang.Object#toString()
+        */
+       public String toString() {
+               StringBuilder sb = new StringBuilder(super.toString());
+               sb.append("\n\tTotal number of processes in the Shared State model: " + fStateModel.getProcesses().length
+                               + "\n\t" + "Total number of processes in the Check point State model: "
+                               + fCheckPointStateModel.getProcesses().length);
+       
+               TmfTimeRange traceTRange = fTrace.getTimeRange();
+               sb.append("\n\tTrace time interval for trace " + fTrace.getName() + "\n\t"
+                               + new LttngTimestamp(traceTRange.getStartTime()));
+               sb.append(" - " + new LttngTimestamp(traceTRange.getEndTime()));
+               sb.append("\n\tCheckPoints available at: ");
+               for (TmfCheckpoint cpoint : timestampCheckpointsList) {
+                       sb.append("\n\t" + "Location: " + cpoint.getLocation() + " - " + cpoint.getTimestamp());
+               }
+       
+               return sb.toString();
+       }
+
+}
index eb15be80d871dc7fc03947d5fa68dbfdefd2573c..8fa150d0ed4079f8ae5fd2bcbd7f557551cba2cc 100644 (file)
@@ -80,12 +80,12 @@ public class LTTngTextTrace extends TmfTrace<LttngEvent> implements ITmfTrace {
                fIndexPageSize = 1000;
                
                // Skip indexing if asked
-               if ( skipIndexing == true ) {
+//             if ( skipIndexing == true ) {
                        fCheckpoints.add(new TmfCheckpoint(new LttngTimestamp(0L), new TmfLocation<Long>(0L)));
-               }
-               else {
-                       indexTrace(true);
-               }
+//             }
+//             else {
+//                     indexTrace(true);
+//             }
                
                Long endTime = currentLttngEvent.getTimestamp().getValue();
                positionToFirstEvent();
index f5f844a140a55fcf96a84f10626af2bb3e44dbf2..a9496e603cb1c2a4e3649c6419ed3cefdd02cda0 100644 (file)
@@ -29,11 +29,11 @@ import org.eclipse.linuxtools.lttng.jni.JniMarker;
 import org.eclipse.linuxtools.lttng.jni.JniTrace;
 import org.eclipse.linuxtools.lttng.jni.JniTracefile;
 import org.eclipse.linuxtools.lttng.jni.common.JniTime;
+import org.eclipse.linuxtools.lttng.jni.exception.JniException;
 import org.eclipse.linuxtools.lttng.jni.factory.JniTraceFactory;
 import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
 import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
 import org.eclipse.linuxtools.tmf.trace.ITmfLocation;
-import org.eclipse.linuxtools.tmf.trace.TmfCheckpoint;
 import org.eclipse.linuxtools.tmf.trace.TmfContext;
 import org.eclipse.linuxtools.tmf.trace.TmfTrace;
 
@@ -156,19 +156,19 @@ public class LTTngTrace extends TmfTrace<LttngEvent> {
         // Set the currentEvent to the eventContent
         eventContent.setEvent(currentLttngEvent);
         
-        // Bypass indexing if asked
-        if ( bypassIndexing == false ) {
-            indexTrace(true);
-        }
-        else {
+//        // Bypass indexing if asked
+//        if ( bypassIndexing == false ) {
+//            indexTrace(true);
+//        }
+//        else {
                // Even if we don't have any index, set ONE checkpoint
-               fCheckpoints.add(new TmfCheckpoint(new LttngTimestamp(0L) , new LttngLocation() ) );
+//             fCheckpoints.add(new TmfCheckpoint(new LttngTimestamp(0L) , new LttngLocation() ) );
                
                // Set the start time of the trace
                setTimeRange( new TmfTimeRange( new LttngTimestamp(currentJniTrace.getStartTime().getTime()), 
                                                                        new LttngTimestamp(currentJniTrace.getEndTime().getTime())
                                          ) );
-        }
+//        }
     }
     
     /*
@@ -210,6 +210,51 @@ public class LTTngTrace extends TmfTrace<LttngEvent> {
        return returnedTrace;
     }
     
+    @Override
+    public LTTngTrace clone() {
+       LTTngTrace clone = null;
+       try {
+               clone = (LTTngTrace) super.clone();
+                       try {
+                               clone.currentJniTrace = JniTraceFactory.getJniTrace(getPath(), SHOW_LTT_DEBUG_DEFAULT);
+                       } catch (JniException e) {
+                               e.printStackTrace();
+                       }
+            
+            // Export all the event types from the JNI side 
+                       clone.traceTypes      = new HashMap<String, LttngEventType>();
+                       clone.traceTypeNames  = new Vector<String>();
+                       clone.initialiseEventTypes(clone.currentJniTrace);
+            
+            // Verify that all those "default constructor" are safe to use
+                       clone.eventTimestamp  = new LttngTimestamp();
+                       clone.eventSource     = new LttngEventSource();
+                       clone.eventType       = new LttngEventType();
+                       clone.eventContent    = new LttngEventContent(clone.currentLttngEvent);
+                       clone.eventReference  = new LttngEventReference(this.getName());
+            
+            // Create the skeleton event
+                       clone.currentLttngEvent = new LttngEvent(this, clone.eventTimestamp, clone.eventSource, clone.eventType, clone.eventContent, clone.eventReference, null);
+            
+            // Create a new current location
+                       clone.previousLocation = new LttngLocation();
+            
+            // Set the currentEvent to the eventContent
+                       clone.eventContent.setEvent(clone.currentLttngEvent);
+            
+               // Set the start time of the trace
+               setTimeRange(new TmfTimeRange(
+                               new LttngTimestamp(clone.currentJniTrace.getStartTime().getTime()), 
+                               new LttngTimestamp(clone.currentJniTrace.getEndTime().getTime())
+                    ));
+       }
+       catch (CloneNotSupportedException e) {
+       }
+
+       return clone;
+    }
+    
+    
     /*
      * Fill out the HashMap with "Type" (Tracefile/Marker)
      * 
@@ -260,65 +305,65 @@ public class LTTngTrace extends TmfTrace<LttngEvent> {
         this.traceTypeNames.add(newTypeKey);
     }
     
-    /**
-     * Index the current trace.
-     * 
-     * @param useless  This boolean is only to comply to the interface and will be ignored.
-     */
-    @Override
-    public synchronized void indexTrace(boolean useless) {
-       
-       long nbEvents=0L;
-       
-       // Start time need to be null to detect none have been set 
-        // LastTime need to exist so we can ajust it as we go
-        LttngTimestamp startTime = null;
-        LttngTimestamp lastTime  = new LttngTimestamp();
-       
-        // Position the trace at the beginning
-        TmfContext context = seekEvent( new LttngTimestamp(0L) );
-        
-        // Read the first event and extract the location
-        LttngEvent tmpEvent = (LttngEvent)getNextEvent(context);
-        
-        // If we read the first event, define the start time.
-        if ( tmpEvent != null ) {
-               startTime = new LttngTimestamp( tmpEvent.getTimestamp() );
-               lastTime.setValue(tmpEvent.getTimestamp().getValue());
-        }
-        
-        // Now, we read each event until we hit the end of the trace
-        // We will create a new checkpoint every "getCacheSize()" event
-        while ( tmpEvent != null) {
-               // Update the last time each time we read a new event
-            lastTime.setValue(tmpEvent.getTimestamp().getValue());
-            
-            // Save a check point if needed
-            if ((nbEvents++ % getCacheSize()) == 0) {
-               // *** IMPORTANT
-               // We need to NEW each stuff we put in checkpoint
-               //      Otherwise everything will be the same!
-                LttngTimestamp tmpTimestamp = new LttngTimestamp( (LttngTimestamp)tmpEvent.getTimestamp() );
-                LttngLocation  newLocation  = new LttngLocation(  (LttngTimestamp)tmpEvent.getTimestamp() );
-                
-                fCheckpoints.add(new TmfCheckpoint(tmpTimestamp, newLocation ) );
-            }
-            // Read the next event
-            tmpEvent = (LttngEvent)getNextEvent(context);
-        }
-        
-        // If we have a start time, we should have an end time as well
-        // Issue the new range
-        if (startTime != null) {
-            setTimeRange( new TmfTimeRange(startTime, lastTime) );
-            notifyListeners(getTimeRange() );
-        }
-        
-        // Ajust the total number of event in the trace
-        fNbEvents = nbEvents;
-        //printCheckpointsVector();
-        //printDebug = true;
-    }
+//    /**
+//     * Index the current trace.
+//     * 
+//     * @param useless  This boolean is only to comply to the interface and will be ignored.
+//     */
+//    @Override
+//    public synchronized void indexTrace(boolean useless) {
+//     
+//     long nbEvents=0L;
+//     
+//     // Start time need to be null to detect none have been set 
+//        // LastTime need to exist so we can ajust it as we go
+//        LttngTimestamp startTime = null;
+//        LttngTimestamp lastTime  = new LttngTimestamp();
+//     
+//        // Position the trace at the beginning
+//        TmfContext context = seekEvent( new LttngTimestamp(0L) );
+//        
+//        // Read the first event and extract the location
+//        LttngEvent tmpEvent = (LttngEvent)getNextEvent(context);
+//        
+//        // If we read the first event, define the start time.
+//        if ( tmpEvent != null ) {
+//             startTime = new LttngTimestamp( tmpEvent.getTimestamp() );
+//             lastTime.setValue(tmpEvent.getTimestamp().getValue());
+//        }
+//        
+//        // Now, we read each event until we hit the end of the trace
+//        // We will create a new checkpoint every "getCacheSize()" event
+//        while ( tmpEvent != null) {
+//             // Update the last time each time we read a new event
+//            lastTime.setValue(tmpEvent.getTimestamp().getValue());
+//            
+//            // Save a check point if needed
+//            if ((nbEvents++ % getCacheSize()) == 0) {
+//             // *** IMPORTANT
+//             // We need to NEW each stuff we put in checkpoint
+//             //      Otherwise everything will be the same!
+//                LttngTimestamp tmpTimestamp = new LttngTimestamp( (LttngTimestamp)tmpEvent.getTimestamp() );
+//                LttngLocation  newLocation  = new LttngLocation(  (LttngTimestamp)tmpEvent.getTimestamp() );
+//                
+//                fCheckpoints.add(new TmfCheckpoint(tmpTimestamp, newLocation ) );
+//            }
+//            // Read the next event
+//            tmpEvent = (LttngEvent)getNextEvent(context);
+//        }
+//        
+//        // If we have a start time, we should have an end time as well
+//        // Issue the new range
+//        if (startTime != null) {
+//            setTimeRange( new TmfTimeRange(startTime, lastTime) );
+//            notifyListeners(getTimeRange() );
+//        }
+//        
+//        // Ajust the total number of event in the trace
+//        fNbEvents = nbEvents;
+//        //printCheckpointsVector();
+//        //printDebug = true;
+//    }
     
     /**
      * Return the latest saved location.
@@ -489,6 +534,8 @@ public class LTTngTrace extends TmfTrace<LttngEvent> {
      * @see org.eclipse.linuxtools.lttng.event.LttngLocation
      * @see org.eclipse.linuxtools.tmf.trace.TmfContext
      */
+
+    public int nbEventsRead = 0;
     @Override
     public synchronized LttngEvent getNextEvent(TmfContext context) {
        
@@ -517,7 +564,7 @@ public class LTTngTrace extends TmfTrace<LttngEvent> {
        // To do so, we avoid moving for call to "GetNextEvent()" that follow call to a call to "ParseEvent()".
        // However, calling ParseEvent() -> GetNextEvent() -> GetNextEvent() will only move next by one.
        
-       // *** Positionning trick :
+       // *** Positioning trick :
        // GetNextEvent only read the trace if : 
        // 1- The last operation was NOT a ParseEvent --> A read is required
        //      OR
@@ -533,6 +580,7 @@ public class LTTngTrace extends TmfTrace<LttngEvent> {
                        }
                        // Read the next event from the trace. The last one will NO LONGER BE VALID.
                returnedEvent = readEvent(curLocation);
+               nbEventsRead++;
                
                // Set the operation marker as read to both location, to be able to detect we did "read" this event
                previousLocation.setLastOperationReadNext();
@@ -552,6 +600,9 @@ public class LTTngTrace extends TmfTrace<LttngEvent> {
        if ( returnedEvent != null ) {
                previousLocation.setOperationTime((LttngTimestamp)returnedEvent.getTimestamp());
                curLocation.setOperationTime((LttngTimestamp)returnedEvent.getTimestamp());
+               
+               updateIndex(context, context.getRank(), returnedEvent.getTimestamp());
+               context.updateRank(1);
        }
        
        return returnedEvent;
index 104fddca7d46c40acc821a9f311ef78b20289bb5..cdb88b1a1ba796c79e6a59b792e08ba7ddeee82d 100644 (file)
@@ -76,7 +76,7 @@ public class TmfExperimentTest extends TestCase {
     private void setupExperiment() {
        if (fExperiment == null) {
             fExperiment = new TmfExperiment<TmfEvent>(TmfEvent.class, EXPERIMENT, fTraces);
-            fExperiment.indexExperiment(true);
+            fExperiment.indexExperiment();
        }
     }
 
@@ -137,7 +137,7 @@ public class TmfExperimentTest extends TestCase {
 
     public void testParseEvent() throws Exception {
 
-       // On lower bound, returns the first event (ts = 0)
+       // On lower bound, returns the first event (ts = 1)
        TmfContext context = fExperiment.seekEvent(new TmfTimestamp(0, SCALE, 0));
 
        TmfEvent event = fExperiment.parseEvent(context);
index 0a64504b50f3d8d937edaa240c62d8cbb1bbb14c..4d62567007d83c9b8ba5876dbfcc4704e00a270f 100644 (file)
@@ -79,7 +79,7 @@ public class TmfMultiTraceExperimentTest extends TestCase {
     private void setupExperiment() {
        if (fExperiment == null) {
             fExperiment = new TmfExperiment<TmfEvent>(TmfEvent.class, EXPERIMENT, fTrace);
-            fExperiment.indexExperiment(true);
+            fExperiment.indexExperiment();
        }
     }
 
index 54550ed484b3b7f0e62e9920814e6531f7dcf694..f5e0d9a13152a7b185c5471ccfa69dd6bd88c87d 100644 (file)
@@ -73,7 +73,7 @@ public class TmfContextTest extends TestCase {
        public void testTmfContextDefault() {
                TmfContext context = new TmfContext();
                assertEquals("getLocation", null, context.getLocation());
-               assertEquals("getRank",        0, context.getRank());
+               assertEquals("getRank", TmfContext.UNKNOWN_RANK, context.getRank());
        }
 
        public void testTmfContextNoRank() {
@@ -85,9 +85,9 @@ public class TmfContextTest extends TestCase {
                assertEquals("getLocation", fLocation2, context2.getLocation());
                assertEquals("getLocation", fLocation3, context3.getLocation());
 
-               assertEquals("getRank", 0, context1.getRank());
-               assertEquals("getRank", 0, context2.getRank());
-               assertEquals("getRank", 0, context3.getRank());
+               assertEquals("getRank", TmfContext.UNKNOWN_RANK, context1.getRank());
+               assertEquals("getRank", TmfContext.UNKNOWN_RANK, context2.getRank());
+               assertEquals("getRank", TmfContext.UNKNOWN_RANK, context3.getRank());
        }
 
        public void testTmfContext() {
index e9a2711c0f8bd0eaff42f3ec593e3927410e6028..265a0b49117847a3c96b4c753b4c583c39092898 100644 (file)
@@ -76,7 +76,7 @@ public class TmfExperimentTest extends TestCase {
     private void setupExperiment() {
        if (fExperiment == null) {
             fExperiment = new TmfExperiment<TmfEvent>(TmfEvent.class, EXPERIMENT, fTraces);
-            fExperiment.indexExperiment(true);
+            fExperiment.indexExperiment();
        }
     }
 
index f5b51aab43323409b7bec1707caff48f87648d4b..43688b7d519a7d04526a5e2032059091df6c213c 100644 (file)
@@ -85,7 +85,7 @@ public class TmfTraceTest extends TestCase {
                URL location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(path), null);
                        File test = new File(FileLocator.toFileURL(location).toURI());
                fTrace = new TmfTraceStub(test.getPath(), BLOCK_SIZE, false);
-               fTrace.indexTrace(true);
+//             fTrace.indexTrace(true);
                } catch (URISyntaxException e) {
                        e.printStackTrace();
                } catch (IOException e) {
index 6f2f65bd3b9167a317749685bab0e6601445c6b5..2afdc4c0c8556da29e16ce954621bd464e747b7e 100644 (file)
@@ -65,7 +65,7 @@ public class TmfSyntheticEventProviderStub extends TmfEventProvider<TmfSynthetic
                        }
                }
                };
-        provider.sendRequest(subRequest); // , false);
+        provider.sendRequest(subRequest);
 
         // Return a dummy context
         return new TmfContext();
@@ -73,8 +73,22 @@ public class TmfSyntheticEventProviderStub extends TmfEventProvider<TmfSynthetic
 
        // Queue 2 synthetic events per base event
        private void handleIncomingData(TmfEvent e) {
-               queueResult(new TmfSyntheticEventStub(e));
-               queueResult(new TmfSyntheticEventStub(e));
+               try {
+                       queueResult(new TmfSyntheticEventStub(e));
+                       queueResult(new TmfSyntheticEventStub(e));
+               } catch (InterruptedException e1) {
+                       e1.printStackTrace();
+               }
+       }
+
+       @Override
+       public void sendRequest(ITmfDataRequest<TmfSyntheticEventStub> request, ExecutionType execType) {
+               super.sendRequest(request, execType);
+       }
+       
+       @Override
+       public void sendRequest(ITmfDataRequest<TmfSyntheticEventStub> request) {
+               super.sendRequest(request);
        }
        
 }
index 99ac6f41b847b4e72c64e0f2a0f9242a80508682..bef803b40f05af738143aa72d3503e75848ce4ee 100644 (file)
@@ -18,6 +18,7 @@ import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
 import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
 import org.eclipse.linuxtools.tmf.signal.TmfExperimentSelectedSignal;
 import org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal;
+import org.eclipse.linuxtools.tmf.signal.TmfRangeSynchSignal;
 import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
 import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal;
 import org.eclipse.swt.SWT;
@@ -168,6 +169,7 @@ public class TmfEventsView extends TmfView {
                                                        cache = tmpEvent;
                                                        cacheStartIndex = index;
                                                        cacheEndIndex = index + tmpEvent.length;
+//                                                     System.out.println("TmfTableView: entry#" + index);
                                                }
                                        }
                                };
@@ -258,7 +260,6 @@ public class TmfEventsView extends TmfView {
         // Perform the updates on the UI thread
         fTable.getDisplay().asyncExec(new Runnable() {
                public void run() {
-                       // TODO: Potentially long operation. Add some feedback for the user
                                fTable.setSelection(0);
                fTable.clearAll();
                                cacheStartIndex = cacheEndIndex = 0;    // Clear the cache
@@ -273,12 +274,31 @@ public class TmfEventsView extends TmfView {
        fTable.getDisplay().asyncExec(new Runnable() {
                        public void run() {
                                if (!fTable.isDisposed() && fExperiment != null) {
-                               fTable.setItemCount((int) fExperiment.getNbEvents());        
+                                       int nbEvents = (int) fExperiment.getNbEvents();
+                               fTable.setItemCount((nbEvents > 100) ? nbEvents : 100);        
                                }
                        }
         });
     }
 
+       private boolean fRefreshPending = false;
+       @TmfSignalHandler
+    public synchronized void rangeSynched(TmfRangeSynchSignal signal) {
+               if (!fRefreshPending) {
+                       // Perform the refresh on the UI thread
+                       fRefreshPending = true;
+                       fTable.getDisplay().asyncExec(new Runnable() {
+                               public void run() {
+                                       fRefreshPending = false;
+                                       if (!fTable.isDisposed() && fExperiment != null) {
+                                               fTable.setItemCount((int) fExperiment.getNbEvents());
+//                                             if (Tracer.INTERNALS) Tracer.trace("TmfEventsView: itemCount=" + fTable.getItemCount());
+                                       }
+                               }
+                       });
+               }
+    }
+
 //    @TmfSignalHandler
 //    public void currentTimeUpdated(TmfTimeSynchSignal signal) {
 //     if (signal.getSource() != fTable && fExperiment != null) {
index 8b5ba374724c83c85a59e6d780fbed3254f140ed..756702471db4014487c7dc70b5efc0c1aa349622 100644 (file)
@@ -1,2 +1,7 @@
-org.eclipse.linuxtools.tmf/trace=false
+org.eclipse.linuxtools.tmf/component=false
+org.eclipse.linuxtools.tmf/request=false
+org.eclipse.linuxtools.tmf/event=false
 
+org.eclipse.linuxtools.tmf/exceptions=false
+org.eclipse.linuxtools.tmf/signals=false
+org.eclipse.linuxtools.tmf/internals=false
index 089e8801b7a192f8c19b62b2c0dfb0b716eeb448..b9b9f97335f76c7f0c4450af3f19c211c8e70526 100644 (file)
 package org.eclipse.linuxtools.tmf;\r
 \r
+import java.io.BufferedWriter;\r
+import java.io.FileWriter;\r
+import java.io.IOException;\r
+\r
 import org.eclipse.core.runtime.Platform;\r
+import org.eclipse.linuxtools.tmf.component.ITmfComponent;\r
+import org.eclipse.linuxtools.tmf.component.ITmfDataProvider;\r
+import org.eclipse.linuxtools.tmf.event.TmfData;\r
+import org.eclipse.linuxtools.tmf.request.ITmfDataRequest;\r
 \r
 public class Tracer {\r
 \r
-       static Boolean TRACE = Boolean.FALSE;\r
-\r
        private static String pluginID = TmfCorePlugin.PLUGIN_ID;\r
 \r
+       static Boolean ERROR     = Boolean.FALSE;\r
+\r
+       static Boolean COMPONENT = Boolean.FALSE;\r
+       static Boolean REQUEST   = Boolean.FALSE;\r
+       static Boolean EVENT     = Boolean.FALSE;\r
+       static Boolean EXCEPTION = Boolean.FALSE;\r
+\r
+//     static Boolean SIGNALS    = Boolean.FALSE;\r
+//     static Boolean INTERNALS  = Boolean.FALSE;\r
+\r
+       private static BufferedWriter fTraceLog = null;\r
+\r
+       private static BufferedWriter openLogFile(String filename) {\r
+               BufferedWriter outfile = null;\r
+               try {\r
+                       outfile = new BufferedWriter(new FileWriter(filename));\r
+               } catch (IOException e) {\r
+                       e.printStackTrace();\r
+               }\r
+               return outfile;\r
+       }\r
+\r
        public static void init() {\r
-               String traceKey = Platform.getDebugOption(pluginID + "/trace");\r
 \r
+               String traceKey;\r
+               \r
+               traceKey = Platform.getDebugOption(pluginID + "/error");\r
+               if (traceKey != null) {\r
+                       ERROR = (new Boolean(traceKey)).booleanValue();\r
+               }\r
+\r
+               traceKey = Platform.getDebugOption(pluginID + "/component");\r
+               if (traceKey != null) {\r
+                       COMPONENT = (new Boolean(traceKey)).booleanValue();\r
+               }\r
+\r
+               traceKey = Platform.getDebugOption(pluginID + "/request");\r
                if (traceKey != null) {\r
-                       TRACE = (new Boolean(traceKey)).booleanValue();\r
+                       REQUEST = (new Boolean(traceKey)).booleanValue();\r
                }\r
+\r
+               traceKey = Platform.getDebugOption(pluginID + "/event");\r
+               if (traceKey != null) {\r
+                       EVENT = (new Boolean(traceKey)).booleanValue();\r
+               }\r
+\r
+               traceKey = Platform.getDebugOption(pluginID + "/exception");\r
+               if (traceKey != null) {\r
+                       EXCEPTION = (new Boolean(traceKey)).booleanValue();\r
+               }\r
+\r
+               // Create trace log file if needed\r
+               if (ERROR || COMPONENT || REQUEST || EVENT || EXCEPTION) {\r
+                       fTraceLog = openLogFile("trace.log");\r
+               }\r
+\r
+//             String signalsKey = Platform.getDebugOption(pluginID + "/signals");\r
+//             if (signalsKey != null) {\r
+//                     SIGNALS = (new Boolean(signalsKey)).booleanValue();\r
+//             }\r
+//\r
+//             String internalsKey = Platform.getDebugOption(pluginID + "/internals");\r
+//             if (internalsKey != null) {\r
+//                     INTERNALS = (new Boolean(signalsKey)).booleanValue();\r
+//             }\r
+       }\r
+\r
+       // Predicates\r
+       public static boolean isErrorTraced() {\r
+               return ERROR;\r
        }\r
 \r
-       public static void trace(String message) {\r
-               if (TRACE) {\r
-                       System.out.println(Thread.currentThread() + ": " + message);\r
+       public static boolean isComponentTraced() {\r
+               return COMPONENT;\r
+       }\r
+       \r
+       public static boolean isRequestTraced() {\r
+               return REQUEST;\r
+       }\r
+       \r
+       public static boolean isEventTraced() {\r
+               return EVENT;\r
+       }\r
+       \r
+       public static boolean isExceptionTraced() {\r
+               return EXCEPTION;\r
+       }\r
+\r
+       // Tracers\r
+       private static void trace(String message) {\r
+               System.out.println(message);\r
+               try {\r
+                       if (fTraceLog != null) {\r
+                               fTraceLog.write(message);\r
+                               fTraceLog.newLine();\r
+                               fTraceLog.flush();\r
+                       }\r
+               } catch (IOException e) {\r
+                       e.printStackTrace();\r
                }\r
        }\r
+\r
+       public static void traceComponent(ITmfComponent component, String msg) {\r
+               String message = ("[CMP] Thread=" + Thread.currentThread().getId() + " Cmp=" + component.getName() + " " + msg);\r
+               trace(message);\r
+       }\r
+\r
+       public static void traceRequest(ITmfDataRequest<?> request, String msg) {\r
+               String message = ("[REQ] Thread=" + Thread.currentThread().getId() + " Req=" + request.getRequestId() + ", Type=" + request.getDataType().getSimpleName() + " " + msg);\r
+               trace(message);\r
+       }\r
+\r
+       public static void traceEvent(ITmfDataProvider<?> provider, ITmfDataRequest<?> request, TmfData data) {\r
+               String message = ("[EVT] Provider=" + provider.toString() + ", Req=" + request.getRequestId() + ", Event=" + data.toString());\r
+               trace(message);\r
+       }\r
+\r
+       public static void traceException(Exception e) {\r
+       }\r
+\r
+       \r
+       public static void traceError(String msg) {\r
+               String message = ("[ERR] Thread=" + Thread.currentThread().getId() + msg);\r
+               trace(message);\r
+       }\r
+\r
+//     public static void traceComponent(String message) {\r
+//             if (COMPONENTS)\r
+//                     trace(Thread.currentThread() + ": " + message);\r
+//     }\r
+//\r
+//     public static void traceSignal(TmfSignal signal) {\r
+//             if (SIGNALS)\r
+//                     trace(Thread.currentThread() + ": " + signal.toString());\r
+//     }\r
+//\r
+//     public static void traceInternal(String message) {\r
+//             if (INTERNALS)\r
+//                     trace(Thread.currentThread() + ": " + message);\r
+//     }\r
+\r
 }\r
index 8d50d905f452ff484a3e19e931323337b6a17f4d..fd0afbc4ec71e9c8b22fd150612657a713b4e75a 100644 (file)
@@ -1,10 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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:
+ *   Francois Chouinard - Initial API and implementation
+ *******************************************************************************/
+
 package org.eclipse.linuxtools.tmf.component;
 
 import org.eclipse.linuxtools.tmf.event.TmfData;
 import org.eclipse.linuxtools.tmf.request.ITmfDataRequest;
 
+/**
+ * <b><u>ITmfDataRequest</u></b>
+ * <p>
+ * TODO: Implement me. Please.
+ */
 public interface ITmfDataProvider<T extends TmfData> {
 
+       // ------------------------------------------------------------------------
+       // Constants
+       // ------------------------------------------------------------------------
+
+    public enum ExecutionType { SHORT, LONG };
+    
     /**
      * Queues the request for processing.
      * 
@@ -13,5 +36,7 @@ public interface ITmfDataProvider<T extends TmfData> {
         * @param request The request to process
         */
        public void sendRequest(ITmfDataRequest<T> request);
+       public void sendRequest(ITmfDataRequest<T> request, ExecutionType type);
+       public void fireRequests();
 
 }
index 276045842dd90da550802f0aa06bd3eb2d8a5e9f..4a6082bff81302e26882bd1affb00a27e2ebf780 100644 (file)
@@ -12,6 +12,7 @@
 
 package org.eclipse.linuxtools.tmf.component;
 
+import org.eclipse.linuxtools.tmf.Tracer;
 import org.eclipse.linuxtools.tmf.signal.TmfSignal;
 import org.eclipse.linuxtools.tmf.signal.TmfSignalManager;
 
@@ -32,6 +33,7 @@ public abstract class TmfComponent implements ITmfComponent {
 
        public TmfComponent(String name) {
                fName = name;
+               if (Tracer.isComponentTraced()) Tracer.traceComponent(this, "created");
                TmfSignalManager.register(this);
        }
        
@@ -65,6 +67,7 @@ public abstract class TmfComponent implements ITmfComponent {
         */
        public void dispose() {
                TmfSignalManager.deregister(this);
+               if (Tracer.isComponentTraced()) Tracer.traceComponent(this, "terminated");
        }
 
        /* (non-Javadoc)
index d93a6b6f741e6e0b767948f3d8dc72571c1154ac..e7fbc69ab1da2190850b41a156e2005f24ec1c57 100644 (file)
@@ -17,6 +17,7 @@ import java.util.Vector;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.TimeUnit;
 
 import org.eclipse.linuxtools.tmf.Tracer;
 import org.eclipse.linuxtools.tmf.event.TmfData;
@@ -45,13 +46,15 @@ import org.eclipse.linuxtools.tmf.trace.ITmfContext;
 public abstract class TmfDataProvider<T extends TmfData> extends TmfComponent implements ITmfDataProvider<T> {
 
        final protected Class<T> fType;
+       final protected boolean  fLogData;
+       final protected boolean  fLogException;
 
        public static final int DEFAULT_QUEUE_SIZE = 1000;
        protected final int fQueueSize;
        protected final BlockingQueue<T> fDataQueue;
        protected final TmfRequestExecutor fExecutor;
 
-       private int fCoalescingLevel = 0;
+       private int fSignalDepth = 0;
 
        // ------------------------------------------------------------------------
        // Constructors
@@ -67,13 +70,16 @@ public abstract class TmfDataProvider<T extends TmfData> extends TmfComponent im
                fQueueSize = queueSize;
                fDataQueue = (queueSize > 1) ? new LinkedBlockingQueue<T>(fQueueSize) : new SynchronousQueue<T>();
 
-        Tracer.trace(getName() + " created");
+//        Tracer.traceComponent(getName() + " created");
 
         fExecutor = new TmfRequestExecutor();
-               fCoalescingLevel = 0;
+               fSignalDepth = 0;
+
+               fLogData = Tracer.isEventTraced();
+               fLogException = Tracer.isEventTraced();
 
                TmfProviderManager.register(fType, this);
-        Tracer.trace(getName() + " started");
+//             Tracer.traceComponent(getName() + " started");
 }
        
        public TmfDataProvider(TmfDataProvider<T> other) {
@@ -83,14 +89,18 @@ public abstract class TmfDataProvider<T extends TmfData> extends TmfComponent im
         fDataQueue = (fQueueSize > 1) ? new LinkedBlockingQueue<T>(fQueueSize) : new SynchronousQueue<T>();
 
         fExecutor = new TmfRequestExecutor();
-        fCoalescingLevel = 0;
+        fSignalDepth = 0;
+
+        fLogData = Tracer.isEventTraced();
+               fLogException = Tracer.isEventTraced();
        }
        
        @Override
        public void dispose() {
                TmfProviderManager.deregister(fType, this);
                fExecutor.stop();
-        Tracer.trace(getName() + " stopped");
+//             Tracer.traceComponent(getName() + " stopped");
+               if (fClone != null) fClone.dispose();
                super.dispose();
        }
 
@@ -106,15 +116,25 @@ public abstract class TmfDataProvider<T extends TmfData> extends TmfComponent im
        // ITmfRequestHandler
        // ------------------------------------------------------------------------
 
+//     public synchronized void sendRequest(final ITmfDataRequest<T> request, ExecutionType execType) {
+//             sendRequest(request);
+//     }
+
        public synchronized void sendRequest(final ITmfDataRequest<T> request) {
+               sendRequest(request, ExecutionType.SHORT);
+       }
 
-               if (fCoalescingLevel > 0) {
-                       // We are in coalescing mode: client should NEVER wait
-                       // (otherwise we will have deadlock...)
-                       coalesceDataRequest(request);
-               } else {
-                       // Process the request immediately 
-                       queueRequest(request);
+       protected TmfDataProvider<T> fClone;
+       public synchronized void sendRequest(final ITmfDataRequest<T> request, ExecutionType execType) {
+               if (fClone == null || execType == ExecutionType.SHORT) {
+                       if (fSignalDepth > 0) {
+                               coalesceDataRequest(request);
+                       } else {
+                               queueRequest(request);
+                       }
+               }
+               else {
+                       fClone.sendRequest(request);
                }
        }
 
@@ -123,11 +143,14 @@ public abstract class TmfDataProvider<T extends TmfData> extends TmfComponent im
         * 
         * @param thread
         */
-       private synchronized void fireRequests() {
+       public synchronized void fireRequests() {
                for (TmfDataRequest<T> request : fPendingCoalescedRequests) {
                        queueRequest(request);
                }
                fPendingCoalescedRequests.clear();
+
+               if (fClone != null)
+                       fClone.fireRequests();
        }
 
        // ------------------------------------------------------------------------
@@ -159,8 +182,9 @@ public abstract class TmfDataProvider<T extends TmfData> extends TmfComponent im
 
        protected void queueRequest(final ITmfDataRequest<T> request) {
 
-               final String provider = getName();
-               
+//             final String provider = getName();
+               final ITmfDataProvider<T> provider = this;
+
                // Process the request
                Thread thread = new Thread() {
 
@@ -168,6 +192,7 @@ public abstract class TmfDataProvider<T extends TmfData> extends TmfComponent im
                        public void run() {
 
                                // Extract the generic information
+                               request.start();
                                int blockSize   = request.getBlockize();
                                int nbRequested = request.getNbRequested();
                         
@@ -178,33 +203,42 @@ public abstract class TmfDataProvider<T extends TmfData> extends TmfComponent im
                                // Initialize the execution
                                ITmfContext context = armRequest(request);
                                if (context == null) {
-                                       request.fail();
+                                       request.cancel();
                                        return;
                                }
 
-                               // Get the ordered events
-                               Tracer.trace("Request #" + request.getRequestId() + " is serviced by " + provider);
-                               T data = getNext(context);
-                               Tracer.trace("Request #" + request.getRequestId() + " read first event");
-                               while (data != null && !isCompleted(request, data, nbRead))
-                               {
-                                       result.add(data);
-                                       if (++nbRead % blockSize == 0) {
-                                               pushData(request, result);
-                                       }
-                                       // To avoid an unnecessary read passed the last data requested
-                                       if (nbRead < nbRequested) {
-                                               data = getNext(context);
-                                               if (data == null || data.isNullRef()) {
-                                                       Tracer.trace("Request #" + request.getRequestId() + " end of data");
+                               try {
+                                       // Get the ordered events
+//                                     Tracer.traceLog("Request #" + request.getRequestId() + " is serviced by " + provider);
+                                       T data = getNext(context);
+//                                     Tracer.traceLog("Request #" + request.getRequestId() + " read first event");
+                                       while (data != null && !isCompleted(request, data, nbRead))
+                                       {
+                                               if (fLogData) Tracer.traceEvent(provider, request, data);
+                                               result.add(data);
+                                               if (++nbRead % blockSize == 0) {
+                                                       pushData(request, result);
+                                               }
+                                               // To avoid an unnecessary read passed the last data requested
+                                               if (nbRead < nbRequested) {
+                                                       data = getNext(context);
+                                                       if (data == null || data.isNullRef()) {
+//                                                             Tracer.traceLog("Request #" + request.getRequestId() + " end of data");
+                                                       }
                                                }
                                        }
+                                       pushData(request, result);
+                                       request.done();
+                               }
+                               catch (Exception e) {
+                                       e.printStackTrace();
+                                       if (fLogException) Tracer.traceException(e);
+                                       request.fail();
                                }
-                               pushData(request, result);
-                               request.done();
                        }
                };
                fExecutor.execute(thread);
+        if (Tracer.isRequestTraced()) Tracer.traceRequest(request, "queued");
        }
 
        /**
@@ -243,14 +277,14 @@ public abstract class TmfDataProvider<T extends TmfData> extends TmfComponent im
         * @param context
         * @return
         */
-       public T getNext(ITmfContext context) {
-               try {
-                       T event = fDataQueue.take();
-                       return event;
-               } catch (InterruptedException e) {
-                       e.printStackTrace();
+       private final int TIMEOUT = 5000;
+       public T getNext(ITmfContext context) throws InterruptedException {
+               T event = fDataQueue.poll(TIMEOUT, TimeUnit.MILLISECONDS);
+               if (event == null) {
+                       if (Tracer.isErrorTraced()) Tracer.traceError("Request timeout on read");
+                       throw new InterruptedException();
                }
-               return null;
+               return event;
        }
 
        /**
@@ -258,11 +292,11 @@ public abstract class TmfDataProvider<T extends TmfData> extends TmfComponent im
         * 
         * @param data
         */
-       public void queueResult(T data) {
-               try {
-                       fDataQueue.put(data);
-               } catch (InterruptedException e1) {
-                       e1.printStackTrace();
+       public void queueResult(T data) throws InterruptedException {
+               boolean ok = fDataQueue.offer(data, TIMEOUT, TimeUnit.MILLISECONDS);
+               if (!ok) {
+                       if (Tracer.isErrorTraced()) Tracer.traceError("Request timeout on write");
+                       throw new InterruptedException();
                }
        }
 
@@ -284,15 +318,15 @@ public abstract class TmfDataProvider<T extends TmfData> extends TmfComponent im
        @TmfSignalHandler
        public void startSynch(TmfStartSynchSignal signal) {
                synchronized(this) {
-                       fCoalescingLevel++;
+                       fSignalDepth++;
                }
        }
 
        @TmfSignalHandler
        public void endSynch(TmfEndSynchSignal signal) {
                synchronized(this) {
-                       fCoalescingLevel--;
-                       if (fCoalescingLevel == 0) {
+                       fSignalDepth--;
+                       if (fSignalDepth == 0) {
                                fireRequests();
                        }
                }
index 014bd828e661b4cf822d626fb9ba8d23dec20200..4f0c6c8d50025ebb88f9e8a485f37c08cbb2b81a 100644 (file)
@@ -97,6 +97,18 @@ public class TmfTimeRange {
                return (fStartTime.compareTo(ts, true) <= 0) && (fEndTime.compareTo(ts, true) >= 0);
        }
 
+       /**
+        * Check if the time range is within the time range
+        * 
+        * @param range
+        * @return
+        */
+       public boolean contains(TmfTimeRange range) {
+               TmfTimestamp startTime = range.getStartTime();
+               TmfTimestamp endTime   = range.getEndTime();
+               return (fStartTime.compareTo(startTime, true) <= 0) && (fEndTime.compareTo(endTime, true) >= 0);
+       }
+
        // ------------------------------------------------------------------------
     // Object
        // ------------------------------------------------------------------------
index 47a2c7c2df92be37fcdb18f3934f0a5dd2acfd9f..cfeed550c6218d76fe18e9db70a6f83423438928 100644 (file)
@@ -15,20 +15,18 @@ package org.eclipse.linuxtools.tmf.experiment;
 import java.util.Collections;
 import java.util.Vector;
 
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.linuxtools.tmf.component.TmfEventProvider;
 import org.eclipse.linuxtools.tmf.event.TmfEvent;
 import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
 import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
 import org.eclipse.linuxtools.tmf.request.ITmfDataRequest;
 import org.eclipse.linuxtools.tmf.request.ITmfEventRequest;
+import org.eclipse.linuxtools.tmf.request.TmfDataRequest;
+import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
 import org.eclipse.linuxtools.tmf.signal.TmfExperimentSelectedSignal;
 import org.eclipse.linuxtools.tmf.signal.TmfExperimentUpdatedSignal;
-import org.eclipse.linuxtools.tmf.signal.TmfRangeSynchSignal;
 import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;
+import org.eclipse.linuxtools.tmf.signal.TmfSignalManager;
 import org.eclipse.linuxtools.tmf.signal.TmfTraceUpdatedSignal;
 import org.eclipse.linuxtools.tmf.trace.ITmfContext;
 import org.eclipse.linuxtools.tmf.trace.ITmfLocation;
@@ -52,7 +50,7 @@ public class TmfExperiment<T extends TmfEvent> extends TmfEventProvider<T> imple
        // The currently selected experiment
     private static TmfExperiment<?> fCurrentExperiment = null;
 
-    // The set of traces that constitute the experiment
+       // The set of traces that constitute the experiment
     private ITmfTrace[] fTraces;
 
     // The total number of events
@@ -84,10 +82,11 @@ public class TmfExperiment<T extends TmfEvent> extends TmfEventProvider<T> imple
        fTraces = traces;
        fEpoch = epoch;
        fIndexPageSize = indexPageSize;
+       fClone = createTraceCopy();
 
                updateNbEvents();
                updateTimeRange();
-    }
+       }
 
     /**
      * @param type
@@ -108,9 +107,8 @@ public class TmfExperiment<T extends TmfEvent> extends TmfEventProvider<T> imple
         this(type, id, traces, TmfTimestamp.Zero, indexPageSize);
     }
     
-    
     public TmfExperiment(TmfExperiment<T> other) {
-       super(other.getName(), other.fType);
+       super(other.getName() + "(clone)", other.fType);
        
        fEpoch         = other.fEpoch;
        fIndexPageSize = other.fIndexPageSize;
@@ -122,10 +120,13 @@ public class TmfExperiment<T extends TmfEvent> extends TmfEventProvider<T> imple
        
        fNbEvents  = other.fNbEvents;
        fTimeRange = other.fTimeRange;
+       fClone = null;
     }
     
        public TmfExperiment<T> createTraceCopy() {
-               return new TmfExperiment<T>(this);
+               TmfExperiment<T> experiment = new TmfExperiment<T>(this);
+               TmfSignalManager.deregister(experiment);
+               return experiment;
        }
     
     /**
@@ -133,10 +134,10 @@ public class TmfExperiment<T extends TmfEvent> extends TmfEventProvider<T> imple
      */
     @Override
        public void dispose() {
-       for (ITmfTrace trace : fTraces) {
-               trace.dispose();
-       }
-       fTraces = null;
+               for (ITmfTrace trace : fTraces) {
+                       trace.dispose();
+               }
+               fTraces = null;
        fCheckpoints.clear();
         super.dispose();
     }
@@ -276,7 +277,7 @@ public class TmfExperiment<T extends TmfEvent> extends TmfEventProvider<T> imple
                return null;
        }
 
-    // ------------------------------------------------------------------------
+       // ------------------------------------------------------------------------
     // ITmfTrace trace positioning
     // ------------------------------------------------------------------------
 
@@ -444,6 +445,7 @@ public class TmfExperiment<T extends TmfEvent> extends TmfEventProvider<T> imple
                // Update the experiment context and set the "next" event
                TmfEvent event = null;
                if (trace >= 0) {
+                       long savedRank = expContext.getRank();
                        expContext.setLastTrace(trace);
                        expContext.updateRank(1);
                        TmfExperimentLocation expLocation = (TmfExperimentLocation) expContext.getLocation();
@@ -451,11 +453,26 @@ public class TmfExperiment<T extends TmfEvent> extends TmfEventProvider<T> imple
                        expLocation.getLocation()[trace] = traceContext.getLocation().clone();
                        expLocation.getRanks()[trace] = traceContext.getRank();
                        event = expContext.getEvents()[trace];
+                       updateIndex(expContext, savedRank, timestamp);
                }
 
                return event;
        }
 
+       public synchronized void updateIndex(ITmfContext context, long rank, TmfTimestamp timestamp) {
+               // Build the index as we go along
+               if (context.isValidRank() && (rank % fIndexPageSize) == 0) {
+                       // Determine the table position
+                       long position = context.getRank() / fIndexPageSize;
+                       // Add new entry at proper location (if empty) 
+                       if (fCheckpoints.size() == position) {
+                               ITmfLocation<?> location = context.getLocation().clone();
+                               fCheckpoints.add(new TmfCheckpoint(timestamp, location));
+//                             System.out.println(this + "[" + (fCheckpoints.size() - 1) + "] " + timestamp + ", " + location.toString());
+                       }
+               }
+       }
+
        /* (non-Javadoc)
         * @see org.eclipse.linuxtools.tmf.trace.ITmfTrace#parseEvent(org.eclipse.linuxtools.tmf.trace.TmfContext)
         */
@@ -518,132 +535,75 @@ public class TmfExperiment<T extends TmfEvent> extends TmfEventProvider<T> imple
 
        // The index page size
        private static final int DEFAULT_INDEX_PAGE_SIZE = 1000;
-       private final int fIndexPageSize;
-
-       // Indicates that an indexing job is already running
-       private Boolean fIndexing = false;
-       private Boolean fIndexed  = false;
-
-       // The indexing job
-       private IndexingJob job;
+       private        final int fIndexPageSize;
 
-       /**
-        * indexExperiment
-        * 
-        * Creates the experiment index.
-        */
-       public void indexExperiment(boolean waitForCompletion) {
-
-               synchronized(this) {
-                       if (fIndexed || fIndexing) {
-                               // An indexing job is already running but a new request came
-                               // in (probably due to a change in the trace set). The index
-                               // being currently built is therefore already invalid.
-                               // TODO: Cancel and restart the job
-                               // TODO: Add support for dynamically adding/removing traces
-                               return;
+       @SuppressWarnings("unchecked")
+       public void indexExperiment() {
+
+               final TmfExperiment<?> experiment = getCurrentExperiment();
+               fCheckpoints.clear();
+
+               ITmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, TmfTimeRange.Eternity, TmfDataRequest.ALL_DATA, 1) {
+
+                       long indexingStart = System.nanoTime();
+                       
+                       TmfTimestamp startTime =  null;
+                       TmfTimestamp lastTime  =  null;
+                       int nbEvents = 0;
+
+                       @Override
+                       public void handleData() {
+                               TmfEvent[] events = getData();
+                               if (events.length > 0) {
+                                       nbEvents++;
+                                       TmfTimestamp ts = events[0].getTimestamp();
+                                       if (startTime == null)
+                                               startTime = new TmfTimestamp(ts);
+                                       lastTime = new TmfTimestamp(ts);
+
+                                       if ((nbEvents % DEFAULT_INDEX_PAGE_SIZE) == 0) {
+                                               updateExperiment();
+                                       }
+                               }
                        }
-                       fIndexing = true;
-               }
-
-               job = new IndexingJob(new TmfExperiment<T>(this));
-               job.schedule();
-
-       if (waitForCompletion) {
-               try {
-                       job.join();
-               } catch (InterruptedException e) {
-                       e.printStackTrace();
-               }
-       }
-       }
-
-       private class IndexingJob extends Job {
 
-               private final String          experimentId;
-               private final ITmfTrace[]     traces;
-               private Vector<TmfCheckpoint> checkpoints;
-
-               public IndexingJob(TmfExperiment<T> experiment) {
-                       super(experiment.getName());
-                       experimentId = experiment.getName();
-                       traces = experiment.getTraces();
-               }
-
-               /* (non-Javadoc)
-                * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-                */
-               @Override
-               protected IStatus run(IProgressMonitor monitor) {
-
-                       // Minimal check
-                       if (traces.length == 0) {
-                   fIndexing = false;
-                               return Status.OK_STATUS;
+                       @Override
+                       public void handleSuccess() {
+                               long indexingEnd = System.nanoTime();
+
+                               updateExperiment();
+//                                     experiment.fCheckpoints = new Vector<TmfCheckpoint>();
+//                     for (int i = 0; i < fCheckpoints.size(); i++) {
+//                             TmfCheckpoint checkpoint = fCheckpoints.get(i).clone();
+//                             experiment.fCheckpoints.add(checkpoint);
+//                             System.out.println("fCheckpoints[" + i + "] " + checkpoint.getTimestamp() + ", " + checkpoint.getLocation().toString());
+//                     }
+
+//                     clone.dispose();
+//                     if (Tracer.INTERNALS) Tracer.trace(getName() + ": nbEvents=" + nbEvents + " (" + ((indexingEnd-indexingStart)/nbEvents)+ " ns/evt), start=" + startTime + ", end=" + lastTime);
+
+               System.out.println(getName() + ": start=" + startTime + ", end=" + lastTime + ", elapsed=" + (indexingEnd*1.0 - indexingStart) / 1000000000);
+               System.out.println(getName() + ": nbEvents=" + fNbEvents + " (" + ((indexingEnd-indexingStart)/nbEvents)+ " ns/evt)");
+//             for (int i = 0; i < experiment.fCheckpoints.size(); i++) {
+//                     TmfCheckpoint checkpoint = experiment.fCheckpoints.get(i);
+//                     System.out.println("fCheckpoints[" + i + "] " + checkpoint.getTimestamp() + ", " + checkpoint.getLocation().toString());
+//             }
                        }
 
-                       monitor.beginTask("Indexing " + experimentId, IProgressMonitor.UNKNOWN);
-
-            int nbEvents = 0;
-            TmfTimestamp startTime = null;
-            TmfTimestamp lastTime  = null;
-
-            // Reset the index
-            checkpoints = new Vector<TmfCheckpoint>();
-            
-            try {
-               // Position the trace at the beginning
-               TmfExperimentContext context = seekLocation(null);
-               TmfExperimentLocation location = (TmfExperimentLocation) context.getLocation().clone();
-
-                // Get the first event
-                       TmfEvent event = getNextEvent(context);
-                       if (event != null) {
-                    startTime = new TmfTimestamp(event.getTimestamp());
-                       }
-
-                       // Index the experiment
-                       while (event != null) {
-                       lastTime = event.getTimestamp();
-                               if ((nbEvents++ % fIndexPageSize) == 0) {
-                                       checkpoints.add(new TmfCheckpoint(lastTime, location));
-
-                        monitor.worked(1);
-
-                        // Check monitor *after* fCheckpoints has been updated
-                        if (monitor.isCanceled()) {
-                            monitor.done();
-                               return Status.CANCEL_STATUS;
-                        }
-                    }
-
-                    // We will need the contexts at the next iteration
-                    if ((nbEvents % fIndexPageSize) == 0) {
-                        location = (TmfExperimentLocation) context.getLocation().clone();
-                               }
-
-                               event = getNextEvent(context);
-                }
-
-            }
-            finally {
-                synchronized(this) {
-                       fCheckpoints = checkpoints;
-                       fNbEvents    = nbEvents;
-                       fTimeRange   = new TmfTimeRange(startTime, lastTime);
-                       fIndexing    = false;
-                       fIndexed     = true;
-                }
-//                         notifyListeners(fTimeRange);
-                monitor.done();
-            }
-
-                       return Status.OK_STATUS;
-               }
-    }
+                       private void updateExperiment() {
+                               if (experiment == fCurrentExperiment)
+                                       experiment.fTimeRange   = new TmfTimeRange(startTime, new TmfTimestamp(lastTime));
+                                       experiment.fNbEvents    = nbEvents;
+                                       experiment.fCheckpoints = ((TmfExperiment<T>) fClone).fCheckpoints;
+                                       notifyListeners();
+                       }
+               };
 
-    protected void notifyListeners(TmfTimeRange range) {
-       broadcast(new TmfRangeSynchSignal(this, range, range.getStartTime()));
+               sendRequest((ITmfDataRequest<T>) request, ExecutionType.LONG);
+       }
+       
+       protected void notifyListeners() {
+       broadcast(new TmfExperimentUpdatedSignal(this, this, null));
        }
    
     // ------------------------------------------------------------------------
@@ -655,18 +615,15 @@ public class TmfExperiment<T extends TmfEvent> extends TmfEventProvider<T> imple
        TmfExperiment<?> experiment = signal.getExperiment();
        if (experiment == this) {
                setCurrentExperiment(experiment);
+               indexExperiment();
        }
        else {
                dispose();
        }
-//     if (signal.getExperiment() == this) {
-//             indexExperiment(true);
-//     }
     }
 
     @TmfSignalHandler
     public void experimentUpdated(TmfExperimentUpdatedSignal signal) {
-//     indexExperiment(true);
     }
 
     @TmfSignalHandler
index 7beecac7c6df375b4714fddadcdc284b9a2badc8..3290ca8dbf29db2b8dd2b01db57cf309847b39fa 100644 (file)
@@ -59,6 +59,7 @@ public interface ITmfDataRequest<T extends TmfData> {
        // Request state
        // ------------------------------------------------------------------------
 
+    public boolean isRunning();
     public boolean isCompleted();
     public boolean isFailed();
     public boolean isCancelled();
@@ -75,6 +76,7 @@ public interface ITmfDataRequest<T extends TmfData> {
        // Request handling
        // ------------------------------------------------------------------------
 
+    public void handleStarted();
     public void handleCompleted();
     public void handleSuccess();
     public void handleFailure();
@@ -90,6 +92,7 @@ public interface ITmfDataRequest<T extends TmfData> {
        // Request state modifiers
        // ------------------------------------------------------------------------
 
+    public void start();
     public void done();
     public void fail();
     public void cancel();
index 0bcd53037caabef03fa6919f3ca75187fd928b9e..59a6dea598901ffa9804a12d68ad30941d896a09 100644 (file)
@@ -14,6 +14,7 @@ package org.eclipse.linuxtools.tmf.request;
 
 import org.eclipse.linuxtools.tmf.event.TmfEvent;
 import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
+import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
 
 /**
  * <b><u>TmfCoalescedEventRequest</u></b>
@@ -26,7 +27,7 @@ public class TmfCoalescedEventRequest<T extends TmfEvent> extends TmfCoalescedDa
     // Attributes
     // ------------------------------------------------------------------------
 
-       private final TmfTimeRange fRange;      // The requested events time range
+       private TmfTimeRange fRange;    // The requested events time range
 
     // ------------------------------------------------------------------------
     // Constructor
@@ -73,12 +74,40 @@ public class TmfCoalescedEventRequest<T extends TmfEvent> extends TmfCoalescedDa
                if (request instanceof ITmfEventRequest<?>) {
                        boolean ok = getNbRequested() == request.getNbRequested();
                        ok &= getBlockize() == request.getBlockize();
-                       ok &= fRange.equals(((ITmfEventRequest<T>) request).getRange());
+                       if (ok) {
+                               TmfTimestamp startTime = ((ITmfEventRequest<T>) request).getRange().getStartTime();
+                               TmfTimestamp endTime   = ((ITmfEventRequest<T>) request).getRange().getEndTime();
+                               if (!fRange.contains(startTime))
+                                       fRange = new TmfTimeRange(startTime, fRange.getEndTime());
+                               if (!fRange.contains(endTime))
+                                       fRange = new TmfTimeRange(fRange.getStartTime(), endTime);
+                       }
                        return ok;
                }
                return false;
        }
 
+    // ------------------------------------------------------------------------
+    // ITmfDataRequest
+    // ------------------------------------------------------------------------
+
+    @Override
+       public void handleData() {
+       for (ITmfDataRequest<T> request : fRequests) {
+               if (request instanceof TmfEventRequest) {
+                       TmfEventRequest<T> req = (TmfEventRequest<T>) request;
+                       T[] data = getData();
+                       if (data.length > 0 && req.getRange().contains(data[0].getTimestamp())) {
+                       req.setData(data);
+                       req.handleData();
+                       }
+               }
+               else {
+                       super.handleData();
+               }
+       }
+    }
+
     // ------------------------------------------------------------------------
     // ITmfEventRequest
     // ------------------------------------------------------------------------
index 8b2ce9b7c0a1eb1aba1965717c8b009d90448280..560c4431516b437880b82e7937b51b8333317407 100644 (file)
@@ -86,16 +86,17 @@ public abstract class TmfDataRequest<T extends TmfData> implements ITmfDataReque
     // ------------------------------------------------------------------------
 
     private final Class<T> fDataType;
-    private final int fRequestId;                      // A unique request ID
-    private final int fIndex;                          // The index (rank) of the requested event
-    private final int fNbRequested;            // The number of requested events (ALL_DATA for all)
-    private final int fBlockSize;              // The maximum number of events per chunk
-    private       int fNbRead;                 // The number of reads so far
+    private final int      fRequestId;         // A unique request ID
+    private final int      fIndex;             // The index (rank) of the requested event
+    private final int      fNbRequested;       // The number of requested events (ALL_DATA for all)
+    private final int      fBlockSize;         // The maximum number of events per chunk
+    private       int      fNbRead;            // The number of reads so far
 
     private final Object lock;
-    private boolean fRequestCompleted;
-    private boolean fRequestFailed;
-    private boolean fRequestCanceled;
+    private boolean fRequestRunning   = false;
+    private boolean fRequestCompleted = false;
+    private boolean fRequestFailed    = false;
+    private boolean fRequestCanceled  = false;
 
     private T[] fData; // Data object
     
@@ -150,8 +151,7 @@ public abstract class TmfDataRequest<T extends TmfData> implements ITmfDataReque
        fBlockSize   = blockSize;
        fNbRead      = 0;
         lock         = new Object();
-
-        Tracer.trace("Request #" + fRequestId + " (" + getClass().getName() + ", " + fDataType.getName() + ") created");
+        if (Tracer.isRequestTraced()) Tracer.traceRequest(this, "created");
     }
 
     /**
@@ -159,13 +159,7 @@ public abstract class TmfDataRequest<T extends TmfData> implements ITmfDataReque
      */
     @SuppressWarnings("unused")
        private TmfDataRequest(TmfDataRequest<T> other) {
-       fRequestId   = 0;
-       fDataType    = null;
-       fIndex       = 0;
-       fNbRequested = 0;
-       fBlockSize   = 0;
-       fNbRead      = 0;
-        lock         = new Object();
+       this(null, 0, ALL_DATA, DEFAULT_BLOCK_SIZE);
     }
 
     // ------------------------------------------------------------------------
@@ -207,6 +201,13 @@ public abstract class TmfDataRequest<T extends TmfData> implements ITmfDataReque
         return fNbRead;
     }
 
+    /**
+     * @return indicates if the request is completed
+     */
+    public boolean isRunning() {
+        return fRequestRunning;
+    }
+
     /**
      * @return indicates if the request is completed
      */
@@ -273,6 +274,9 @@ public abstract class TmfDataRequest<T extends TmfData> implements ITmfDataReque
      */
     public abstract void handleData();
 
+    public void handleStarted() {
+    }
+
     /**
      * Handle the completion of the request. It is called when there is no more
      * data available either because:
@@ -285,15 +289,15 @@ public abstract class TmfDataRequest<T extends TmfData> implements ITmfDataReque
      */
     public void handleCompleted() {
        if (fRequestFailed) { 
-            Tracer.trace("Request #" + fRequestId + " failed, completed");
+            if (Tracer.isRequestTraced()) Tracer.traceRequest(this, "failed");
                handleFailure();
        }
        else if (fRequestCanceled) {
-            Tracer.trace("Request #" + fRequestId + " cancelled, completed");
+            if (Tracer.isRequestTraced()) Tracer.traceRequest(this, "cancelled");
                handleCancel();
        }
        else {
-                       Tracer.trace("Request #" + fRequestId + " succeeded, completed");
+            if (Tracer.isRequestTraced()) Tracer.traceRequest(this, "succeeded");
                        handleSuccess();
        }
     }
@@ -320,11 +324,26 @@ public abstract class TmfDataRequest<T extends TmfData> implements ITmfDataReque
         }
     }
 
+    /**
+     * Called by the request processor upon starting to service the request.
+     */
+    public void start() {
+        if (Tracer.isRequestTraced()) Tracer.traceRequest(this, "starting");
+        synchronized(lock) {
+            fRequestRunning = true;
+            lock.notify();
+        }
+        handleStarted();
+       if (Tracer.isRequestTraced()) Tracer.traceRequest(this, "started");
+    }
+
     /**
      * Called by the request processor upon completion.
      */
     public void done() {
+        if (Tracer.isRequestTraced()) Tracer.traceRequest(this, "completing");
         synchronized(lock) {
+               fRequestRunning   = false;
             fRequestCompleted = true;
             lock.notify();
         }
index 3b1d3d14b484f0e546ebe897da88a429b7a0f39c..3dc7aa595cf2412a92b7e0c04bdd7055feac5140 100644 (file)
@@ -18,8 +18,6 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.LinkedBlockingQueue;
 
-import org.eclipse.linuxtools.tmf.Tracer;
-
 /**
  * <b><u>TmfRequestExecutor</u></b>
  *
@@ -44,7 +42,7 @@ public class TmfRequestExecutor implements Executor {
                fExecutor = executor;
                String canonicalName = fExecutor.getClass().getCanonicalName();
                fExecutorName = canonicalName.substring(canonicalName.lastIndexOf('.') + 1);
-               Tracer.trace(fExecutor + " created");
+//             if (Tracer.COMPONENTS) Tracer.trace(fExecutor + " created");
        }
 
        /**
@@ -73,7 +71,7 @@ public class TmfRequestExecutor implements Executor {
         */
        public void stop() {
                fExecutor.shutdown();
-               Tracer.trace(fExecutor + " terminated");
+//             if (Tracer.COMPONENTS) Tracer.trace(fExecutor + " terminated");
        }
        
        // ------------------------------------------------------------------------
@@ -84,13 +82,10 @@ public class TmfRequestExecutor implements Executor {
         * @see java.util.concurrent.Executor#execute(java.lang.Runnable)
         */
        public synchronized void execute(final Runnable request) {
-               Tracer.trace("Queueing request " + request);
                fRequestQueue.offer(new Runnable() {
                        public void run() {
                                try {
-                                       Tracer.trace("Processing request " + request);
                                        request.run();
-                                       Tracer.trace("Finishing request " + request);
                                } finally {
                                        scheduleNext();
                                }
index 61f0b15be9f42347ca6b840bce6285aa5c613d6b..41496dcf0a38246b9eabad7436dfd6e62de78009 100644 (file)
@@ -93,6 +93,7 @@ public class TmfSignalManager {
                signal.setReference(fSynchId);
                sendSignal(signal);
                sendSignal(new TmfEndSynchSignal(fSynchId));
+//             Tracer.traceSignal(signal);
        }
 
        static private void sendSignal(TmfSignal signal) {
index e0e9567fa8ad9b5f5419194d1afc3b0c44189b62..76a2fd3264db97f1ff1c99f2f2357c472034176d 100644 (file)
@@ -28,4 +28,5 @@ public interface ITmfContext {
        public long getRank();
        public void updateRank(int rank);
 
+       public boolean isValidRank();
 }
index 0fcd9d0f946fc5c9ca18ff7814adc8beac62a852..5b349515a2a98cfefb64f961bf03fa0933fdc653 100644 (file)
@@ -25,7 +25,6 @@ public interface ITmfTrace extends ITmfComponent {
        
        public ITmfTrace createTraceCopy();
        
-       
        /**
         * @return the trace path 
         */
index 6f19adf79c341609c132a0b717f46d20ee5071d2..a504454dee1d26df486be90a355c8a6927e32d09 100644 (file)
@@ -25,8 +25,8 @@ public class TmfCheckpoint implements Comparable<TmfCheckpoint> {
     // Attributes
     // ------------------------------------------------------------------------
     
-    private final TmfTimestamp fTimestamp;
-    private final ITmfLocation<?> fLocation;
+    private TmfTimestamp fTimestamp;
+    private ITmfLocation<?> fLocation;
 
     // ------------------------------------------------------------------------
     // Constructors
@@ -80,6 +80,20 @@ public class TmfCheckpoint implements Comparable<TmfCheckpoint> {
     // Object
     // ------------------------------------------------------------------------
 
+    @Override
+    public TmfCheckpoint clone() {
+       TmfCheckpoint result = null;
+               try {
+                       result = (TmfCheckpoint) super.clone();
+               result.fTimestamp = new TmfTimestamp(fTimestamp);
+               result.fLocation  = fLocation.clone();
+               return result;
+               } catch (CloneNotSupportedException e) {
+                       e.printStackTrace();
+               }
+               return result;
+    }
     @Override
     public int hashCode() {
        return fTimestamp.hashCode();
index 89ca3239b9cce1044836c5550807e27f048f0e24..042c1ef35feb8019950191b2693fbd278b0370d4 100644 (file)
@@ -35,7 +35,7 @@ public class TmfContext implements ITmfContext, Cloneable {
        }
 
        public TmfContext(ITmfLocation<?> location) {
-               this(location, 0);
+               this(location, UNKNOWN_RANK);
        }
 
        public TmfContext(TmfContext other) {
@@ -43,7 +43,7 @@ public class TmfContext implements ITmfContext, Cloneable {
        }
 
        public TmfContext() {
-               this(null, 0);
+               this(null, UNKNOWN_RANK);
        }
 
        // ------------------------------------------------------------------------
@@ -67,10 +67,14 @@ public class TmfContext implements ITmfContext, Cloneable {
        }
 
        public void updateRank(int delta) {
-               if (fRank != UNKNOWN_RANK)
+               if (isValidRank())
                        fRank += delta;
        }
 
+       public boolean isValidRank() {
+               return fRank != UNKNOWN_RANK;
+       }
+
        // ------------------------------------------------------------------------
        // Object
        // ------------------------------------------------------------------------
index 06b9716c8022a1dac634e6aa1ae35553cd6c5369..8ca8def31d0404333fdb929eecfb4e34e074c7eb 100644 (file)
@@ -17,17 +17,12 @@ import java.io.FileNotFoundException;
 import java.util.Collections;
 import java.util.Vector;
 
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.linuxtools.tmf.component.TmfEventProvider;
 import org.eclipse.linuxtools.tmf.event.TmfEvent;
 import org.eclipse.linuxtools.tmf.event.TmfTimeRange;
 import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
 import org.eclipse.linuxtools.tmf.request.ITmfDataRequest;
 import org.eclipse.linuxtools.tmf.request.ITmfEventRequest;
-import org.eclipse.linuxtools.tmf.signal.TmfTraceUpdatedSignal;
 
 /**
  * <b><u>TmfTrace</u></b>
@@ -102,6 +97,12 @@ public abstract class TmfTrace<T extends TmfEvent> extends TmfEventProvider<T> i
        setName(simpleName);
        fPath = path;
         fIndexPageSize = (cacheSize > 0) ? cacheSize : DEFAULT_CACHE_SIZE;
+
+        try {
+                       fClone = clone();
+               } catch (CloneNotSupportedException e) {
+                       e.printStackTrace();
+               }
     }
 
     /* (non-Javadoc)
@@ -127,14 +128,6 @@ public abstract class TmfTrace<T extends TmfEvent> extends TmfEventProvider<T> i
         return fPath;
     }
 
-//    /**
-//     * @return the trace name
-//     */
-//    @Override
-//     public String getName() {
-//        return fName;
-//    }
-
     /* (non-Javadoc)
      * @see org.eclipse.linuxtools.tmf.stream.ITmfEventStream#getNbEvents()
      */
@@ -312,12 +305,27 @@ public abstract class TmfTrace<T extends TmfEvent> extends TmfEventProvider<T> i
                TmfEvent event = parseEvent(context);
                if (event != null) {
                        context.setLocation(getCurrentLocation());
+                       updateIndex(context, context.getRank(), event.getTimestamp());
                        context.updateRank(1);
                        processEvent(event);
                }
        return event;
        }
 
+       public synchronized void updateIndex(ITmfContext context, long rank, TmfTimestamp timestamp) {
+               // Build the index as we go along
+               if (context.isValidRank() && (rank % fIndexPageSize) == 0) {
+                       // Determine the table position
+                       long position = rank / fIndexPageSize;
+                       // Add new entry at proper location (if empty) 
+                       if (fCheckpoints.size() == position) {
+                               ITmfLocation<?> location = getCurrentLocation().clone();
+                               fCheckpoints.add(new TmfCheckpoint(timestamp, location));
+//                             System.out.println(getName() + "[" + (fCheckpoints.size() - 1) + "] " + timestamp + ", " + location.toString());
+                       }
+               }
+       }
+
     /**
         * Hook for "special" processing by the concrete class
         * (called by getNextEvent())
@@ -346,122 +354,5 @@ public abstract class TmfTrace<T extends TmfEvent> extends TmfEventProvider<T> i
        public String toString() {
                return "[TmfTrace (" + getName() + ")]";
        }
-
-    // ------------------------------------------------------------------------
-    // Indexing
-    // ------------------------------------------------------------------------
-
-       /*
-        * The purpose of the index is to perform a pass over the trace and collect
-        * basic information that can be later used to rapidly access a trace events.
-        * 
-        * The information collected:
-        * - fCheckpoints, the list of evenly separated checkpoints (timestamp + location)
-        * - fTimeRange, the trace time span
-        * - fNbEvents, the number of events in the trace
-        * 
-        * NOTE: Doesn't work for streaming traces.
-        */
-
-       private IndexingJob job;
-
-       // Indicates that an indexing job is already running
-       private boolean fIndexing = false;
-       private Boolean fIndexed  = false;
-
-       public void indexTrace(boolean waitForCompletion) {
-       synchronized (this) {
-                       if (fIndexed || fIndexing) {
-                       return;
-               }
-               fIndexing = true;
-       }
-
-       job = new IndexingJob("Indexing " + getName());
-       job.schedule();
-
-       if (waitForCompletion) {
-               try {
-                       job.join();
-               } catch (InterruptedException e) {
-                       e.printStackTrace();
-               }
-       }
-    }
-
-    private class IndexingJob extends Job {
-
-               public IndexingJob(String name) {
-                       super(name);
-               }
-
-               /* (non-Javadoc)
-                * @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
-                */
-               @Override
-               protected IStatus run(IProgressMonitor monitor) {
-
-            monitor.beginTask("Indexing " + getName(), IProgressMonitor.UNKNOWN);
-
-            int nbEvents = 0;
-            TmfTimestamp startTime = null;
-            TmfTimestamp lastTime  = null;
-
-            // Reset the index
-            fCheckpoints = new Vector<TmfCheckpoint>();
-            
-            try {
-               // Position the trace at the beginning
-                TmfContext context = seekLocation(null);
-                ITmfLocation<?> location = context.getLocation().clone();
-
-                // Get the first event
-                       TmfEvent event = getNextEvent(context);
-                       if (event != null) {
-                    startTime = new TmfTimestamp(event.getTimestamp());
-                       }
-
-                       // Index the trace
-                       while (event != null) {
-                       lastTime = event.getTimestamp();
-                               if ((nbEvents++ % fIndexPageSize) == 0) {
-                                       lastTime = new TmfTimestamp(event.getTimestamp());
-                               fCheckpoints.add(new TmfCheckpoint(lastTime, location));
-
-                        monitor.worked(1);
-
-                        // Check monitor *after* fCheckpoints has been updated
-                        if (monitor.isCanceled()) {
-                            monitor.done();
-                               return Status.CANCEL_STATUS;
-                        }
-                    }
-
-                    // We will need this location at the next iteration
-                    if ((nbEvents % fIndexPageSize) == 0) {
-                        location = context.getLocation().clone();
-                               }
-
-                    event = getNextEvent(context);
-                }
-            }
-            finally {
-                synchronized(this) {
-                       fNbEvents = nbEvents;
-                       fTimeRange = new TmfTimeRange(startTime, lastTime);
-                       fIndexing = false;
-                       fIndexed = true;
-                }
-                notifyListeners(fTimeRange);
-                monitor.done();
-            }
-
-            return Status.OK_STATUS;
-               }
-    }
-
-    protected void notifyListeners(TmfTimeRange range) {
-       broadcast(new TmfTraceUpdatedSignal(this, this, range));
-       }
    
 }
This page took 0.094823 seconds and 5 git commands to generate.