diff options
author | Andrey Loskutov | 2018-06-14 07:46:38 +0000 |
---|---|---|
committer | Andrey Loskutov | 2018-06-14 09:15:33 +0000 |
commit | 2d9aaed146f02c9f46d082f6cf63a17f11d91210 (patch) | |
tree | 1a1f369093ca503009c7c9cd16a6b29f66b2972f /org.eclipse.debug.ui/ui/org/eclipse/debug | |
parent | 04c0b35dc76a6894ba060e486aae3e05d9fa867b (diff) | |
download | eclipse.platform.debug-2d9aaed146f02c9f46d082f6cf63a17f11d91210.tar.gz eclipse.platform.debug-2d9aaed146f02c9f46d082f6cf63a17f11d91210.tar.xz eclipse.platform.debug-2d9aaed146f02c9f46d082f6cf63a17f11d91210.zip |
Bug 535686 - use one queue for scheduling async tasksI20180618-0800I20180615-0655I20180615-0300I20180614-2045I20180614-2000
Queue async tasks coming from ChildrenUpdate's jobs via
scheduleViewerUpdate() in the same queue with async tasks coming from
modelChanged(), so that they all run in more predictable order. This
allows us to run async UI updates triggered by ElementContentProvider
jobs before we run next batch of model change events.
Additionally this should further reduce the number of
Display.asyncExec() tasks coming from debugger.
Change-Id: I4a16e9cc79ab453b35d064c85440b726a4772442
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug')
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java index e6b5e82d9..f37bfefbe 100644 --- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java +++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java @@ -399,7 +399,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon private class DelayedDoModelChangedJob extends WorkbenchJob { // queue of submitted deltas to process - private final List<DelayedDoModelChange> fQueue = new ArrayList<>(); + private final List<Object> fQueue = new ArrayList<>(); private boolean shutdown; public DelayedDoModelChangedJob() { @@ -410,7 +410,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon @Override public IStatus runInUIThread(IProgressMonitor monitor) { - List<DelayedDoModelChange> currentBatch = new ArrayList<>(); + List<Object> currentBatch = new ArrayList<>(); synchronized (fQueue) { if (shutdown || fQueue.isEmpty()) { return Status.OK_STATUS; @@ -421,21 +421,26 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER) { DebugUIPlugin.trace("Delayed batch size: " + currentBatch.size()); //$NON-NLS-1$ } - for (Iterator<DelayedDoModelChange> iterator = currentBatch.iterator(); iterator.hasNext();) { - DelayedDoModelChange change = iterator.next(); + for (Iterator<?> iterator = currentBatch.iterator(); iterator.hasNext();) { + Object task = iterator.next(); if (monitor.isCanceled()) { restoreQueue(currentBatch); return Status.CANCEL_STATUS; } - if (!change.proxy.isDisposed()) { - doModelChanged(change.delta, change.proxy); + if (task instanceof DelayedDoModelChange) { + DelayedDoModelChange change = (DelayedDoModelChange) task; + if (!change.proxy.isDisposed()) { + doModelChanged(change.delta, change.proxy); + } + } else { + ((Runnable) task).run(); } iterator.remove(); } return Status.OK_STATUS; } - private void restoreQueue(List<DelayedDoModelChange> currentBatch) { + private void restoreQueue(List<Object> currentBatch) { synchronized (fQueue) { currentBatch.addAll(fQueue); fQueue.clear(); @@ -444,11 +449,19 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon } public void runDelayed(final IModelDelta delta, final IModelProxy proxy) { + runDelayed(new DelayedDoModelChange(delta, proxy)); + } + + public void runDelayed(final Runnable uiTask) { + runDelayed((Object) uiTask); + } + + private void runDelayed(final Object task) { synchronized (fQueue) { if (shutdown) { return; } - fQueue.add(new DelayedDoModelChange(delta, proxy)); + fQueue.add(task); if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER) { DebugUIPlugin.trace("Delayed queue size: " + fQueue.size()); //$NON-NLS-1$ } @@ -1779,7 +1792,7 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon if (Thread.currentThread() == display.getThread()) { performUpdates(); } else { - display.asyncExec(updateJob); + fDelayedDoModelChangeJob.runDelayed(updateJob); } } } |