X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=analysis%2Forg.eclipse.tracecompass.analysis.timing.ui%2Fsrc%2Forg%2Feclipse%2Ftracecompass%2Fanalysis%2Ftiming%2Fui%2Fviews%2Fsegmentstore%2Fscatter%2FAbstractSegmentStoreScatterGraphViewer.java;h=e55fbe0780e7a09fec3144c9c7e3b988c6a592db;hb=e18d40d0604c06dbf62f0af4eeed910c28526c41;hp=fe2731c4da69a59a09291b7efd01b40e74d037e4;hpb=61d830e8d0cc9a743ffa861134454bb9d0b56392;p=deliverable%2Ftracecompass.git diff --git a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/AbstractSegmentStoreScatterGraphViewer.java b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/AbstractSegmentStoreScatterGraphViewer.java index fe2731c4da..e55fbe0780 100644 --- a/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/AbstractSegmentStoreScatterGraphViewer.java +++ b/analysis/org.eclipse.tracecompass.analysis.timing.ui/src/org/eclipse/tracecompass/analysis/timing/ui/views/segmentstore/scatter/AbstractSegmentStoreScatterGraphViewer.java @@ -19,13 +19,13 @@ import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jdt.annotation.Nullable; -import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.tracecompass.analysis.timing.core.segmentstore.IAnalysisProgressListener; @@ -40,7 +40,6 @@ import org.eclipse.tracecompass.segmentstore.core.ISegmentStore; import org.eclipse.tracecompass.segmentstore.core.SegmentComparators; import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule; import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler; -import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager; import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal; import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal; import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal; @@ -48,19 +47,14 @@ import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal; import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange; import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager; -import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentInfo; -import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentSignal; -import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfChartTimeStampFormat; import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfCommonXLineChartViewer; -import org.swtchart.Chart; -import org.swtchart.IAxis; -import org.swtchart.IAxisTick; import org.swtchart.ILineSeries; import org.swtchart.ILineSeries.PlotSymbolType; import org.swtchart.ISeries.SeriesType; import org.swtchart.ISeriesSet; import org.swtchart.LineStyle; -import org.swtchart.Range; + +import com.google.common.primitives.Doubles; /** * Displays the segment store provider data in a scatter graph @@ -73,6 +67,8 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL private static final Format FORMAT = new SubSecondTimeWithUnitFormat(); + private final AtomicInteger fDirty = new AtomicInteger(); + private final class CompactingSegmentStoreQuery extends Job { private static final long MAX_POINTS = 1000; private final TmfTimeRange fCurrentRange; @@ -85,52 +81,70 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL @Override protected IStatus run(@Nullable IProgressMonitor monitor) { final IProgressMonitor statusMonitor = monitor; - if (statusMonitor == null) { - return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Monitor is null"); //$NON-NLS-1$ - } + try { + if (statusMonitor == null) { + return new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Monitor is null"); //$NON-NLS-1$ + } - ISegmentStoreProvider segmentProvider = getSegmentProvider(); - final long startTimeInNanos = fCurrentRange.getStartTime().toNanos(); - final long endTimeInNanos = fCurrentRange.getEndTime().toNanos(); - if (segmentProvider == null) { - setWindowRange(startTimeInNanos, endTimeInNanos); - redraw(statusMonitor, startTimeInNanos, startTimeInNanos, Collections.EMPTY_LIST); - return new Status(IStatus.WARNING, Activator.PLUGIN_ID, "segment provider not available"); //$NON-NLS-1$ - } + ISegmentStoreProvider segmentProvider = getSegmentProvider(); + final long startTimeInNanos = fCurrentRange.getStartTime().toNanos(); + final long endTimeInNanos = fCurrentRange.getEndTime().toNanos(); + if (segmentProvider == null) { + setWindowRange(startTimeInNanos, endTimeInNanos); + redraw(statusMonitor, startTimeInNanos, startTimeInNanos, Collections.EMPTY_LIST); + return new Status(IStatus.WARNING, Activator.PLUGIN_ID, "segment provider not available"); //$NON-NLS-1$ + } - final ISegmentStore segStore = segmentProvider.getSegmentStore(); - if (segStore == null) { - setWindowRange(startTimeInNanos, endTimeInNanos); - redraw(statusMonitor, startTimeInNanos, startTimeInNanos, Collections.EMPTY_LIST); - return new Status(IStatus.INFO, Activator.PLUGIN_ID, "Segment provider does not have segments"); //$NON-NLS-1$ - } + final ISegmentStore segStore = segmentProvider.getSegmentStore(); + if (segStore == null) { + setWindowRange(startTimeInNanos, endTimeInNanos); + redraw(statusMonitor, startTimeInNanos, startTimeInNanos, Collections.EMPTY_LIST); + return new Status(IStatus.INFO, Activator.PLUGIN_ID, "Segment provider does not have segments"); //$NON-NLS-1$ + } - final long startTime = fCurrentRange.getStartTime().getValue(); - final long endTime = fCurrentRange.getEndTime().getValue(); - fPixelStart = startTime; - fPixelSize = Math.max(1, (endTime - startTime) / MAX_POINTS); - final Iterable intersectingElements = segStore.getIntersectingElements(startTime, endTime); + final long startTime = fCurrentRange.getStartTime().getValue(); + final long endTime = fCurrentRange.getEndTime().getValue(); + fPixelStart = startTime; + fPixelSize = Math.max(1, (endTime - startTime) / MAX_POINTS); + final Iterable intersectingElements = segStore.getIntersectingElements(startTime, endTime); - final List list = convertIterableToList(intersectingElements, statusMonitor); - final List displayData = (!list.isEmpty()) ? compactList(startTime, list, statusMonitor) : list; + final List list = convertIterableToList(intersectingElements, statusMonitor); + final List displayData = (!list.isEmpty()) ? compactList(startTime, list, statusMonitor) : list; - setWindowRange(startTimeInNanos, endTimeInNanos); - redraw(statusMonitor, startTime, endTime, displayData); + setWindowRange(startTimeInNanos, endTimeInNanos); + redraw(statusMonitor, startTime, endTime, displayData); - if (statusMonitor.isCanceled()) { - return Status.CANCEL_STATUS; + if (statusMonitor.isCanceled()) { + return Status.CANCEL_STATUS; + } + return Status.OK_STATUS; + } finally { + /* + * fDirty should have been incremented before creating a job, so + * we decrement it once the job is done + */ + fDirty.decrementAndGet(); } - return Status.OK_STATUS; } private void redraw(final IProgressMonitor statusMonitor, final long startTime, final long endTime, final List displayData) { fDisplayData = displayData; + /* + * Increment at every redraw, since the content of the view is not + * current + */ + fDirty.incrementAndGet(); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { - updateData(startTime, endTime, displayData.size(), statusMonitor); + try { + updateData(startTime, endTime, displayData.size(), statusMonitor); + } finally { + /* Decrement once the redraw is done */ + fDirty.decrementAndGet(); + } } }); } @@ -202,7 +216,6 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL // Only update the model if trace that was analyzed is active trace if (segmentProvider.equals(getSegmentProvider())) { updateModel(segmentStore); - updateRange(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange()); } } } @@ -259,7 +272,6 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL if (segmentStoreProvider != null) { segmentStoreProvider.addListener(fListener); setData(segmentStoreProvider); - updateRange(TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange()); } } } @@ -317,59 +329,23 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL Collection data = fDisplayData; final int dataSize = (nb == 0) ? data.size() : nb; - if (dataSize == 0 || end == start) { + if (end == start) { return; } - final double[] xSeries = new double[dataSize]; - final double[] ySeries = new double[dataSize]; + List xSeries = new ArrayList<>(dataSize); + List ySeries = new ArrayList<>(dataSize); // For each visible segments, add start time to x value and duration // for y value Iterator modelIter = data.iterator(); - long maxTempY = 1; - for (int i = 0; i < dataSize; i++) { - if (modelIter.hasNext()) { - ISegment segment = modelIter.next(); - xSeries[i] = segment.getStart() - start; - ySeries[i] = segment.getLength(); - maxTempY = Math.max(maxTempY, segment.getLength()); - } - } - final long maxY = maxTempY; - setXAxis(xSeries); - final Chart swtChart = getSwtChart(); - if (swtChart.isDisposed() || xSeries.length < 1) { - return; - } - swtChart.updateLayout(); - setSeries(Messages.SegmentStoreScatterGraphViewer_legend, ySeries); // $NON-NLS-1$ - final TmfChartTimeStampFormat tmfChartTimeStampFormat = new TmfChartTimeStampFormat(getTimeOffset()); - ILineSeries series = (ILineSeries) swtChart.getSeriesSet().getSeries(Messages.SegmentStoreScatterGraphViewer_legend); - if (series == null) { - series = addSeries(Messages.SegmentStoreScatterGraphViewer_legend); - } - series.setXSeries(xSeries); - /* Find the minimal and maximum values in this series */ - series.setYSeries(ySeries); - - final IAxis xAxis = swtChart.getAxisSet().getXAxis(0); - IAxisTick xTick = xAxis.getTick(); - xTick.setFormat(tmfChartTimeStampFormat); - xAxis.setRange(new Range(0.0, end - start)); - if (maxY > 0.0) { - swtChart.getAxisSet().getYAxis(0).setRange(new Range(0.0, maxY)); - } - swtChart.redraw(); - - if (isSendTimeAlignSignals()) { - // The width of the chart might have changed and its - // time axis might be misaligned with the other views - Point viewPos = AbstractSegmentStoreScatterGraphViewer.this.getParent().getParent().toDisplay(0, 0); - int axisPos = swtChart.toDisplay(0, 0).x + getPointAreaOffset(); - int timeAxisOffset = axisPos - viewPos.x; - TmfTimeViewAlignmentInfo timeAlignmentInfo = new TmfTimeViewAlignmentInfo(getControl().getShell(), viewPos, timeAxisOffset); - TmfSignalManager.dispatchSignal(new TmfTimeViewAlignmentSignal(AbstractSegmentStoreScatterGraphViewer.this, timeAlignmentInfo, true)); + while (modelIter.hasNext()) { + ISegment segment = modelIter.next(); + xSeries.add((double) (segment.getStart() - start)); + ySeries.add((double) segment.getLength()); } + setXAxis(Doubles.toArray(xSeries)); + setSeries(Messages.SegmentStoreScatterGraphViewer_legend, Doubles.toArray(ySeries)); + updateDisplay(); } @Override @@ -479,6 +455,11 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL } private void updateRange(final @Nullable TmfTimeRange timeRange) { + /* + * Update is request, content is not up to date, fDirty will be + * decremented in the compacting job + */ + fDirty.incrementAndGet(); Job compactingJob = fCompactingJob; if (compactingJob != null && compactingJob.getState() == Job.RUNNING) { compactingJob.cancel(); @@ -535,4 +516,10 @@ public abstract class AbstractSegmentStoreScatterGraphViewer extends TmfCommonXL private void setSegmentProvider(ISegmentStoreProvider provider) { fSegmentProvider = provider; } + + @Override + public boolean isDirty() { + /* Check the parent's or this view's own dirtiness */ + return super.isDirty() || (fDirty.get() != 0); + } } \ No newline at end of file