diff options
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.java | 18 |
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 ) { |