Author: gnodet Date: Wed Mar 12 20:05:57 2014 New Revision: 1576875 URL: http://svn.apache.org/r1576875 Log: [FELIX-4190] The framework should not hold any lock while calling ServiceFactory#unget Make sure all references are cleaned
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java?rev=1576875&r1=1576874&r2=1576875&view=diff ============================================================================== --- felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java (original) +++ felix/trunk/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java Wed Mar 12 20:05:57 2014 @@ -155,13 +155,21 @@ public class ServiceRegistry } // Now forcibly unget the service object for all stubborn clients. - Bundle[] clients = getUsingBundles(reg.getReference()); + ServiceReference ref = reg.getReference(); + Bundle[] clients = getUsingBundles(ref); for (int i = 0; (clients != null) && (i < clients.length); i++) { while (ungetService(clients[i], reg.getReference())) ; // Keep removing until it is no longer possible } + // Invalidate registration ((ServiceRegistrationImpl) reg).invalidate(); + // Bundles are allowed to get a reference while unregistering + for (int i = 0; (clients != null) && (i < clients.length); i++) + { + while (ungetService(clients[i], ref)) + ; // Keep removing until it is no longer possible + } } /**