FELIX-5086 : Coordinator.begin can return null
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1712478 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationHolder.java b/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationHolder.java
index 21b33be..65d55ba 100644
--- a/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationHolder.java
+++ b/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationHolder.java
@@ -35,10 +35,11 @@
*/
public class CoordinationHolder implements Coordination {
- private final CoordinationImpl coordination;
+ private CoordinationImpl coordination;
- public CoordinationHolder(final CoordinationImpl coordination) {
- this.coordination = coordination;
+ public void setCoordination(final CoordinationImpl coordination)
+ {
+ this.coordination = coordination;
}
/**
diff --git a/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationImpl.java b/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationImpl.java
index 152b422..5999460 100644
--- a/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationImpl.java
+++ b/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationImpl.java
@@ -80,7 +80,19 @@
private final Object waitLock = new Object();
- public CoordinationImpl(final CoordinatorImpl owner, final long id, final String name, final long timeOutInMs)
+ public static CoordinationMgr.CreationResult create(final CoordinatorImpl owner, final long id, final String name, final long timeOutInMs)
+ {
+ final CoordinationMgr.CreationResult result = new CoordinationMgr.CreationResult();
+ result.holder = new CoordinationHolder();
+ result.coordination = new CoordinationImpl(owner, id, name, timeOutInMs, result.holder);
+ return result;
+ }
+
+ private CoordinationImpl(final CoordinatorImpl owner,
+ final long id,
+ final String name,
+ final long timeOutInMs,
+ final CoordinationHolder holder)
{
this.owner = owner;
this.id = id;
@@ -89,8 +101,8 @@
this.participants = new ArrayList<Participant>();
this.variables = new HashMap<Class<?>, Object>();
this.deadLine = (timeOutInMs > 0) ? System.currentTimeMillis() + timeOutInMs : 0;
-
- this.holderRef = new WeakReference<CoordinationHolder>(new CoordinationHolder(this));
+ holder.setCoordination(this);
+ this.holderRef = new WeakReference<CoordinationHolder>(holder);
scheduleTimeout(deadLine);
}
diff --git a/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationMgr.java b/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationMgr.java
index 6c85c26..ffd7eaa 100644
--- a/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationMgr.java
+++ b/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinationMgr.java
@@ -42,6 +42,11 @@
*/
public class CoordinationMgr
{
+ public static final class CreationResult
+ {
+ public CoordinationImpl coordination;
+ public CoordinationHolder holder;
+ }
private ThreadLocal<Stack<CoordinationImpl>> perThreadStack;
@@ -190,15 +195,15 @@
// ---------- Coordinator back end implementation
- CoordinationImpl create(final CoordinatorImpl owner, final String name, final long timeout)
+ CreationResult create(final CoordinatorImpl owner, final String name, final long timeout)
{
final long id = ctr.incrementAndGet();
- final CoordinationImpl c = new CoordinationImpl(owner, id, name, timeout);
+ final CreationResult result = CoordinationImpl.create(owner, id, name, timeout);
synchronized ( this.coordinations )
{
- coordinations.put(id, c);
+ coordinations.put(id, result.coordination);
}
- return c;
+ return result;
}
void unregister(final CoordinationImpl c, final boolean removeFromThread)
diff --git a/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinatorImpl.java b/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinatorImpl.java
index 5a6cf30..9ec9b0e 100644
--- a/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinatorImpl.java
+++ b/coordinator/src/main/java/org/apache/felix/coordinator/impl/CoordinatorImpl.java
@@ -151,9 +151,9 @@
}
// create coordination
- final CoordinationImpl c = mgr.create(this, name, timeout);
+ final CoordinationMgr.CreationResult result = mgr.create(this, name, timeout);
- return c.getHolder();
+ return result.holder;
}
/**
@@ -218,9 +218,9 @@
}
// create coordination
- final CoordinationImpl c = mgr.create(this, name, timeout);
- this.mgr.push(c);
- return c.getHolder();
+ final CoordinationMgr.CreationResult result = mgr.create(this, name, timeout);
+ this.mgr.push(result.coordination);
+ return result.holder;
}
/**