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;
     }
 
     /**