Author: pauls Date: Sat Mar 17 01:02:52 2018 New Revision: 1827055 URL: http://svn.apache.org/viewvc?rev=1827055&view=rev Log: FELIX-5799: Catch Throwable instead of Exception when calling a service factory ungetService method and fix handing of prototype usage count for services.
Modified: felix/trunk/osgi-r7/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java felix/trunk/osgi-r7/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java Modified: felix/trunk/osgi-r7/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java?rev=1827055&r1=1827054&r2=1827055&view=diff ============================================================================== --- felix/trunk/osgi-r7/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java (original) +++ felix/trunk/osgi-r7/framework/src/main/java/org/apache/felix/framework/ServiceRegistrationImpl.java Sat Mar 17 01:02:52 2018 @@ -287,7 +287,7 @@ class ServiceRegistrationImpl implements ungetFactoryUnchecked(relBundle, svcObj); } } - catch (Exception ex) + catch (Throwable ex) { m_registry.getLogger().log( m_bundle, Modified: felix/trunk/osgi-r7/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java URL: http://svn.apache.org/viewvc/felix/trunk/osgi-r7/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java?rev=1827055&r1=1827054&r2=1827055&view=diff ============================================================================== --- felix/trunk/osgi-r7/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java (original) +++ felix/trunk/osgi-r7/framework/src/main/java/org/apache/felix/framework/ServiceRegistry.java Sat Mar 17 01:02:52 2018 @@ -376,6 +376,20 @@ public class ServiceRegistry if (holder != usage.m_svcHolderRef.get()) holder = null; } + if (svcObj != null && isPrototype) + { + UsageCount existingUsage = obtainUsageCount(bundle, ref, svcObj, null); + if (existingUsage != null && existingUsage != usage) + { + flushUsageCount(bundle, ref, usage); + usage = existingUsage; + incrementToPositiveValue(usage.m_count); + if ( isServiceObjects ) + { + incrementToPositiveValue(usage.m_serviceObjectsCount); + } + } + } } } } @@ -477,8 +491,7 @@ public class ServiceRegistry try { // Remove reference from usages array. - ((ServiceRegistrationImpl.ServiceReferenceImpl) ref) - .getRegistration().ungetService(bundle, svc); + reg.ungetService(bundle, svc); } finally {