Skip to content
Snippets Groups Projects
Commit 1187deae authored by Tuukka Lehtonen's avatar Tuukka Lehtonen
Browse files

Merge branch '878-fix-disposingpolicy' into release/1.53.0

Fix disposer queue length based disposal to work properly

gitlab #878
parents 2c2477bd 7c1ae7cd
Branches release/1.53.0
No related tags found
No related merge requests found
package org.simantics.modeling.ui.diagramEditor;
import java.util.ArrayDeque;
import java.util.Iterator;
import org.eclipse.swt.widgets.Display;
import org.slf4j.Logger;
......@@ -25,12 +26,21 @@ public class DisposingPolicy {
private Runnable currentlyScheduled = null;
private Runnable disposeOne = () -> {
if(!disposerQueue.isEmpty()) {
// If disposeOverTime is not enabled, then base the actual disposal only on the length of the queue.
int queueLength = disposerQueue.size();
boolean debug = LOGGER.isDebugEnabled();
if(debug)
LOGGER.debug("disposeOne: queueLength: {}, maxQueueLength: {}", queueLength, maxQueueLength); //$NON-NLS-1$
if (!disposeOverTime && queueLength <= maxQueueLength)
return;
if(queueLength > 0) {
Runnable runnable = disposerQueue.removeFirst();
disposeTime.remove(runnable);
currentlyScheduled = null;
if(debug)
LOGGER.debug("Executing disposer {}", runnable); //$NON-NLS-1$
runnable.run();
if(LOGGER.isDebugEnabled())
if(debug)
LOGGER.debug("Executed disposer {}", runnable); //$NON-NLS-1$
if(!disposerQueue.isEmpty())
scheduleDispose();
......@@ -71,14 +81,19 @@ public class DisposingPolicy {
}
private void scheduleDispose() {
if (!disposeOverTime)
boolean debug = LOGGER.isDebugEnabled();
if(debug)
LOGGER.debug("scheduleDispose({}, {}, {})", disposeOverTime, disposerQueue.size(), maxQueueLength); //$NON-NLS-1$
if (!disposeOverTime && disposerQueue.size() <= maxQueueLength)
return;
currentlyScheduled = disposerQueue.peekFirst();
if (currentlyScheduled == null)
return;
long delay = Math.max(
disposeTime.get(currentlyScheduled) - System.currentTimeMillis(),
MIN_DELAY);
Display.getCurrent().timerExec((int)delay, disposeOne);
if(LOGGER.isDebugEnabled())
if(debug)
LOGGER.debug("Scheduled disposer {} in {} ms", currentlyScheduled, delay); //$NON-NLS-1$
}
......@@ -93,11 +108,21 @@ public class DisposingPolicy {
LOGGER.debug("Added disposer {}", disposer); //$NON-NLS-1$
if(disposeTime.contains(disposer))
return;
while(disposerQueue.size() >= maxQueueLength)
disposeOne.run();
long t = System.currentTimeMillis();
disposerQueue.addLast(disposer);
disposeTime.put(disposer, System.currentTimeMillis()+disposeWaitTimeMs);
if(disposerQueue.size() == 1)
disposeTime.put(disposer, t + disposeWaitTimeMs);
// Keep the number of alive hidden diagrams under the requested amount by
// marking the deadline for first disposeCount disposers to be right now.
int disposeCount = disposerQueue.size() - maxQueueLength;
if (disposeCount > 0) {
Iterator<Runnable> it = disposerQueue.iterator();
for (int i = 0; i < disposeCount && it.hasNext(); ++i) {
disposeTime.put(it.next(), t);
}
}
scheduleDispose();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment