You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2009/03/04 18:33:29 UTC

svn commit: r750087 - in /tapestry/tapestry5/trunk/tapestry-ioc/src: main/java/org/apache/tapestry5/ioc/internal/services/ test/java/org/apache/tapestry5/ioc/ test/java/org/apache/tapestry5/ioc/internal/services/

Author: hlship
Date: Wed Mar  4 17:33:25 2009
New Revision: 750087

URL: http://svn.apache.org/viewvc?rev=750087&view=rev
Log:
TAP5-84: Change proxy generation to use volatile fields rather than synchronized blocks

Modified:
    tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/JustInTimeObjectCreator.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java
    tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/JustInTimeObjectCreatorTest.java

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/JustInTimeObjectCreator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/JustInTimeObjectCreator.java?rev=750087&r1=750086&r2=750087&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/JustInTimeObjectCreator.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/internal/services/JustInTimeObjectCreator.java Wed Mar  4 17:33:25 2009
@@ -1,4 +1,4 @@
-// Copyright 2007 The Apache Software Foundation
+// Copyright 2007, 2009 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -31,11 +31,9 @@
 {
     private final ServiceActivityTracker tracker;
 
-    private ObjectCreator creator;
+    private volatile ObjectCreator creator;
 
-    private boolean shutdown;
-
-    private Object object;
+    private volatile Object object;
 
     private final String serviceId;
 
@@ -53,30 +51,32 @@
      *
      * @throws IllegalStateException if the registry has been shutdown
      */
-    public synchronized Object createObject()
+    public Object createObject()
     {
-        if (shutdown)
-            throw new IllegalStateException(ServiceMessages.registryShutdown(serviceId));
-
         if (object == null)
+            obtainObjectFromCreator();
+
+        return object;
+    }
+
+    private synchronized void obtainObjectFromCreator()
+    {
+        if (object != null) return;
+
+        try
         {
-            try
-            {
-                object = creator.createObject();
+            object = creator.createObject();
 
-                // And if that's successful ...
+            // And if that's successful ...
 
-                tracker.setStatus(serviceId, Status.REAL);
+            tracker.setStatus(serviceId, Status.REAL);
 
-                creator = null;
-            }
-            catch (RuntimeException ex)
-            {
-                throw new RuntimeException(ServiceMessages.serviceBuildFailure(serviceId, ex), ex);
-            }
+            creator = null;
+        }
+        catch (RuntimeException ex)
+        {
+            throw new RuntimeException(ServiceMessages.serviceBuildFailure(serviceId, ex), ex);
         }
-
-        return object;
     }
 
     /**
@@ -92,11 +92,17 @@
     /**
      * Sets the shutdown flag and releases the object and the creator.
      */
-    public synchronized void registryDidShutdown()
+    public void registryDidShutdown()
     {
-        shutdown = true;
+        creator = new ObjectCreator()
+        {
+            public Object createObject()
+            {
+                throw new IllegalStateException(ServiceMessages.registryShutdown(serviceId));
+            }
+        };
+
         object = null;
-        creator = null;
     }
 
 }

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java?rev=750087&r1=750086&r2=750087&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/IntegrationTest.java Wed Mar  4 17:33:25 2009
@@ -124,10 +124,10 @@
             service.run();
             unreachable();
         }
-        catch (IllegalStateException ex)
+        catch (RuntimeException ex)
         {
-            assertEquals(ex.getMessage(),
-                         "Proxy for service Fred is no longer active because the IOC Registry has been shut down.");
+            assertMessageContains(ex,
+                                  "Proxy for service Fred is no longer active because the IOC Registry has been shut down.");
         }
 
         // Show that toString() still works, even for a shutdown proxy.

Modified: tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/JustInTimeObjectCreatorTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/JustInTimeObjectCreatorTest.java?rev=750087&r1=750086&r2=750087&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/JustInTimeObjectCreatorTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/JustInTimeObjectCreatorTest.java Wed Mar  4 17:33:25 2009
@@ -1,4 +1,4 @@
-// Copyright 2007 The Apache Software Foundation
+// Copyright 2007, 2009 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -40,11 +40,10 @@
             j.createObject();
             unreachable();
         }
-        catch (IllegalStateException ex)
+        catch (RuntimeException ex)
         {
-            assertEquals(
-                    ex.getMessage(),
-                    "Proxy for service FooBar is no longer active because the IOC Registry has been shut down.");
+            assertMessageContains(ex,
+                                  "Proxy for service FooBar is no longer active because the IOC Registry has been shut down.");
         }
     }