June 29th, 2010
authorAlvaro Sanchez-Leon <alvsan09@gmail.com>
Wed, 30 Jun 2010 03:48:47 +0000 (03:48 +0000)
committerAlvaro Sanchez-Leon <alvsan09@gmail.com>
Wed, 30 Jun 2010 03:48:47 +0000 (03:48 +0000)
NEW - bug 292412: [LTTng] Control Flow View Zoom-In some times does not show the state
https://bugs.eclipse.org/bugs/show_bug.cgi?id=292412

The synthetic event provider has been updated to draw the last state registered in its corresponding state provider,
when multiple traces are involved within the same experiment, a loop is performed to trigger the drawing of the last state on every trace.

This issue is also covering some left overs of Bug 303510, where selecting next or previous event on the first event or last event would either go all the way to the birth time of the process or the end time of the trace. These border events don't have a reference to the next event since it's out of the scope of the data collected when a zoom in / out was previously selected.

The mechanism is adjusted to artificially extend these events to either half page before or after the visible time window, so moving to previous or next border events would re-select half the window before or after and therefore be able to keep the zoom level and visualise a before or after layout of information.

The above required an adjustment to the tmf time analysis widget to correct a bug, when the currently selected time is in the middle of the last event of a particular process and the next event option is selected, this was causing to re-select back to the start time of the last event, the correction causes it to select to the end of the last event as it's expected.

12 files changed:
org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/AllLTTngTests.java
org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/LttngTestPreparation.java
org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/control/LTTngSyntheticEventProviderTest.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/model/trange/TimeRangeViewerProvider.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/controlflow/evProcessor/AbsFlowTRangeUpdate.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/evProcessor/FlowFinishUpdateHandler.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/AbsResourcesTRangeUpdate.java
org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/evProcessor/ResourcesFinishUpdateHandler.java
org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/control/LttngSyntheticEventProvider.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/timeAnalysis/widgets/TmfTimeStatesCtrl.java

index 8fc137c686f505a3e0e7d7e4875484104715decf..7f15431fd0911186b9e1f5d75e8eb6bc52179431 100644 (file)
@@ -3,6 +3,7 @@ package org.eclipse.linuxtools.lttng;
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.eclipse.linuxtools.lttng.control.LTTngSyntheticEventProviderTest;
 import org.eclipse.linuxtools.lttng.model.LTTngTreeNodeTest;
 import org.eclipse.linuxtools.lttng.state.resource.LTTngStateResourceTest;
 import org.eclipse.linuxtools.lttng.tests.event.LttngEventContentTest;
