mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-06 03:50:02 +02:00
Task Launcher - changed launcher to always start the background thread
before creating the dialog
This commit is contained in:
parent
454ce9c817
commit
27f21edba7
19 changed files with 470 additions and 165 deletions
|
@ -40,15 +40,20 @@ import ghidra.util.task.TaskMonitor;
|
|||
* On ConcurrentQs that only allow one task to run at a time, when a task is cancelled,
|
||||
* the next task can begin. Most likely, the thread that was running the cancelled
|
||||
* task won't be free, and a new thread will be used to start running the next task.
|
||||
*
|
||||
* @param <I> the input type
|
||||
* @param <R> the output type
|
||||
*/
|
||||
class FutureTaskMonitor<I, R> extends FutureTask<R> implements TaskMonitor {
|
||||
|
||||
private final ConcurrentQ<I, R> queue;
|
||||
private final I item;
|
||||
private final long id;
|
||||
private volatile String lastMessage;
|
||||
private volatile long currentProgress;
|
||||
private volatile long maxProgress;
|
||||
private volatile CancelledListener cancelledListener;
|
||||
private volatile boolean isIndeterminate;
|
||||
|
||||
FutureTaskMonitor(ConcurrentQ<I, R> queue, Callable<R> callable, I item, long id) {
|
||||
super(callable);
|
||||
|
@ -103,6 +108,11 @@ class FutureTaskMonitor<I, R> extends FutureTask<R> implements TaskMonitor {
|
|||
queue.progressMessageChanged(id, item, message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage() {
|
||||
return lastMessage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize(long max) {
|
||||
currentProgress = 0;
|
||||
|
@ -123,9 +133,15 @@ class FutureTaskMonitor<I, R> extends FutureTask<R> implements TaskMonitor {
|
|||
|
||||
@Override
|
||||
public void setIndeterminate(boolean indeterminate) {
|
||||
this.isIndeterminate = indeterminate;
|
||||
queue.progressModeChanged(id, item, indeterminate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIndeterminate() {
|
||||
return isIndeterminate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getProgress() {
|
||||
return currentProgress;
|
||||
|
|
|
@ -67,6 +67,11 @@ public class TaskMonitorAdapter implements TaskMonitor {
|
|||
// do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProgress(long value) {
|
||||
// do nothing
|
||||
|
@ -105,6 +110,11 @@ public class TaskMonitorAdapter implements TaskMonitor {
|
|||
// do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIndeterminate() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void setCancelEnabled(boolean enable) {
|
||||
cancelEnabled = enable;
|
||||
|
@ -134,6 +144,8 @@ public class TaskMonitorAdapter implements TaskMonitor {
|
|||
}
|
||||
cancelled = false;
|
||||
}
|
||||
|
||||
// TODO this seems like a mistake, to notify of 'cancelled' when clearning
|
||||
notifyChangeListeners();
|
||||
}
|
||||
|
||||
|
|
|
@ -136,6 +136,11 @@ public class TaskMonitorSplitter {
|
|||
parent.setIndeterminate(indeterminate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIndeterminate() {
|
||||
return parent.isIndeterminate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize(long newMax) {
|
||||
setMaximum(newMax);
|
||||
|
@ -152,7 +157,11 @@ public class TaskMonitorSplitter {
|
|||
@Override
|
||||
public void setMessage(String message) {
|
||||
parent.setMessage(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage() {
|
||||
return parent.getMessage();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -139,6 +139,11 @@ public class TimeoutTaskMonitor implements TaskMonitor {
|
|||
delegate.setMessage(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage() {
|
||||
return delegate.getMessage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProgress(long value) {
|
||||
delegate.setProgress(value);
|
||||
|
@ -164,6 +169,11 @@ public class TimeoutTaskMonitor implements TaskMonitor {
|
|||
delegate.setIndeterminate(indeterminate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIndeterminate() {
|
||||
return delegate.isIndeterminate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkCanceled() throws CancelledException {
|
||||
if (didTimeout()) {
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
*/
|
||||
package ghidra.util.task;
|
||||
|
||||
import ghidra.util.datastruct.WeakDataStructureFactory;
|
||||
import ghidra.util.datastruct.WeakSet;
|
||||
import ghidra.util.exception.CancelledException;
|
||||
|
||||
/**
|
||||
|
@ -24,7 +26,9 @@ import ghidra.util.exception.CancelledException;
|
|||
*/
|
||||
public class WrappingTaskMonitor implements TaskMonitor {
|
||||
|
||||
protected final TaskMonitor delegate;
|
||||
private WeakSet<CancelledListener> listeners =
|
||||
WeakDataStructureFactory.createCopyOnReadWeakSet();
|
||||
protected TaskMonitor delegate;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
|
@ -35,6 +39,25 @@ public class WrappingTaskMonitor implements TaskMonitor {
|
|||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the delegate of this wrapper to be the new value. The new delegate will be
|
||||
* initialized with the current values of the existing delegate.
|
||||
*
|
||||
* @param newDelegate the new delegate
|
||||
*/
|
||||
public void setDelegate(TaskMonitor newDelegate) {
|
||||
newDelegate.setMaximum(delegate.getMaximum());
|
||||
newDelegate.setProgress(delegate.getProgress());
|
||||
newDelegate.setMessage(delegate.getMessage());
|
||||
newDelegate.setIndeterminate(delegate.isIndeterminate());
|
||||
for (CancelledListener l : listeners) {
|
||||
newDelegate.addCancelledListener(l);
|
||||
delegate.removeCancelledListener(l);
|
||||
}
|
||||
|
||||
this.delegate = newDelegate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return delegate.isCancelled();
|
||||
|
@ -50,6 +73,11 @@ public class WrappingTaskMonitor implements TaskMonitor {
|
|||
delegate.setMessage(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMessage() {
|
||||
return delegate.getMessage();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setProgress(long value) {
|
||||
delegate.setProgress(value);
|
||||
|
@ -75,6 +103,11 @@ public class WrappingTaskMonitor implements TaskMonitor {
|
|||
delegate.setIndeterminate(indeterminate);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isIndeterminate() {
|
||||
return delegate.isIndeterminate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkCanceled() throws CancelledException {
|
||||
delegate.checkCanceled();
|
||||
|
@ -97,11 +130,13 @@ public class WrappingTaskMonitor implements TaskMonitor {
|
|||
|
||||
@Override
|
||||
public void addCancelledListener(CancelledListener listener) {
|
||||
listeners.add(listener);
|
||||
delegate.addCancelledListener(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeCancelledListener(CancelledListener listener) {
|
||||
listeners.remove(listener);
|
||||
delegate.removeCancelledListener(listener);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue