incubator-sling-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From i..@apache.org
Subject svn commit: r1404087 - /sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPoolManager.java
Date Wed, 31 Oct 2012 10:49:32 GMT
Author: ieb
Date: Wed Oct 31 10:49:32 2012
New Revision: 1404087

URL: http://svn.apache.org/viewvc?rev=1404087&view=rev
Log:
SLING-2535 wrapped the reference counter in a dedicated synchronised block to ensure that
all access to the counter is safe. I think this will be safer than calling from within synchronised
blocks as it doesnt rely on the caller remembering the methods need to be single threaded.

Modified:
    sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPoolManager.java

Modified: sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPoolManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPoolManager.java?rev=1404087&r1=1404086&r2=1404087&view=diff
==============================================================================
--- sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPoolManager.java
(original)
+++ sling/trunk/bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPoolManager.java
Wed Oct 31 10:49:32 2012
@@ -318,6 +318,12 @@ public class DefaultThreadPoolManager
 
         private BundleContext bundleContext;
 
+        /**
+         * This lock protects the counter which is volatile so must be
+         * protected.
+         */
+        private Object usagelock = new Object();
+
         public Entry(final String pid, final ThreadPoolConfig config, final String name,
final BundleContext bundleContext) {
             this.pid = pid;
             this.config = config;
@@ -337,17 +343,21 @@ public class DefaultThreadPoolManager
         }
 
         public ThreadPoolFacade incUsage() {
-            if ( pool == null ) {
-                pool = new ThreadPoolFacade(new DefaultThreadPool(name, this.config));
+            synchronized (usagelock) {
+                if ( pool == null ) {
+                    pool = new ThreadPoolFacade(new DefaultThreadPool(name, this.config));
+                }
+                this.count++;
+                return pool;
             }
-            this.count++;
-            return pool;
         }
 
         public void decUsage() {
-            this.count--;
-            if ( this.count == 0 ) {
-                this.shutdown();
+            synchronized (usagelock) {
+                this.count--;
+                if ( this.count == 0 ) {
+                    this.shutdown();
+                }
             }
         }
 



Mime
View raw message