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();
+ }
}
}