You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by ba...@apache.org on 2008/08/25 20:56:23 UTC

svn commit: r688823 - in /webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl: DescriptionFactoryImpl.java ServiceDescriptionImpl.java

Author: barrettj
Date: Mon Aug 25 11:56:22 2008
New Revision: 688823

URL: http://svn.apache.org/viewvc?rev=688823&view=rev
Log:
Synchronize lookup and removal of ServiceDescription in cache.

Modified:
    webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImpl.java
    webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java

Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImpl.java?rev=688823&r1=688822&r2=688823&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImpl.java (original)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/DescriptionFactoryImpl.java Mon Aug 25 11:56:22 2008
@@ -482,28 +482,44 @@
     }
 
     /**
-     * Remove the ServiceDescription instance from the client-side cache.
+     * Remove the ServiceDescription instance from the client-side cache if there are no
+     * service delegates using it.  Note this must be done in a sync block so that a lookup 
+     * in createServiceDescription doesn't access the cache.
      * 
      * @param svcDesc The instance to be removed.
      */
-    static void removeFromCache(ServiceDescription svcDesc) {
+    static boolean removeFromCache(ServiceDescriptionImpl svcDesc) {
+        boolean svcDescRemoved = false;
         ConfigurationContext configContext = svcDesc.getAxisConfigContext();
         synchronized(configContext) {
-            Set<Map.Entry<DescriptionKey, ServiceDescription>> cacheEntrySet = 
-                cache.entrySet();
-            Iterator<Map.Entry<DescriptionKey, ServiceDescription>> cacheEntryIterator =
-                cacheEntrySet.iterator();
-            while (cacheEntryIterator.hasNext()) {
-                Map.Entry<DescriptionKey, ServiceDescription> entry = 
-                    cacheEntryIterator.next();
-                ServiceDescription entrySvcDescValue = entry.getValue();
-                if (svcDesc == entrySvcDescValue) {
-                    cacheEntryIterator.remove();
-                    if (log.isDebugEnabled()) {
-                        log.debug("Removed service description from cache");
+            svcDesc.deregisterUse();
+            if (svcDesc.isInUse()) {
+                if (log.isDebugEnabled()) {
+                    log.debug("ServiceDescription still in use; not removed from cache");
+                }
+                svcDescRemoved = false;
+            } else {
+                if (log.isDebugEnabled()) {
+                    log.debug("ServiceDescription not in use; will be removed from cache");
+                }
+                svcDescRemoved = true;
+                Set<Map.Entry<DescriptionKey, ServiceDescription>> cacheEntrySet = 
+                    cache.entrySet();
+                Iterator<Map.Entry<DescriptionKey, ServiceDescription>> cacheEntryIterator =
+                    cacheEntrySet.iterator();
+                while (cacheEntryIterator.hasNext()) {
+                    Map.Entry<DescriptionKey, ServiceDescription> entry = 
+                        cacheEntryIterator.next();
+                    ServiceDescription entrySvcDescValue = entry.getValue();
+                    if (svcDesc == entrySvcDescValue) {
+                        cacheEntryIterator.remove();
+                        if (log.isDebugEnabled()) {
+                            log.debug("Removed service description from cache");
+                        }
                     }
                 }
             }
         }
+        return svcDescRemoved;
     }
 }

Modified: webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java?rev=688823&r1=688822&r2=688823&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java (original)
+++ webservices/axis2/trunk/java/modules/metadata/src/org/apache/axis2/jaxws/description/impl/ServiceDescriptionImpl.java Mon Aug 25 11:56:22 2008
@@ -2465,7 +2465,7 @@
      * only used on the client side.
      * @return
      */
-    private boolean isInUse() {
+    boolean isInUse() {
         return useCount > 0;
     }
     
@@ -2498,24 +2498,22 @@
     public void releaseResources(Object delegate) {
         try {
         if (log.isDebugEnabled()) {
-            log.debug("Entry ServiceDescription release resources with delegate " + delegate);
+            log.debug("ServiceDescription release resources called with delegate " + delegate);
         }
-        if (delegate != null) {
-            deregisterUse();
-        } else {
-            // If no ServiceDelegate specified, then return
-            return;
-        }
-        if (isInUse()) {
+        // If the service desc can be removed from the cache, which means no other service delegates
+        // are using it, then we will release the resources associated with it.  If it can't be 
+        // removed because it is still in use, then just return.
+        if (!DescriptionFactoryImpl.removeFromCache(this)) {
             if (log.isDebugEnabled()) {
-                log.debug("ServiceDescription still in use; not released");
+                log.debug("ServiceDesc was not removed from cache, so it will not be released");
             }
             return;
         }
         
-        // Remove the Service Description from the cache before we release the associated 
-        // resouces.
-        DescriptionFactoryImpl.removeFromCache(this);
+        if (log.isDebugEnabled()) {
+            log.debug("ServiceDesc was removed from cache, so releasing associated resources");
+        }
+                
         
         // Close all the endpoint descs, both declared and dynamic
         Collection<EndpointDescription> definedEndpoints = definedEndpointDescriptions.values();