Class GTaskManager
- java.lang.Object
-
- ghidra.framework.task.GTaskManager
-
public class GTaskManager extends java.lang.Object
Class for managing a queue of tasks to be executed, one at a time, in priority order. All the tasks pertain to an UndoableDomainObject and transactions are created on the UndoableDomainObject so that tasks can operate on them.Tasks are organized into groups such that all tasks in a group will be completed before the tasks in the next group, regardless of priority. Within a group, task are ordered first by priority and then by the order in which they were added to the group. Groups are executed in the order that they are scheduled.
All tasks within the same group are executed within the same transaction on the UndoableDomainObject. When all the tasks within a group are completed, the transaction is closed unless there is another group scheduled and that group does not specify that it should run in its own transaction.
Suspending:
The GTaskManager can be suspended. When suspended, any currently running task will continue to run, but no new or currently scheduled tasks will be executed until the GTaskManager is resumed. There is a special method,runNextTaskEvenWhenSuspended()
, that will run the next scheduled task even if the GTaskManager is suspended.Yielding to Other Tasks:
While running, a GTask can call the methodwaitForHigherPriorityTasks()
on the GTaskManager, which will cause the the GTaskManager to run scheduled tasks (within the same group) that are a higher priority than the running task, effectively allowing the running task to yield until all higher priority tasks are executed.- See Also:
GTask
,GTaskGroup
-
-
Constructor Summary
Constructors Constructor Description GTaskManager(UndoableDomainObject undoableDomainObject, GThreadPool threadPool)
Creates a new GTaskManager for an UndoableDomainObject
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addTaskListener(GTaskListener listener)
Adds a GTaskListener to be notified as tasks are completed.void
cancelAll()
Cancels all scheduled groups and tasks.void
cancelRunningGroup(GTaskGroup group)
Cancels all tasks in the currently running group.GTaskGroup
getCurrentGroup()
Returns the currently running group, or null if no group is running.java.util.List<GScheduledTask>
getDelayedTasks()
Returns a list of Tasks that are currently waiting for higher priority tasks.GScheduledTask
getRunningTask()
Returns the currently running task, or null if no task is running.java.util.List<GTaskGroup>
getScheduledGroups()
Returns a list of Groups that are waiting to run.java.util.List<GScheduledTask>
getScheduledTasks()
Returns a list of scheduled tasks for the currently running group.java.util.List<GTaskResult>
getTaskResults()
Returns a list of the most recent GTaskResults.boolean
isBusy()
Returns true if this manager is running a task, or if suspended has additional tasks queued.boolean
isRunning()
Returns true if this manager is currently running a task.boolean
isSuspended()
Returns true if this GTaskManager is currently suspended.void
removeTaskListener(GTaskListener listener)
Removes the given GTaskListener from this queue.void
runNextTaskEvenWhenSuspended()
This method will cause the next scheduled task to run even though the task manager is suspended.GScheduledTask
scheduleTask(GTask task, int priority, boolean useCurrentGroup)
Schedules a task to be run by this TaskManager.void
scheduleTask(GTask task, int priority, java.lang.String groupName)
Schedules a task to be run by this TaskManager within the group with the given group name.void
scheduleTaskGroup(GTaskGroup group)
Schedules a task group to run.void
setSuspended(boolean b)
Sets the suspended state of this task queue.void
waitForHigherPriorityTasks()
This methods is for currently running tasks to suspend and allow higher priority tasks (within the same task group) to complete before continuing.boolean
waitUntilBusy(long timeoutMillis)
boolean
waitWhileBusy(long timeoutMillis)
-
-
-
Constructor Detail
-
GTaskManager
public GTaskManager(UndoableDomainObject undoableDomainObject, GThreadPool threadPool)
Creates a new GTaskManager for an UndoableDomainObject- Parameters:
undoableDomainObject
- the domainObject that tasks scheduled in this GTaskManager will operate upon.threadPool
- the GThreadPool that will provide the threads that will be used to run tasks in this GTaskManager.
-
-
Method Detail
-
scheduleTask
public GScheduledTask scheduleTask(GTask task, int priority, boolean useCurrentGroup)
Schedules a task to be run by this TaskManager. Tasks are run one at a time.- Parameters:
task
- the task to be run.priority
- the priority of the task. Lower numbers are run before higher numbers.useCurrentGroup
- . If true, this task will be rolled into the current transaction group if one exists. If false, any open transaction will be closed and a new transaction will be opened before this task is run.
-
scheduleTask
public void scheduleTask(GTask task, int priority, java.lang.String groupName)
Schedules a task to be run by this TaskManager within the group with the given group name. If a group already exists with the given name(either currently running or waiting), the task will be added to that group. Otherwise, a new group will be created with the given group name and the task will be placed in that group.- Parameters:
task
- the task to be run.priority
- the priority of the task. Lower numbers are run before higher numbers.groupName
- . The name of the group that the task will be added to.
-
scheduleTaskGroup
public void scheduleTaskGroup(GTaskGroup group)
Schedules a task group to run. Task groups are run in the order they are scheduled. They have the option of being executed in the current transaction (if it exists) or starting a new transaction.- Parameters:
group
- the TaskGroup to be scheduled.
-
setSuspended
public void setSuspended(boolean b)
Sets the suspended state of this task queue. While suspended, this task manager will not start any new tasks in its queue. Any currently running task will continue to run.- Parameters:
b
- true to suspend this manager, false to resume executing new tasks.
-
runNextTaskEvenWhenSuspended
public void runNextTaskEvenWhenSuspended()
This method will cause the next scheduled task to run even though the task manager is suspended. Calling this method while the queue is not suspended has no effect because if not suspended, it will be busy (or have nothing to do)
-
addTaskListener
public void addTaskListener(GTaskListener listener)
Adds a GTaskListener to be notified as tasks are completed.- Parameters:
listener
- the listener to add
-
removeTaskListener
public void removeTaskListener(GTaskListener listener)
Removes the given GTaskListener from this queue.- Parameters:
listener
- the listener to remove.
-
isBusy
public boolean isBusy()
Returns true if this manager is running a task, or if suspended has additional tasks queued.- Returns:
- true if this manager is running a task, or if suspended has additional tasks queued.
-
waitWhileBusy
public boolean waitWhileBusy(long timeoutMillis)
-
waitUntilBusy
public boolean waitUntilBusy(long timeoutMillis)
-
isRunning
public boolean isRunning()
Returns true if this manager is currently running a task. If not suspended, a GTaskManager will always be executing a task as long as there are tasks to execute. If suspended, a GTaskManager may have tasks scheduled, but may not be currently executing one.- Returns:
- true if this manager is currently running a task.
-
waitForHigherPriorityTasks
public void waitForHigherPriorityTasks()
This methods is for currently running tasks to suspend and allow higher priority tasks (within the same task group) to complete before continuing. If called by any thread other than the thread that is currently executing a task for this queue, an exception will be thrown.- Throws:
java.lang.IllegalStateException
- if this method is called from any thread not currently executing the current task for this queue.
-
getTaskResults
public java.util.List<GTaskResult> getTaskResults()
Returns a list of the most recent GTaskResults. The TaskManager only keeps the most recent N GTaskResults.- Returns:
- the list of the most recent GTaskResults.
-
getScheduledTasks
public java.util.List<GScheduledTask> getScheduledTasks()
Returns a list of scheduled tasks for the currently running group.- Returns:
- a list of scheduled tasks for the currently running group.
-
getDelayedTasks
public java.util.List<GScheduledTask> getDelayedTasks()
Returns a list of Tasks that are currently waiting for higher priority tasks.- Returns:
- a list of Tasks that are currently waiting for higher priority tasks.
-
getRunningTask
public GScheduledTask getRunningTask()
Returns the currently running task, or null if no task is running.- Returns:
- the currently running task;
-
getCurrentGroup
public GTaskGroup getCurrentGroup()
Returns the currently running group, or null if no group is running.- Returns:
- the currently running group, or null if no group is running.
-
getScheduledGroups
public java.util.List<GTaskGroup> getScheduledGroups()
Returns a list of Groups that are waiting to run.- Returns:
- a list of Groups that are waiting to run.
-
isSuspended
public boolean isSuspended()
Returns true if this GTaskManager is currently suspended.- Returns:
- true if this GTaskManager is currently suspended.
-
cancelRunningGroup
public void cancelRunningGroup(GTaskGroup group)
Cancels all tasks in the currently running group. Tasks in the group that have not yet started will never run and will immediately be put into the TaskResults list. The TaskMonitor for the currently running task will be cancelled, but the task will continue to run until it checks the monitor.- Parameters:
group
- the group to be cancelled. It must match the currently running group or nothing will happen.
-
cancelAll
public void cancelAll()
Cancels all scheduled groups and tasks. The TaskMonitor for the currently running task will be cancelled, but the task will continue to run until it checks the monitor.
-
-