summaryrefslogtreecommitdiffstats
path: root/api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java
diff options
context:
space:
mode:
Diffstat (limited to 'api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java')
-rw-r--r--api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java18
1 files changed, 16 insertions, 2 deletions
diff --git a/api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java b/api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java
index 271a8bd..b850c2c 100644
--- a/api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java
+++ b/api/src/main/java/org/openslx/taskmanager/api/AbstractTask.java
@@ -67,6 +67,11 @@ public abstract class AbstractTask implements Runnable
* work when we're done.
*/
private volatile FinishCallback finishCallback = null;
+
+ /**
+ * Set to true as soon as we try to start this task using the thread pool executor.
+ */
+ private volatile boolean triedToStart = false;
/**
* Default constructor which should not be overridden
@@ -252,13 +257,22 @@ public abstract class AbstractTask implements Runnable
*/
public final boolean canStart()
{
- if ( !this.initDone || this.id == null || this.getStatus().getStatusCode() != StatusCode.TASK_WAITING ) {
+ if ( this.triedToStart || !this.initDone || this.id == null || this.getStatus().getStatusCode() != StatusCode.TASK_WAITING ) {
return false;
}
if ( this.parent == null )
return true;
return parent.getStatusCode() != StatusCode.TASK_WAITING && parent.getStatusCode() != StatusCode.TASK_PROCESSING;
}
+
+ /**
+ * Mark this task as being started to prevent a race condition where
+ * the task would be submitted to the thread pool more than once.
+ */
+ public final void markAsStarting()
+ {
+ this.triedToStart = true;
+ }
/**
* Checks whether this task can be removed from the task manager.
@@ -291,7 +305,7 @@ public abstract class AbstractTask implements Runnable
try {
ret = execute();
} catch ( Throwable t ) {
- LOG.warn( "Task " + this.getClass().getSimpleName() + " failed with uncaught exception: " + t.toString() );
+ LOG.warn( "Task " + this.getClass().getSimpleName() + " failed with uncaught exception", t );
ret = false;
}
if ( ret ) {