package net.refractions.linecleaner.ui; import org.eclipse.core.runtime.IProgressMonitor; /** * This class can be used to occasionally check memory usage, and do something * if available memory is too low. * * It wraps itself around another IProgressMonitor, and whenever worked() is * called, it compares Runtime.freeMemory() to the value minimum passed into * the constructor. If freeMemory is less than minimum, runnable.run() is * called, which ideally should free up some memory. * * @author rgould * */ public class MemoryProgressMonitor implements IProgressMonitor { IProgressMonitor delegate; private long minimum; private Runnable runnable; /** * * @param delegate * @param minimum if freeMemory drops below this, runnable.run() is called. measured in bytes. * @param runnable */ public MemoryProgressMonitor(IProgressMonitor delegate, long minimum, Runnable runnable) { this.delegate = delegate; this.minimum = minimum; this.runnable = runnable; } public void beginTask(String name, int totalWork) { delegate.beginTask(name, totalWork); } public void done() { delegate.done(); } public void internalWorked(double work) { long freeMemory = Runtime.getRuntime().freeMemory(); if (freeMemory <= minimum) { runnable.run(); } delegate.internalWorked(work); } public boolean isCanceled() { return delegate.isCanceled(); } public void setCanceled(boolean value) { delegate.setCanceled(value); } public void setTaskName(String name) { delegate.setTaskName(name); } public void subTask(String name) { delegate.subTask(name); } public void worked(int work) { this.internalWorked(work); } }