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 
                                 {


Reply via email to