diff options
-rw-r--r-- | org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java | 17 |
1 files changed, 15 insertions, 2 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 4ed94c55a..c00ae9ffe 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 @@ -401,6 +401,9 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon private class DelayedDoModelChangedJob extends WorkbenchJob { + // limit batch size to avoid freezing the UI. + private static final int MAX_BATCH_SIZE = 100; + // queue of submitted deltas to process private final List<Object> fQueue = new ArrayList<>(); private boolean shutdown; @@ -418,8 +421,18 @@ public class TreeModelContentProvider implements ITreeModelContentProvider, ICon if (shutdown || fQueue.isEmpty()) { return Status.OK_STATUS; } - currentBatch = new ArrayList<>(fQueue); - fQueue.clear(); + fQueue.removeIf(o -> { + if (currentBatch.size() < MAX_BATCH_SIZE) { + currentBatch.add(o); + return true; + } + return false; + }); + if (!fQueue.isEmpty()) { + // There is work left. + // Give other UI tasks chance to work instead of freezing UI + schedule(); + } } if (DebugUIPlugin.DEBUG_CONTENT_PROVIDER) { DebugUIPlugin.trace("Delayed batch size: " + currentBatch.size()); //$NON-NLS-1$ |