From a72a38d942016cb14ae074046149f6b080a15349 Mon Sep 17 00:00:00 2001 From: Alvaro Sanchez-Leon Date: Wed, 30 Jun 2010 03:48:47 +0000 Subject: [PATCH] June 29th, 2010 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. --- .../linuxtools/lttng/AllLTTngTests.java | 5 +- .../lttng/LttngTestPreparation.java | 93 ++++---- .../LTTngSyntheticEventProviderTest.java | 136 ++++++----- .../model/trange/TimeRangeViewerProvider.java | 24 +- .../ui/views/controlflow/ControlFlowView.java | 2 +- .../evProcessor/AbsFlowTRangeUpdate.java | 31 ++- .../evProcessor/FlowFinishUpdateHandler.java | 26 ++- .../ui/views/resources/ResourcesView.java | 3 +- .../evProcessor/AbsResourcesTRangeUpdate.java | 16 ++ .../ResourcesFinishUpdateHandler.java | 17 +- .../control/LttngSyntheticEventProvider.java | 218 ++++++++---------- .../widgets/TmfTimeStatesCtrl.java | 16 +- 12 files changed, 318 insertions(+), 269 deletions(-) diff --git a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/AllLTTngTests.java b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/AllLTTngTests.java index 8fc137c686..7f15431fd0 100644 --- a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/AllLTTngTests.java +++ b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/AllLTTngTests.java @@ -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); diff --git a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/LttngTestPreparation.java b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/LttngTestPreparation.java index 41fe461273..d729958003 100644 --- a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/LttngTestPreparation.java +++ b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/LttngTestPreparation.java @@ -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 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.class, + expId, traces); + // fTestExperiment.indexExperiment(waitForCompletion); + + // Set the current selected experiment as the test experiment + TmfExperimentSelectedSignal signal = new TmfExperimentSelectedSignal( + 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.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 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.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 signal = new TmfExperimentSelectedSignal( - 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( diff --git a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/control/LTTngSyntheticEventProviderTest.java b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/control/LTTngSyntheticEventProviderTest.java index 3c7f861b60..8b59b27b23 100644 --- a/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/control/LTTngSyntheticEventProviderTest.java +++ b/org.eclipse.linuxtools.lttng.tests/src/org/eclipse/linuxtools/lttng/control/LTTngSyntheticEventProviderTest.java @@ -12,6 +12,11 @@ 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 experiment = prepareExperimentToTest(); -// TmfEventRequest 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 experiment = prepareExperimentToTest(); + TmfEventRequest 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 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 request1 = prepareEventRequest(LttngSyntheticEvent.class, 5, 9, -// printExpectedEvents); /* 2001 events */ -// TmfEventRequest 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 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 request1 = prepareEventRequest(LttngSyntheticEvent.class, 5, 9, + printExpectedEvents); /* 2001 events */ + TmfEventRequest 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 diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/model/trange/TimeRangeViewerProvider.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/model/trange/TimeRangeViewerProvider.java index c0716278d7..ee831bd68e 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/model/trange/TimeRangeViewerProvider.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/model/trange/TimeRangeViewerProvider.java @@ -21,6 +21,7 @@ import org.eclipse.linuxtools.lttng.state.StateStrings.IRQMode; import org.eclipse.linuxtools.lttng.state.StateStrings.ProcessStatus; import org.eclipse.linuxtools.lttng.state.StateStrings.SoftIRQMode; import org.eclipse.linuxtools.lttng.state.StateStrings.TrapMode; +import org.eclipse.linuxtools.lttng.ui.views.common.ParamsUpdater; import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.TmfTimeAnalysisProvider; import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITimeEvent; import org.eclipse.linuxtools.tmf.ui.viewers.timeAnalysis.model.ITmfTimeAnalysisEntry; @@ -40,10 +41,12 @@ public class TimeRangeViewerProvider extends TmfTimeAnalysisProvider { Map irqStateToColor = new HashMap(4); Map cpuStateToColor = new HashMap(8); + private final ParamsUpdater fviewParameters; + // ======================================================================== // Constructors // ======================================================================= - public TimeRangeViewerProvider() { + public TimeRangeViewerProvider(ParamsUpdater paramsUpdater) { // Fill the statemode to color maps fillProcessStateToColor(); fillBdevStateToColor(); @@ -51,6 +54,7 @@ public class TimeRangeViewerProvider extends TmfTimeAnalysisProvider { fillTrapStateToColor(); fillIrqStateToColor(); fillCpuStateToColor(); + fviewParameters = paramsUpdater; } // ======================================================================== @@ -107,10 +111,24 @@ public class TimeRangeViewerProvider extends TmfTimeAnalysisProvider { if (revent instanceof TimeRangeComponent) { ITimeRangeComponent parent = ((TimeRangeComponent) revent) .getEventParent(); + + // if the event start time is unknown, indicate it to the user + String extraInfo = "\ni.e. outside of data time window"; + long eventStart = revent.getTime(); + if (eventStart < fviewParameters.getStartTime()) { + toolTipEventMsgs.put("Start Time:", "Actual Event Start Time is undefined" + extraInfo); + // avoid repeated details + extraInfo = ""; + } + + long eventEnd = revent.getTime() + revent.getDuration(); + if (eventEnd > fviewParameters.getEndTime()) { + toolTipEventMsgs.put("Stop Time:", "Actual Event Stop Time is undefined" + extraInfo); + } + if (parent != null && parent instanceof TimeRangeEventProcess) { TimeRangeEventProcess localProcess = (TimeRangeEventProcess) parent; - toolTipEventMsgs.put("Process Type", localProcess - .getProcessType()); + toolTipEventMsgs.put("Process Type", localProcess.getProcessType()); } } diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/ControlFlowView.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/ControlFlowView.java index 9e1aa27e35..e600841e97 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/ControlFlowView.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/ControlFlowView.java @@ -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); diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/evProcessor/AbsFlowTRangeUpdate.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/evProcessor/AbsFlowTRangeUpdate.java index c0a9ccc599..2c541d4b9e 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/evProcessor/AbsFlowTRangeUpdate.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/evProcessor/AbsFlowTRangeUpdate.java @@ -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 diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/evProcessor/FlowFinishUpdateHandler.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/evProcessor/FlowFinishUpdateHandler.java index c441c5d0f1..98668be440 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/evProcessor/FlowFinishUpdateHandler.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/controlflow/evProcessor/FlowFinishUpdateHandler.java @@ -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 diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/ResourcesView.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/ResourcesView.java index 6d7041d046..ca340e0672 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/ResourcesView.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/ResourcesView.java @@ -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); diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/evProcessor/AbsResourcesTRangeUpdate.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/evProcessor/AbsResourcesTRangeUpdate.java index 8b9b511b68..355879a8e8 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/evProcessor/AbsResourcesTRangeUpdate.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/evProcessor/AbsResourcesTRangeUpdate.java @@ -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; diff --git a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/evProcessor/ResourcesFinishUpdateHandler.java b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/evProcessor/ResourcesFinishUpdateHandler.java index 76743e60c8..f0cb48f441 100644 --- a/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/evProcessor/ResourcesFinishUpdateHandler.java +++ b/org.eclipse.linuxtools.lttng.ui/src/org/eclipse/linuxtools/lttng/ui/views/resources/evProcessor/ResourcesFinishUpdateHandler.java @@ -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; diff --git a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/control/LttngSyntheticEventProvider.java b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/control/LttngSyntheticEventProvider.java index 430c333892..0c82dd3a65 100644 --- a/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/control/LttngSyntheticEventProvider.java +++ b/org.eclipse.linuxtools.lttng/src/org/eclipse/linuxtools/lttng/control/LttngSyntheticEventProvider.java @@ -46,8 +46,7 @@ import org.eclipse.linuxtools.tmf.trace.TmfTrace; * @author alvaro * */ -public class LttngSyntheticEventProvider extends - TmfEventProvider { +public class LttngSyntheticEventProvider extends TmfEventProvider { // ======================================================================== // 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 request) { + public ITmfContext armRequest(final ITmfDataRequest 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 inTrace = e.getParentTrace(); + TmfTrace 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) 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); + // } } diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/timeAnalysis/widgets/TmfTimeStatesCtrl.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/timeAnalysis/widgets/TmfTimeStatesCtrl.java index 02729cfdf9..988c619730 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/timeAnalysis/widgets/TmfTimeStatesCtrl.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/viewers/timeAnalysis/widgets/TmfTimeStatesCtrl.java @@ -396,7 +396,17 @@ public class TmfTimeStatesCtrl extends TraceCtrl implements FocusListener, if (null == nextEvent && -1 == n) nextEvent = Utils.getFirstEvent(trace); if (null != nextEvent) { - _timeProvider.setSelectedTimeInt(nextEvent.getTime(), true); + long nextTime = nextEvent.getTime(); + // If last event detected e.g. going back or not moving to a next event + if (nextTime <= selectedTime && n == 1) { + // Select to the end of this last event + nextTime = nextEvent.getTime() + nextEvent.getDuration(); + // but not beyond the end of the trace + if (nextTime > endTime) { + nextTime = endTime; + } + } + _timeProvider.setSelectedTimeInt(nextTime, true); fireSelectionChanged(); } else if (1 == n) { _timeProvider.setSelectedTimeInt(endTime, true); @@ -406,10 +416,14 @@ public class TmfTimeStatesCtrl extends TraceCtrl implements FocusListener, public void selectNextEvent() { selectEvent(1); + // Notify if visible time window has been adjusted + _timeProvider.setStartFinishTimeNotify(_timeProvider.getTime0(), _timeProvider.getTime1()); } public void selectPrevEvent() { selectEvent(-1); + // Notify if visible time window has been adjusted + _timeProvider.setStartFinishTimeNotify(_timeProvider.getTime0(), _timeProvider.getTime1()); } public void selectNextTrace() { -- 2.34.1