Fixes runlevel concurrency issue
Signed-off-by: Jorge Bescos Gascon <jorge.bescos.gascon@oracle.com>
diff --git a/hk2-runlevel/src/main/java/org/glassfish/hk2/runlevel/internal/CurrentTaskFuture.java b/hk2-runlevel/src/main/java/org/glassfish/hk2/runlevel/internal/CurrentTaskFuture.java
index f7118b8..8006435 100755
--- a/hk2-runlevel/src/main/java/org/glassfish/hk2/runlevel/internal/CurrentTaskFuture.java
+++ b/hk2-runlevel/src/main/java/org/glassfish/hk2/runlevel/internal/CurrentTaskFuture.java
@@ -1410,7 +1410,7 @@
@Override
public void run() {
for (;;) {
- ActiveDescriptor<?> job = null;
+ ActiveDescriptor<?> job;
queueLock.lock();
try {
if (caput) return;
@@ -1419,15 +1419,14 @@
queueCondition.signal();
return;
}
- job = queue.remove(0);
+ job = queue.get(0);
} finally {
queueLock.unlock();
}
try {
locator.getServiceHandle(job).destroy();
- }
- catch (Throwable th) {
+ } catch (Throwable th) {
queueLock.lock();
try {
parent.lastError = th;
@@ -1436,6 +1435,13 @@
} finally {
queueLock.unlock();
}
+ } finally {
+ queueLock.lock();
+ try {
+ queue.remove(job);
+ } finally {
+ queueLock.unlock();
+ }
}
}