@@ -39,8 +40,8 @@ public class AllLTTngTests {
 //        suite.addTestSuite(LTTngTextTraceTest.class);
 //        suite.addTestSuite(LTTngTraceTest.class);
 
-//             suite.addTestSuite(LTTngSyntheticEventProviderTest.class);
-//             suite.addTestSuite(LTTngSyntheticEventProviderTextTest.class);
+               suite.addTestSuite(LTTngSyntheticEventProviderTest.class);
+               // suite.addTestSuite(LTTngSyntheticEventProviderTextTest.class);
                suite.addTestSuite(LTTngTreeNodeTest.class);
 //             suite.addTestSuite(StateExperimentManagerTextTest.class);
                suite.addTestSuite(LTTngStateResourceTest.class);
index 41fe461273b3844dfc8867b019e9636a20ca507f..d7299580036714305dd9a8ba44da994d3a4c15ee 100644 (file)
@@ -59,26 +59,31 @@ public abstract class LttngTestPreparation extends TestCase {
                feventCount = 0;
        }
 
-       protected LTTngTextTrace prepareTextStreamToTest() {
-               if (ftextStream_T1 == null) {
-                       try {
-                               URL location = FileLocator.find(LTTngCoreTestPlugin.getPlugin()
-                                               .getBundle(), new Path(fTextTracepath_T1), null);
-                               File testfile = new File(FileLocator.toFileURL(location)
-                                               .toURI());
-                               LTTngTextTrace tmpStream = new LTTngTextTrace(testfile
-                                               .getPath());
-                               ftextStream_T1 = tmpStream;
-       
-                       } catch (Exception e) {
-                               System.out.println("ERROR : Could not open " + fTextTracepath_T1);
-                               ftextStream_T1 = null;
-                       }
-               } else {
-                       ftextStream_T1.seekEvent(0);
+       /**
+        * @return
+        */
+       protected TmfExperiment<LttngEvent> prepareExperimentToTest() {
+               if (fTestExperiment == null) {
+                       String expId = "testExperiment";
+                       int nbTraces = 1;
+
+                       // Define traces in experiment
+                       ITmfTrace[] traces = new ITmfTrace[nbTraces];
+                       ITmfTrace trace = prepareStreamToTest();
+                       traces[0] = trace;
+
+                       // create experiment and associate traces
+                       fTestExperiment = new TmfExperiment<LttngEvent>(LttngEvent.class,
+                                       expId, traces);
+                       // fTestExperiment.indexExperiment(waitForCompletion);
+
+                       // Set the current selected experiment as the test experiment
+                       TmfExperimentSelectedSignal<LttngEvent> signal = new TmfExperimentSelectedSignal<LttngEvent>(
+                                       this, fTestExperiment);
+                       fTestExperiment.experimentSelected(signal);
                }
-       
-               return ftextStream_T1;
+
+               return fTestExperiment;
        }
 
        /**
@@ -88,12 +93,12 @@ public abstract class LttngTestPreparation extends TestCase {
                if (fTestExperiment == null) {
                        String expId = "testExperiment";
                        int nbTraces = 1;
-       
+
                        // Define traces in experiment
                        ITmfTrace[] traces = new ITmfTrace[nbTraces];
                        ITmfTrace trace = prepareTextStreamToTest();
                        traces[0] = trace;
-       
+
                        // create experiment and associate traces
                        fTestExperiment = new TmfExperiment<LttngEvent>(LttngEvent.class,
                                        expId, traces);
@@ -104,17 +109,16 @@ public abstract class LttngTestPreparation extends TestCase {
                        fTestExperiment.experimentSelected(signal);
 
                }
-       
+
                return fTestExperiment;
        }
 
        protected LTTngTrace prepareStreamToTest() {
                if (frealStream == null) {
                        try {
-                               URL location = FileLocator.find(LTTngCoreTestPlugin.getPlugin()
-                                               .getBundle(), new Path(ftracepath_T1), null);
-                               File testfile = new File(FileLocator.toFileURL(location)
-                                               .toURI());
+                               URL location = FileLocator.find(LTTngCoreTestPlugin.getPlugin().getBundle(), new Path(ftracepath_T1),
+                                               null);
+                               File testfile = new File(FileLocator.toFileURL(location).toURI());
                                LTTngTrace tmpStream = new LTTngTrace(testfile.getPath());
                                frealStream = tmpStream;
                        } catch (Exception e) {
@@ -128,31 +132,24 @@ public abstract class LttngTestPreparation extends TestCase {
                return frealStream;
        }
 
-       /**
-        * @return
-        */
-       protected TmfExperiment<LttngEvent> prepareExperimentToTest() {
-               if (fTestExperiment == null) {
-                       String expId = "testExperiment";
-                       int nbTraces = 1;
-
-                       // Define traces in experiment
-                       ITmfTrace[] traces = new ITmfTrace[nbTraces];
-                       ITmfTrace trace = prepareStreamToTest();
-                       traces[0] = trace;
-
-                       // create experiment and associate traces
-                       fTestExperiment = new TmfExperiment<LttngEvent>(LttngEvent.class,
-                                       expId, traces);
-                       // fTestExperiment.indexExperiment(waitForCompletion);
+       protected LTTngTextTrace prepareTextStreamToTest() {
+               if (ftextStream_T1 == null) {
+                       try {
+                               URL location = FileLocator.find(LTTngCoreTestPlugin.getPlugin().getBundle(),
+                                               new Path(fTextTracepath_T1), null);
+                               File testfile = new File(FileLocator.toFileURL(location).toURI());
+                               LTTngTextTrace tmpStream = new LTTngTextTrace(testfile.getPath());
+                               ftextStream_T1 = tmpStream;
 
-                       // Set the current selected experiment as the test experiment
-                       TmfExperimentSelectedSignal<LttngEvent> signal = new TmfExperimentSelectedSignal<LttngEvent>(
-                                       this, fTestExperiment);
-                       fTestExperiment.experimentSelected(signal);
+                       } catch (Exception e) {
+                               System.out.println("ERROR : Could not open " + fTextTracepath_T1);
+                               ftextStream_T1 = null;
+                       }
+               } else {
+                       ftextStream_T1.seekEvent(0);
                }
 
-               return fTestExperiment;
+               return ftextStream_T1;
        }
 
        protected IStateExperimentManager prepareExperimentContext(
index 3c7f861b60c25d5cb4fdc984c9ca0249eebc392f..8b59b27b23e6dece5710485c9020c9f2985427ed 100644 (file)
 package org.eclipse.linuxtools.lttng.control;
 
 import org.eclipse.linuxtools.lttng.LttngTestPreparation;
+import org.eclipse.linuxtools.lttng.event.LttngEvent;
+import org.eclipse.linuxtools.lttng.event.LttngSyntheticEvent;
+import org.eclipse.linuxtools.lttng.state.experiment.IStateExperimentManager;
+import org.eclipse.linuxtools.tmf.experiment.TmfExperiment;
+import org.eclipse.linuxtools.tmf.request.TmfEventRequest;
 
 public class LTTngSyntheticEventProviderTest extends LttngTestPreparation {
        // ========================================================================
@@ -19,83 +24,72 @@ public class LTTngSyntheticEventProviderTest extends LttngTestPreparation {
        // ========================================================================
 
        public void testPlainDataRequest() {
-//             // prepare
-//             init();
-//             TmfExperiment<LttngEvent> experiment = prepareExperimentToTest();
-//             TmfEventRequest<LttngEvent> request = prepareEventRequest(
-//                             LttngEvent.class, 0, 31);
-//
-//             // execute
-//             experiment.sendRequest(request);
-//             try {
-//                     request.waitForCompletion();
-//             } catch (InterruptedException e) {
-//                     e.printStackTrace();
-//             }
-//
-//             // finish
-//             assertEquals("Unexpected eventCount", 15316, feventCount);
-//             boolean expected = true;
-//             assertEquals("Events received out of expected order", expected,
-//                             validSequence);
+               // prepare
+               init();
+               TmfExperiment<LttngEvent> experiment = prepareExperimentToTest();
+               TmfEventRequest<LttngEvent> request = prepareEventRequest(LttngEvent.class, 0, 31);
+
+               // execute
+               experiment.sendRequest(request);
+               try {
+                       request.waitForCompletion();
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
+               }
+
+               // finish
+               assertEquals("Unexpected eventCount", 15316, feventCount);
+               boolean expected = true;
+               assertEquals("Events received out of expected order", expected, validSequence);
        }
 
        /**
         * 
         */
        public void testSyntheticEventRequest() {
-//             init();
-//             // Create a new Experiment manager context
-//             IStateExperimentManager expManager = prepareExperimentContext(false);
-//
-//             // make sure a TmfExperiment instance is registered as provider and
-//             // selected as current
-//             TmfExperiment<LttngEvent> experiment = prepareExperimentToTest();
-//
-//             // experiment selected, build experiment selection context and trigger
-//             // check point creation
-//             expManager.experimentSelected_prep(experiment);
-//             // builds check points in parallel
-//             expManager.experimentSelected(this, experiment);
-//
-//             // Obtain the singleton event provider
-//             LttngSyntheticEventProvider synProvider = LttngCoreProviderFactory
-//                             .getEventProvider();
-//
-//             // prepare synthetic event requests
-//             boolean printExpectedEvents = false;
-//             TmfEventRequest<LttngSyntheticEvent> request1 = prepareEventRequest(LttngSyntheticEvent.class, 5, 9,
-//                             printExpectedEvents); /* 2001 events */
-//             TmfEventRequest<LttngSyntheticEvent> request2 = prepareEventRequest(LttngSyntheticEvent.class, 11, 13,
-//                             printExpectedEvents); /* 1001 events */
-//
-//             // execute
-//             synProvider.sendRequest(request1);
-//             try {
-//                     request1.waitForCompletion();
-//             } catch (InterruptedException e) {
-//                     e.printStackTrace();
-//             }
-//             System.out.println("EventCount " + feventCount);
-//
-//             synProvider.sendRequest(request2);
-//             try {
-//                     request2.waitForCompletion();
-//             } catch (InterruptedException e) {
-//                     e.printStackTrace();
-//             }
-//             System.out.println("EventCount " + feventCount);
-//
-////           try {
-////                   request1.waitForCompletion();
-////                   request2.waitForCompletion();
-////           } catch (InterruptedException e) {
-////                   e.printStackTrace();
-////           }
-////           System.out.println("EventCount " + feventCount);
-//
-//             // finish
-//             assertEquals("Unexpected eventCount", 3002, feventCount);
+               init();
+               // Create a new Experiment manager context
+               IStateExperimentManager expManager = prepareExperimentContext(false);
+
+               // make sure a TmfExperiment instance is registered as provider and
+               // selected as current
+               TmfExperiment<LttngEvent> experiment = prepareExperimentToTest();
+
+               // experiment selected, build experiment selection context and trigger
+               // check point creation
+               expManager.experimentSelected_prep(experiment);
+               // builds check points in parallel
+               expManager.experimentSelected(this, experiment);
+
+               // Obtain the singleton event provider
+               LttngSyntheticEventProvider synProvider = LttngCoreProviderFactory.getEventProvider();
+
+               // prepare synthetic event requests
+               boolean printExpectedEvents = false;
+               TmfEventRequest<LttngSyntheticEvent> request1 = prepareEventRequest(LttngSyntheticEvent.class, 5, 9,
+                               printExpectedEvents); /* 2001 events */
+               TmfEventRequest<LttngSyntheticEvent> request2 = prepareEventRequest(LttngSyntheticEvent.class, 11, 13,
+                               printExpectedEvents); /* 1001 events */
+
+               // execute
+               synProvider.sendRequest(request1);
+               // try {
+               // request1.waitForCompletion();
+               // } catch (InterruptedException e) {
+               // e.printStackTrace();
+               // }
+               System.out.println("EventCount " + feventCount);
+
+               synProvider.sendRequest(request2);
+               try {
+                       request2.waitForCompletion();
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
+               }
+               System.out.println("EventCount " + feventCount);
+
+               // finish
+               assertEquals("Unexpected eventCount", 3002, feventCount);
        }
 
 }
\ No newline at end of file
index c0716278d7400e49a039120dc1e3e4b8a03db6d5..ee831bd68efcfbcba44498d7f76ca75090936422 100644 (file)
@@ -21,6 +21,7 @@ import org.eclipse.linuxtools.lttng.state.StateStrings.IRQMode;
 import org.eclipse.linuxtools.lttng.state.StateStrings.ProcessStatus;\r
 import org.eclipse.linuxtools.lttng.state.StateStrings.SoftIRQMode;\r
 import org.eclipse.linuxtools.lttng.state.StateStrings.TrapMode;\r
+import org.eclipse.linuxtools.lttng.ui.views.common.ParamsUpdater;\r
 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeAnalysisProvider;\r
 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITimeEvent;\r
 import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry;\r
@@ -40,10 +41,12 @@ public class TimeRangeViewerProvider extends TmfTimeAnalysisProvider {
        Map<String, StateColor> irqStateToColor = new HashMap<String, StateColor>(4);\r
        Map<String, StateColor> cpuStateToColor = new HashMap<String, StateColor>(8);\r
 \r
+       private final ParamsUpdater fviewParameters;\r
+\r
        // ========================================================================\r
        // Constructors\r
        // =======================================================================\r
-       public TimeRangeViewerProvider() {\r
+       public TimeRangeViewerProvider(ParamsUpdater paramsUpdater) {\r
                // Fill the statemode to color maps\r
                fillProcessStateToColor();\r
                fillBdevStateToColor();\r
@@ -51,6 +54,7 @@ public class TimeRangeViewerProvider extends TmfTimeAnalysisProvider {
                fillTrapStateToColor();\r
                fillIrqStateToColor();\r
                fillCpuStateToColor();\r
+               fviewParameters = paramsUpdater;\r
        }\r
 \r
        // ========================================================================\r
@@ -107,10 +111,24 @@ public class TimeRangeViewerProvider extends TmfTimeAnalysisProvider {
                if (revent instanceof TimeRangeComponent) {\r
                        ITimeRangeComponent parent = ((TimeRangeComponent) revent)\r
                                        .getEventParent();\r
+\r
+                       // if the event start time is unknown, indicate it to the user\r
+                       String extraInfo = "\ni.e. outside of data time window";\r
+                       long eventStart = revent.getTime();\r
+                       if (eventStart < fviewParameters.getStartTime()) {\r
+                               toolTipEventMsgs.put("Start Time:", "Actual Event Start Time is undefined" + extraInfo);\r
+                               // avoid repeated details\r
+                               extraInfo = "";\r
+                       }\r
+\r
+                       long eventEnd = revent.getTime() + revent.getDuration();\r
+                       if (eventEnd > fviewParameters.getEndTime()) {\r
+                               toolTipEventMsgs.put("Stop Time:", "Actual Event Stop Time is undefined" + extraInfo);\r
+                       }\r
+\r
                        if (parent != null && parent instanceof TimeRangeEventProcess) {\r
                                TimeRangeEventProcess localProcess = (TimeRangeEventProcess) parent;\r
-                               toolTipEventMsgs.put("Process Type", localProcess\r
-                                               .getProcessType());\r
+                               toolTipEventMsgs.put("Process Type", localProcess.getProcessType());\r
                        }\r
                }\r
 \r
index 9e1aa27e35fe2dd65946f24ac552591cf54bda0f..e600841e97fed9a253cce05fb27b419fb0e7becb 100644 (file)
@@ -489,7 +489,7 @@ public class ControlFlowView extends AbsTimeUpdateView implements
                table.getVerticalBar().setVisible(false);
 
                tsfviewer = TmfViewerFactory.createViewer(sash,
                              new TimeRangeViewerProvider());
new TimeRangeViewerProvider(getParamsUpdater()));
 
                tsfviewer.addWidgetSelectionListner(this);
                tsfviewer.addWidgetTimeScaleSelectionListner(this);
index c0a9ccc5993277e855d6d0fc919966bef0c030ac..2c541d4b9e94287fa5ef1c06a141b94536359404 100644 (file)
@@ -18,8 +18,8 @@ import org.eclipse.linuxtools.lttng.state.model.LttngProcessState;
 import org.eclipse.linuxtools.lttng.state.model.LttngTraceState;
 import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeComponent;
 import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeEvent;
-import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeEventProcess;
 import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeEvent.Type;
+import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeEventProcess;
 import org.eclipse.linuxtools.lttng.ui.views.common.AbsTRangeUpdate;
 import org.eclipse.linuxtools.lttng.ui.views.common.ParamsUpdater;
 import org.eclipse.linuxtools.lttng.ui.views.controlflow.model.FlowModelFactory;
@@ -109,9 +109,12 @@ public abstract class AbsFlowTRangeUpdate extends AbsTRangeUpdate implements ILt
                Long stime = startTime;
                Long etime = endTime;
 
-//             if (etime == 13589873239052L || etime == 13589878374675L) {
-//                     System.out.println("probe here, " + stime + "->" + etime);
-//             }
+               if (!withinViewRange(stime, etime)) {
+                       // No use to process the event since it's outside
+                       // the visible time range of the window
+                       params.incrementEventsDiscarded(ParamsUpdater.OUT_OF_VIEWRANGE);
+                       return false;
+               }
 
                if (etime < stime) {
                        // Validate the sequential order of events
@@ -125,11 +128,21 @@ public abstract class AbsFlowTRangeUpdate extends AbsTRangeUpdate implements ILt
                // within the display window
                // ****** moved at the end since it produces gaps among the coloured rectangles
                // localProcess.setNext_good_time(etime);
-               if (!withinViewRange(stime, etime)) {
-                       // No use to process the event since it's outside
-                       // the visible time range of the window
-                       params.incrementEventsDiscarded(ParamsUpdater.OUT_OF_VIEWRANGE);
-                       return false;
+
+               // If First event of a process, initialise start time half page before to enable pagination to the left
+               if (stime < params.getStartTime()) {
+                       // event start time is before the visible time window
+                       long insertion = localProcess.getInsertionTime();
+                       if (stime.longValue() == insertion) {
+                               // if start time is equal to insertion this is the first event to be drawn for this process
+                               long halfPage = (params.getEndTime() - params.getStartTime()) / 2;
+                               long initTime = params.getStartTime() - halfPage;
+                               if (initTime > insertion) {
+                                       // start time of this event is unknown, place it half page before visible window to allow left side
+                                       // pagination when selecting previous event
+                                       stime = initTime;
+                               }
+                       }
                }
 
                // Determine if the time range event will fit it the current
index c441c5d0f14637a3f294013d42de738a64811c67..98668be440dbcafce6f58425ce04c6e0fdede880 100644 (file)
@@ -37,9 +37,17 @@ public class FlowFinishUpdateHandler extends AbsFlowTRangeUpdate
        }
 
        public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
-               // Draw a last known state to the end of the trace
-               long endReqTime = traceSt.getContext().getTraceTimeWindow()
-                               .getEndTime().getValue();
+               // The end of the last state is unknown since it's beyond the requested time range window. Create this last
+               // event to half page after the visible window but not beyond the end of trace
+               long endOfTrace = traceSt.getContext().getTraceTimeWindow().getEndTime().getValue();
+               long halfWindow = (params.getEndTime() - params.getStartTime()) / 2;
+
+               // End of event common to all processes within the trace for this specific request
+               long endOfEvent = params.getEndTime() + halfWindow;
+               if (endOfEvent > endOfTrace) {
+                       endOfEvent = endOfTrace;
+               }
+
                TraceDebug.debug("Number of localProcesses: "
                                + procContainer.readItems().length);
                // to identify the process relevant to the traceState
@@ -79,12 +87,10 @@ public class FlowFinishUpdateHandler extends AbsFlowTRangeUpdate
                                                // Draw with the Local information since the current
                                                // request did
                                                // not contain events related to this process
-                                               makeDraw(traceSt, nextGoodTime,
-                                                               endReqTime, localProcess, params, stateMode);
+                                               makeDraw(traceSt, nextGoodTime, endOfEvent, localProcess, params, stateMode);
                                        } else {
-                                               TraceDebug
-                                                               .debug("previous event not instance of TimeRangeEvent?: "
-                                                                               + prevEvent.getClass().getSimpleName());
+                                               TraceDebug.debug("previous event not instance of TimeRangeEvent?: "
+                                                               + prevEvent.getClass().getSimpleName());
                                        }
                                } else {
                                        numWithNoChildren++;
@@ -93,10 +99,10 @@ public class FlowFinishUpdateHandler extends AbsFlowTRangeUpdate
                                numLocalNotFound++;
                                continue;
                        }
+
                        numLocalFound++;
                        // Draw the last state for this process
-
-                       makeDraw(traceSt, endReqTime, stateProcess, localProcess, params);
+                       makeDraw(traceSt, endOfEvent, stateProcess, localProcess, params);
                }
 
                TraceDebug.debug("Print Last Event: NumLocalFound " + numLocalFound
index 6d7041d0466b01b62b3f15118890ef6bcc687135..ca340e0672df84ffe4d6a02c0fe7248060d4af65 100644 (file)
@@ -104,8 +104,7 @@ public class ResourcesView extends AbsTimeUpdateView implements
                top = new Composite(parent, SWT.BORDER);
 
                top.setLayout(new FillLayout());
-               tsfviewer = TmfViewerFactory.createViewer(top,
-                               new TimeRangeViewerProvider());
+               tsfviewer = TmfViewerFactory.createViewer(top, new TimeRangeViewerProvider(getParamsUpdater()));
 
                tsfviewer.addWidgetSelectionListner(this);
                tsfviewer.addWidgetTimeScaleSelectionListner(this);
index 8b9b511b68615e1dcd5d208b5b86cea5a92d00ac..355879a8e886c6866d76e205b6dbddd8c19a47c7 100644 (file)
@@ -214,6 +214,22 @@ public abstract class AbsResourcesTRangeUpdate extends AbsTRangeUpdate
                // Moved at the end since it produces space gaps among events
                // localResource.setNext_good_time(etime);
 
+               // If First event of a resource, initialise start time half page before to enable pagination to the left
+               if (stime < params.getStartTime()) {
+                       // event start time is before the visible time window
+                       long insertion = localResource.getInsertionTime();
+                       if (stime == insertion) {
+                               // if start time is equal to insertion this is the first event to be drawn for this resource
+                               long halfPage = (params.getEndTime() - params.getStartTime()) / 2;
+                               long initTime = params.getStartTime() - halfPage;
+                               if (initTime > insertion) {
+                                       // start time of this event is unknown, place it half page before visible window to allow left side
+                                       // pagination when selecting previous event
+                                       stime = initTime;
+                               }
+                       }
+               }
+
                // Determine if the time range event will fit it the current
                // pixel map
                double duration = etime - stime;
index 76743e60c85d03eb74d0e0d38294ed419fe102f8..f0cb48f441198dea04c06f05102ffe1f3350cdc4 100644 (file)
@@ -17,7 +17,6 @@ import org.eclipse.linuxtools.lttng.state.evProcessor.ILttngEventProcessor;
 import org.eclipse.linuxtools.lttng.state.model.LttngTraceState;
 import org.eclipse.linuxtools.lttng.ui.TraceDebug;
 import org.eclipse.linuxtools.lttng.ui.model.trange.TimeRangeEventResource;
-import org.eclipse.linuxtools.tmf.event.TmfTimestamp;
 
 /**
  * Creates specific finish state data request
@@ -35,10 +34,17 @@ public class ResourcesFinishUpdateHandler extends
        }
 
        public boolean process(LttngEvent trcEvent, LttngTraceState traceSt) {
-               // Draw a last known state to the end of the trace
-               TmfTimestamp endReqTime = traceSt.getContext()
-                               .getTraceTimeWindow().getEndTime();
+               // The end of the last state is unknown since it's beyond the requested time range window. Create this last
+               // event to half page after the visible window but not beyond the end of trace
+               long endOfTrace = traceSt.getContext().getTraceTimeWindow().getEndTime().getValue();
+               long halfWindow = (params.getEndTime() - params.getStartTime()) / 2;
 
+               // End of event common to all resources within the trace for this specific request
+               long endOfEvent = params.getEndTime() + halfWindow;
+               if (endOfEvent > endOfTrace) {
+                       endOfEvent = endOfTrace;
+               }
+               
                TraceDebug.debug("Number of localResources: "
                                + resContainer.readItems().length);
 
@@ -54,8 +60,7 @@ public class ResourcesFinishUpdateHandler extends
 
                        // Insert an instance from previous time to end request time with
                        // the current state
-                       makeDraw(traceSt, stime, endReqTime.getValue(),
-                                       localResource, params, stateMode);
+                       makeDraw(traceSt, stime, endOfEvent, localResource, params, stateMode);
                }
 
                return false;
index 430c3338925a91ffa8fa857eb1d4543cf3e6add6..0c82dd3a65954e99e9ad12bc908bcc62475b51dd 100644 (file)
@@ -46,8 +46,7 @@ import org.eclipse.linuxtools.tmf.trace.TmfTrace;
  * @author alvaro
  * 
  */
-public class LttngSyntheticEventProvider extends
-               TmfEventProvider<LttngSyntheticEvent> {
+public class LttngSyntheticEventProvider extends TmfEventProvider<LttngSyntheticEvent> {
 
        // ========================================================================
        // Data
@@ -65,8 +64,7 @@ public class LttngSyntheticEventProvider extends
        private int fMainReqEventCount = 0;
        volatile boolean startIndSent = false;
        private LTTngTreeNode fExperiment = null;
-       private ITransEventProcessor fstateUpdateProcessor = StateEventToHandlerFactory
-                       .getInstance();
+       private ITransEventProcessor fstateUpdateProcessor = StateEventToHandlerFactory.getInstance();
        private boolean waitForRequest = false;
 
        // ========================================================================
@@ -84,15 +82,12 @@ public class LttngSyntheticEventProvider extends
                // the framework
                TmfEventSource source = new TmfEventSource(this);
                LttngEventType dtype = new LttngEventType();
-               LttngTimestamp statusTimeStamp = new LttngTimestamp(
-                               TmfTimestamp.Zero);
+               LttngTimestamp statusTimeStamp = new LttngTimestamp(TmfTimestamp.Zero);
 
-               fStatusEvent = new LttngSyntheticEvent(null, statusTimeStamp, source,
-                               dtype, null, null, null);
+               fStatusEvent = new LttngSyntheticEvent(null, statusTimeStamp, source, dtype, null, null, null);
                fStatusEvent.setSequenceInd(SequenceInd.STARTREQ);
 
-               fStatusEventAck = new LttngSyntheticEvent(null, statusTimeStamp,
-                               source, dtype, null, null, null);
+               fStatusEventAck = new LttngSyntheticEvent(null, statusTimeStamp, source, dtype, null, null, null);
                fStatusEventAck.setSequenceInd(SequenceInd.ACK);
        }
 
@@ -102,8 +97,7 @@ public class LttngSyntheticEventProvider extends
 
        @SuppressWarnings("unchecked")
        @Override
-       public ITmfContext armRequest(
-                       final ITmfDataRequest<LttngSyntheticEvent> request) {
+       public ITmfContext armRequest(final ITmfDataRequest<LttngSyntheticEvent> request) {
                // validate
                // make sure we have the right type of request
                if (!(request instanceof ITmfEventRequest<?>)) {
@@ -142,8 +136,7 @@ public class LttngSyntheticEventProvider extends
                for (IStateTraceManager traceManager : fEventProviderRequests.keySet()) {
 
                        // restore trace state system to nearest check point
-                       TmfTimestamp checkPoint = traceManager
-                                       .restoreCheckPointByTimestamp(reqWindow.getStartTime());
+                       TmfTimestamp checkPoint = traceManager.restoreCheckPointByTimestamp(reqWindow.getStartTime());
 
                        // adjust start time bound to check point
 
@@ -176,28 +169,25 @@ public class LttngSyntheticEventProvider extends
 
                                private final long fDispatchTime = getDispatchTime().getValue();
                                private final LttngTraceState fTraceModel = getTraceModel();
+                               private LttngSyntheticEvent[] fresult = new LttngSyntheticEvent[1];
 
                                /*
                                 * (non-Javadoc)
                                 * 
-                                * @see
-                                * org.eclipse.linuxtools.lttng.control.LttngEventRequest#handleData
-                                * ()
+                                * @see org.eclipse.linuxtools.lttng.control.LttngEventRequest#handleData ()
                                 */
                                @Override
                                public void handleData() {
                                        LttngEvent[] events = getData();
-                                       
-//                                     Tracer.trace("Sep: " + events[0].getTimestamp());
+
+                                       // Tracer.trace("Sep: " + events[0].getTimestamp());
 
                                        if (events.length > 0) {
-                                               for (LttngEvent e : events) {
-                                                       handleIncomingData(e);
-                                               }
+                                               handleIncomingData(events[0]);
                                        } else {
                                                TraceDebug.debug("handle data received with no data");
-//                                             handleProviderDone(getTraceModel());
-//                                             done();
+                                               // handleProviderDone(getTraceModel());
+                                               // done();
                                        }
                                }
 
@@ -210,10 +200,10 @@ public class LttngSyntheticEventProvider extends
                                public void done() {
                                        // mark this sub-request as completed
                                        super.done();
-                                       handleProviderDone(getTraceModel());
-//                                     super.done();
+                                       handleProviderDone();
+                                       // super.done();
                                }
-                               
+
                                /**
                                 * Trigger the Analysis and sequential control of the events.
                                 * 
@@ -222,51 +212,43 @@ public class LttngSyntheticEventProvider extends
                                private void handleIncomingData(LttngEvent e) {
                                        long eventTime = e.getTimestamp().getValue();
 
-                                       // if (eventTime == 13589777932952L) {
-                                       // // syscall entry id 78 expected
-                                       // System.out.println("debug mark at 13589777932952L");
-                                       // }
-
-                                       TmfTrace<LttngEvent> inTrace =  e.getParentTrace();
+                                       TmfTrace<LttngEvent> inTrace = e.getParentTrace();
                                        if (!(inTrace == getTrace())) {
-//                                             System.out.println("Event from a different trace discarded");
+                                               // System.out.println("Event from a different trace discarded");
                                                return;
                                        }
-                                       
+
                                        // 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);
+                                               // Load synthetic event as the result data
+                                               fresult[0] = syntheticEvent;
 
-                                               LttngSyntheticEvent[] result = new LttngSyntheticEvent[1];
-                                               result[0] = syntheticEvent;
-                                               fmainRequest.setData(result);
-                                               fmainRequest.handleData();
-                                               result[0] = syntheticAckIndicator;
-                                               fmainRequest.setData(result);
+                                               // BEFORE UPDATE : update to the before state-update handlers
+                                               syntheticEvent.setSequenceInd(SequenceInd.BEFORE);
+                                               // queueResult(syntheticEvent);
+                                               // queueResult(syntheticAckIndicator);
+                                               fmainRequest.setData(fresult);
                                                fmainRequest.handleData();
+                                               // result[0] = syntheticAckIndicator;
+                                               // fmainRequest.setData(result);
+                                               // fmainRequest.handleData();
 
-                                               // Update state locally
+                                               // STATE UPDATE: local handlers
                                                syntheticEvent.setSequenceInd(SequenceInd.UPDATE);
                                                fstateUpdateProcessor.process(syntheticEvent, fTraceModel);
 
-                                               // After Update
+                                               // AFTER UPDATE: update to the after state-update handlers
                                                syntheticEvent.setSequenceInd(SequenceInd.AFTER);
-//                                             queueResult(syntheticEvent);
-//                                             queueResult(syntheticAckIndicator);
-
-                                               result = new LttngSyntheticEvent[1];
-                                               result[0] = syntheticEvent;
-                                               fmainRequest.setData(result);
-                                               fmainRequest.handleData();
-                                               result[0] = syntheticAckIndicator;
-                                               fmainRequest.setData(result);
+                                               // queueResult(syntheticEvent);
+                                               // queueResult(syntheticAckIndicator);
+                                               fmainRequest.setData(fresult);
                                                fmainRequest.handleData();
+                                               // result[0] = syntheticAckIndicator;
+                                               // fmainRequest.setData(result);
+                                               // fmainRequest.handleData();
 
                                                // increment once per dispatch
                                                incrementSynEvenCount();
@@ -282,18 +264,16 @@ public class LttngSyntheticEventProvider extends
                                }
 
                                /**
-                                * Create a synthetic event from the received new reference, if
-                                * the reference is the same there is no need for a new instance
+                                * Create a synthetic event from the received new reference, if the reference is the same there is no
+                                * need for a new instance
                                 * 
-                                * if this is the first event for this request, call start
-                                * handler
+                                * if this is the first event for this request, call start handler
                                 * 
                                 * @param e
                                 * @return
                                 */
                                private LttngSyntheticEvent updateSynEvent(LttngEvent e) {
-                                       if (syntheticEvent == null
-                                                       || syntheticEvent.getBaseEvent() != e) {
+                                       if (syntheticEvent == null || syntheticEvent.getBaseEvent() != e) {
                                                syntheticEvent = new LttngSyntheticEvent(e);
                                                syntheticAckIndicator = new LttngSyntheticEvent(e);
                                                syntheticAckIndicator.setSequenceInd(SequenceInd.ACK);
@@ -312,7 +292,7 @@ public class LttngSyntheticEventProvider extends
                                        return syntheticEvent;
                                }
                        };
-                                               
+
                        // preserve the associated sub request to control it e.g.
                        // cancellation
                        fEventProviderRequests.put(traceManager, subRequest);
@@ -343,27 +323,26 @@ public class LttngSyntheticEventProvider extends
                result[0] = startIndEvent;
                fmainRequest.setData(result);
                fmainRequest.handleData();
-               result[0] = fStatusEventAck;
-               fmainRequest.setData(result);
-               fmainRequest.handleData();
-
-//             try {
-//                     queueResult(startIndEvent);
-//                     queueResult(fStatusEventAck);
-//             } catch (InterruptedException e) {
-//                     // TODO: cancel this request
-//                     e.printStackTrace();
-//             }
+               // result[0] = fStatusEventAck;
+               // fmainRequest.setData(result);
+               // fmainRequest.handleData();
+
+               // try {
+               // queueResult(startIndEvent);
+               // queueResult(fStatusEventAck);
+               // } catch (InterruptedException e) {
+               // // TODO: cancel this request
+               // e.printStackTrace();
+               // }
 
                // Notify state event processor
                fstateUpdateProcessor.process(startIndEvent, null);
        }
 
        /**
-        * Notify listeners, no more events for the current request will be
-        * distributed e.g. update view.
+        * Notify listeners, no more events for the current request will be distributed e.g. update view.
         */
-       public synchronized void handleProviderDone(LttngTraceState traceModel) {
+       public synchronized void handleProviderDone() {
                // TODO: The use of a thread per main request and thread per sub-request
                // requires
                // to make sure the proper main request is marked completed. So a
@@ -380,34 +359,44 @@ public class LttngSyntheticEventProvider extends
                        }
                }
 
-               // All sub-requests are marked completed so the main request can be
-               // completed as well
-               // Notify application,
-               LttngSyntheticEvent finishEvent = new LttngSyntheticEvent(fStatusEvent);
-               finishEvent.setSequenceInd(SequenceInd.ENDREQ);
-               finishEvent.setTraceModel(traceModel);
+               // Notify application. One notification per trace so the last state of each trace can be
+               // drawn
+               LttngTraceState traceModel;
+               for (IStateTraceManager traceMgr : fEventProviderRequests.keySet()) {
+                       traceModel = traceMgr.getStateModel();
+
+                       LttngSyntheticEvent finishEvent = new LttngSyntheticEvent(fStatusEvent);
+                       // finishEvent.setTraceModel(traceModel);
+                       // finishEvent.setParentTrace((TmfTrace<LttngEvent>) traceModel.getContext().getTraceIdRef());
+                       finishEvent.setSequenceInd(SequenceInd.ENDREQ);
+                       finishEvent.setTraceModel(traceModel);
+
+                       LttngSyntheticEvent[] result = new LttngSyntheticEvent[1];
+                       // End Request indication
+                       result[0] = finishEvent;
+                       fmainRequest.setData(result);
+                       fmainRequest.handleData();
+
+                       // // End Request processed indication
+                       // result[0] = fStatusEventAck;
+                       // fmainRequest.setData(result);
+                       // fmainRequest.handleData();
+               }
 
-               LttngSyntheticEvent[] result = new LttngSyntheticEvent[1];
-               result[0] = finishEvent;
-               fmainRequest.setData(result);
-               fmainRequest.handleData();
-               result[0] = fStatusEventAck;
-               fmainRequest.setData(result);
-               fmainRequest.handleData();
-               
+               // All sub-requests are marked completed so the main request can be completed as well
                fmainRequest.done();
 
-               //              try {
-//                     queueResult(finishEvent);
-//                     queueResult(fStatusEventAck);
-//                     // End the loop in the main request
-//                     queueResult(LttngSyntheticEvent.NullEvent);
-//             } catch (InterruptedException e) {
-//                     // System.out.println(getName() +
-//                     // ":handleProviderDone() failed to queue request");
-//                     // TODO: Cancel the request
-////                   e.printStackTrace();
-//             }
+               // try {
+               // queueResult(finishEvent);
+               // queueResult(fStatusEventAck);
+               // // End the loop in the main request
+               // queueResult(LttngSyntheticEvent.NullEvent);
+               // } catch (InterruptedException e) {
+               // // System.out.println(getName() +
+               // // ":handleProviderDone() failed to queue request");
+               // // TODO: Cancel the request
+               // // e.printStackTrace();
+               // }
        }
 
        /**
@@ -464,21 +453,18 @@ public class LttngSyntheticEventProvider extends
         * @param experiment
         */
        private synchronized void updateExperimentNode(LTTngTreeNode experiment) {
-               if (experiment != null
-                               && experiment.getValue() instanceof TmfExperiment<?>) {
+               if (experiment != null && experiment.getValue() instanceof TmfExperiment<?>) {
                        fExperiment = experiment;
                } else {
                        TraceDebug
-                                       .debug("Experiment received is not instance of TmfExperiment: "
-                                                       + experiment.getClass().getName());
+                                       .debug("Experiment received is not instance of TmfExperiment: " + experiment.getClass().getName());
                }
        }
 
        /*
         * (non-Javadoc)
         * 
-        * @see
-        * org.eclipse.linuxtools.tmf.component.TmfDataProvider#sendRequest(org.
+        * @see org.eclipse.linuxtools.tmf.component.TmfDataProvider#sendRequest(org.
         * eclipse.linuxtools.tmf.request.TmfDataRequest)
         */
        @Override
@@ -518,14 +504,14 @@ public class LttngSyntheticEventProvider extends
                return null;
        }
 
-//     @Override
-//     public LttngSyntheticEvent getNext(ITmfContext context) {
-//             return super.getNext(context);
-//     }
+       // @Override
+       // public LttngSyntheticEvent getNext(ITmfContext context) {
+       // return super.getNext(context);
+       // }
 
-//     @Override
-//     public void queueResult(LttngSyntheticEvent data) {
-//             super.queueResult(data);
-//     }
+       // @Override
+       // public void queueResult(LttngSyntheticEvent data) {
+       // super.queueResult(data);
+       // }
 
 }
index 02729cfdf9cd855073bc774472725362413151b3..988c6197309534f23ef4616cf093580de131dc4b 100644 (file)
@@ -396,7 +396,17 @@ public class TmfTimeStatesCtrl extends TraceCtrl implements FocusListener,
                if (null == nextEvent && -1 == n)\r
                        nextEvent = Utils.getFirstEvent(trace);\r
                if (null != nextEvent) {\r
-                       _timeProvider.setSelectedTimeInt(nextEvent.getTime(), true);\r
+                       long nextTime = nextEvent.getTime();\r
+                       // If last event detected e.g. going back or not moving to a next event\r
+                       if (nextTime <= selectedTime && n == 1) {\r
+                               // Select to the end of this last event\r
+                               nextTime = nextEvent.getTime() + nextEvent.getDuration();\r
+                               // but not beyond the end of the trace\r
+                               if (nextTime > endTime) {\r
+                                       nextTime = endTime;\r
+                               }\r
+                       }\r
+                       _timeProvider.setSelectedTimeInt(nextTime, true);\r
                        fireSelectionChanged();\r
                } else if (1 == n) {\r
                        _timeProvider.setSelectedTimeInt(endTime, true);\r
@@ -406,10 +416,14 @@ public class TmfTimeStatesCtrl extends TraceCtrl implements FocusListener,
 \r
        public void selectNextEvent() {\r
                selectEvent(1);\r
+               // Notify if visible time window has been adjusted\r
+               _timeProvider.setStartFinishTimeNotify(_timeProvider.getTime0(), _timeProvider.getTime1());\r
        }\r
 \r
        public void selectPrevEvent() {\r
                selectEvent(-1);\r
+               // Notify if visible time window has been adjusted\r
+               _timeProvider.setStartFinishTimeNotify(_timeProvider.getTime0(), _timeProvider.getTime1());\r
        }\r
 \r
        public void selectNextTrace() {\r
This page took 0.134612 seconds and 5 git commands to generate.