You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2015/02/13 10:00:39 UTC
svn commit: r1659470 - in
/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl:
CommonResourceResolverFactoryImpl.java ResourceResolverImpl.java
Author: cziegeler
Date: Fri Feb 13 09:00:39 2015
New Revision: 1659470
URL: http://svn.apache.org/r1659470
Log:
SLING-4372 : The use of finalize in ResourceResolver leads to performance issues. Some code cleanup
Modified:
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java?rev=1659470&r1=1659469&r2=1659470&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/CommonResourceResolverFactoryImpl.java Fri Feb 13 09:00:39 2015
@@ -26,9 +26,8 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.Stack;
-import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.commons.collections.BidiMap;
@@ -68,14 +67,21 @@ public class CommonResourceResolverFacto
*/
private ThreadLocal<Stack<WeakReference<ResourceResolver>>> resolverStackHolder = new ThreadLocal<Stack<WeakReference<ResourceResolver>>>();
+ /** Flag indicating whether this factory is still active. */
private final AtomicBoolean isActive = new AtomicBoolean(true);
+ /** The reference queue to handle disposing of resource resolver instances. */
private final ReferenceQueue<ResourceResolver> resolverReferenceQueue = new ReferenceQueue<ResourceResolver>();
- private final Set<ResolverWeakReference> refs = new ConcurrentSkipListSet<CommonResourceResolverFactoryImpl.ResolverWeakReference>();
+ /** All weak references for the resource resolver instances. */
+ private final Map<Integer, ResolverWeakReference> refs = new ConcurrentHashMap<Integer, CommonResourceResolverFactoryImpl.ResolverWeakReference>();
+ /** Background thread handling disposing of resource resolver instances. */
private final Thread refQueueThread;
+ /**
+ * Create a new common resource resolver factory.
+ */
public CommonResourceResolverFactoryImpl(final ResourceResolverFactoryActivator activator) {
this.activator = activator;
this.refQueueThread = new Thread("Apache Sling Resource Resolver Finalizer Thread") {
@@ -86,12 +92,12 @@ public class CommonResourceResolverFacto
try {
final ResolverWeakReference ref = (ResolverWeakReference) resolverReferenceQueue.remove();
ref.close();
- refs.remove(ref);
+ refs.remove(ref.context.hashCode());
} catch ( final InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
- for(final ResolverWeakReference ref : refs) {
+ for(final ResolverWeakReference ref : refs.values()) {
ref.close();
}
refs.clear();
@@ -178,10 +184,31 @@ public class CommonResourceResolverFacto
// ---------- Implementation helpers --------------------------------------
/**
+ * Inform about a new resource resolver instance.
+ * We create a weak reference to be able to close the resolver if close on the
+ * resource resolver is never called.
+ * @param resolver The resource resolver
+ * @param ctx The resource resolver context
+ */
+ public void register(final ResourceResolver resolver,
+ final ResourceResolverContext ctx) {
+ // create new weak reference
+ refs.put(ctx.hashCode(), new ResolverWeakReference(resolver, this.resolverReferenceQueue, ctx));
+ }
+
+ /**
* Inform about a closed resource resolver.
* Make sure to remove it from the current thread context.
+ * @param resolver The resource resolver
+ * @param ctx The resource resolver context
*/
- public void unregister(final ResourceResolverImpl resourceResolverImpl) {
+ public void unregister(final ResourceResolver resourceResolverImpl,
+ final ResourceResolverContext ctx) {
+ // close the context
+ ctx.close();
+ // remove it from the set of weak references.
+ refs.remove(ctx.hashCode());
+
// on shutdown, the factory might already be closed before the resolvers close
// therefore we have to check for null
final ThreadLocal<Stack<WeakReference<ResourceResolver>>> tl = resolverStackHolder;
@@ -350,17 +377,18 @@ public class CommonResourceResolverFacto
return configs;
}
+ /**
+ * Is this factory still alive?
+ */
public boolean isLive() {
return this.isActive.get();
}
- public void register(final ResourceResolver resolver,
- final ResourceResolverContext ctx) {
- // create new weak reference
- refs.add(new ResolverWeakReference(resolver, this.resolverReferenceQueue, ctx));
- }
-
- private static final class ResolverWeakReference extends WeakReference<ResourceResolver> implements Comparable<ResolverWeakReference>{
+ /**
+ * Extension of a weak reference to be able to get the context object
+ * that is used for cleaning up.
+ */
+ private static final class ResolverWeakReference extends WeakReference<ResourceResolver> {
private final ResourceResolverContext context;
@@ -374,9 +402,5 @@ public class CommonResourceResolverFacto
public void close() {
this.context.close();
}
-
- public int compareTo(final ResolverWeakReference o) {
- return context.hashCode() - o.context.hashCode();
- }
}
}
\ No newline at end of file
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java?rev=1659470&r1=1659469&r2=1659470&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java Fri Feb 13 09:00:39 2015
@@ -147,8 +147,7 @@ public class ResourceResolverImpl extend
*/
public void close() {
if ( this.isClosed.compareAndSet(false, true)) {
- this.context.close();
- this.factory.unregister(this);
+ this.factory.unregister(this, this.context);
}
}