You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2017/02/18 03:57:16 UTC

polygene-java git commit: POLYGENE-224 - I think this is fixed. Please note the long comment about what could happen within the same thread, i.e. activation -> anotherService -> calls this unactivated service.

Repository: polygene-java
Updated Branches:
  refs/heads/develop 8e8ac22cb -> 0816506ac


POLYGENE-224 - I think this is fixed. Please note the long comment about what could happen within the same thread, i.e. activation -> anotherService -> calls this unactivated service.


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/0816506a
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/0816506a
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/0816506a

Branch: refs/heads/develop
Commit: 0816506ac990bc2091f4677e202dafcefbf4f501
Parents: 8e8ac22
Author: niclas <ni...@spicter.com>
Authored: Sat Feb 18 11:57:10 2017 +0800
Committer: niclas <ni...@spicter.com>
Committed: Sat Feb 18 11:57:10 2017 +0800

----------------------------------------------------------------------
 .../runtime/service/ServiceReferenceInstance.java  | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/0816506a/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceReferenceInstance.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceReferenceInstance.java b/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceReferenceInstance.java
index 8cf7a1c..dafc742 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceReferenceInstance.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/service/ServiceReferenceInstance.java
@@ -58,6 +58,7 @@ public final class ServiceReferenceInstance<T>
     private final ServiceModel serviceModel;
     private final ActivationDelegate activation = new ActivationDelegate( this );
     private boolean active = false;
+    private ServiceInstance instanceBeingActivated;
 
     ServiceReferenceInstance( ServiceModel serviceModel, ModuleDescriptor module )
     {
@@ -149,19 +150,29 @@ public final class ServiceReferenceInstance<T>
             {
                 if( instance == null )
                 {
-                    ServiceInstance newInstance = serviceModel.newInstance( module );
+                    if( instanceBeingActivated != null )
+                    {
+                        // needed because activation may request its own service.
+                        // There is possible complication with this, as activation may use another service, which in turn
+                        // uses the service under activation before it is being ready. This is a problem left to the
+                        // developer to be aware of and avoid. It is similar to what can happen when pass 'this' inside
+                        // constructors to objects, which may then use an uninitilized object.
+                        return instanceBeingActivated;
+                    }
+                    instanceBeingActivated = serviceModel.newInstance( module );
 
                     try
                     {
                         activation.activate( serviceModel.newActivatorsInstance( module ),
-                                             newInstance,
+                                             instanceBeingActivated,
                                              () -> active = true );
                     }
                     catch( Exception e )
                     {
                         throw new ServiceUnavailableException( "Could not activate service " + serviceModel.identity(), e );
                     }
-                    instance = newInstance;
+                    instance = instanceBeingActivated;
+                    instanceBeingActivated = null;
                 }
             }
         }