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 2009/10/12 15:17:54 UTC

svn commit: r824327 - /sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java

Author: cziegeler
Date: Mon Oct 12 13:17:54 2009
New Revision: 824327

URL: http://svn.apache.org/viewvc?rev=824327&view=rev
Log:
SLING-1144 : Make sync variable volatile and use tracker count instead of keeping track of changes by using custom methods.

Modified:
    sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java

Modified: sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java?rev=824327&r1=824326&r2=824327&view=diff
==============================================================================
--- sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java (original)
+++ sling/trunk/bundles/commons/classloader/src/main/java/org/apache/sling/commons/classloader/impl/DynamicClassLoaderManagerImpl.java Mon Oct 12 13:17:54 2009
@@ -25,7 +25,6 @@
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.packageadmin.PackageAdmin;
 import org.osgi.util.tracker.ServiceTracker;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
 
 /**
  * This is the default implementation of the dynamic class loader
@@ -33,7 +32,7 @@
  */
 public class DynamicClassLoaderManagerImpl
     extends ServiceTracker
-    implements DynamicClassLoaderManager, ServiceTrackerCustomizer {
+    implements DynamicClassLoaderManager {
 
     /** The package admin class loader. */
     private final PackageAdminClassLoader pckAdminCL;
@@ -41,17 +40,14 @@
     /** The dynamic class loader. */
     private final ClassLoaderFacade facade;
 
-    /** The bundle context. */
-    private final BundleContext context;
-
     /** The cached chain of class loaders. */
     private ClassLoader[] cache;
 
-    /** Needs the cache an update? */
-    private boolean updateCache = false;
+    /** Is this still active? */
+    private volatile boolean active = true;
 
-    /** Is this service still active? */
-    private boolean active = true;
+    /** Tracking count */
+    private volatile int trackingCount = -1;
 
     /**
      * Create a new service instance
@@ -64,45 +60,34 @@
             final ClassLoader parent,
             final DynamicClassLoaderManagerFactory factory) {
         super(ctx, DynamicClassLoaderProvider.class.getName(), null);
-        this.context = ctx;
         this.pckAdminCL = new PackageAdminClassLoader(pckAdmin, parent, factory);
         this.cache = new ClassLoader[] {this.pckAdminCL};
         this.open();
         this.facade = new ClassLoaderFacade(this);
     }
 
-    public Object addingService(ServiceReference reference) {
-        this.updateCache = true;
-        return this.context.getService(reference);
-    }
-
-    public void modifiedService(ServiceReference reference, Object service) {
-        // as the ranking property has changed we have to update the cache
-        this.updateCache = true;
-    }
-
-    public void removedService(ServiceReference reference, Object service) {
-        this.context.ungetService(reference);
-        this.updateCache = true;
-    }
-
     private synchronized void updateCache() {
-        if ( this.updateCache ) {
+        if ( this.trackingCount < this.getTrackingCount() ) {
             final ServiceReference[] refs = this.getServiceReferences();
-            final ClassLoader[] loaders = new ClassLoader[1 + refs.length];
-            Arrays.sort(refs, ServiceReferenceComparator.INSTANCE);
-            int index = 0;
-            for(final ServiceReference ref : refs) {
-                final DynamicClassLoaderProvider provider = (DynamicClassLoaderProvider)this.getService(ref);
-                if ( provider != null ) {
-                    loaders[index] = provider.getClassLoader(this.pckAdminCL);
+            final ClassLoader[] loaders;
+            if ( refs == null || refs.length == 0 ) {
+                loaders = new ClassLoader[] {this.pckAdminCL};
+            } else {
+                loaders = new ClassLoader[1 + refs.length];
+                Arrays.sort(refs, ServiceReferenceComparator.INSTANCE);
+                int index = 0;
+                for(final ServiceReference ref : refs) {
+                    final DynamicClassLoaderProvider provider = (DynamicClassLoaderProvider)this.getService(ref);
+                    if ( provider != null ) {
+                        loaders[index] = provider.getClassLoader(this.pckAdminCL);
+                    }
+                    index++;
                 }
-                index++;
+                loaders[index] = this.pckAdminCL;
             }
-            loaders[index] = this.pckAdminCL;
             // and now use new array
             this.cache = loaders;
-            this.updateCache = false;
+            this.trackingCount = this.getTrackingCount();
         }
     }
 
@@ -135,7 +120,7 @@
      * @return The list of class loaders.
      */
     public ClassLoader[] getDynamicClassLoaders() {
-        if ( this.updateCache ) {
+        if ( this.trackingCount < this.getTrackingCount() ) {
             updateCache();
         }
         return this.cache;