FELIX-3729 cleanup event interval tracking when component instance is deleted

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1424315 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
index 3ad3f58..e5af9f9 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
@@ -1345,6 +1345,10 @@
         latch.countDown();
     }
 
+    void cleanup( S componentInstance)
+    {
+        edgeInfoMap.remove( componentInstance );
+    }
 
     public void invokeBindMethodLate( final ServiceReference<T> ref, int trackingCount )
     {
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
index fd8af5a..cbb67e3 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
@@ -164,9 +164,11 @@
         }
         if ( m_implementationObject != null )
         {
-            disposeImplementationObject( m_implementationObject, m_componentContext, reason );
+            S implementationObject = m_implementationObject;
+            disposeImplementationObject( implementationObject, m_componentContext, reason );
             m_useCount.set( 0 );
             m_implementationObject = null;
+            cleanupImplementationObject( implementationObject );
             log( LogService.LOG_DEBUG, "Unset implementation object for component {0} in deleteComponent for reason {1}", new Object[] { getName(), reason },  null );
             m_componentContext = null;
             m_properties = null;
@@ -335,6 +337,16 @@
         // nothing to do, we keep no references on per-Bundle services
     }
 
+    protected void cleanupImplementationObject( Object implementationObject )
+    {
+
+        for ( DependencyManager md: getReversedDependencyManagers() )
+        {
+            md.cleanup( implementationObject );
+        }
+
+    }
+
     State getSatisfiedState()
     {
         return Registered.getInstance();
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
index eee0f6b..e4e609c 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java
@@ -89,8 +89,9 @@
         for (Iterator i = serviceContexts.values().iterator(); i.hasNext(); )
         {
             BundleComponentContext componentContext = ( BundleComponentContext ) i.next();
-            i.remove();
             disposeImplementationObject( componentContext.getInstance(), componentContext, reason );
+            i.remove();
+            cleanupImplementationObject( componentContext.getInstance() );
             log( LogService.LOG_DEBUG, "Unset implementation object for component {0} in deleteComponent", new Object[] { getName() },  null );
         }
     }
@@ -195,10 +196,11 @@
         // When the ungetServiceMethod is called, the implementation object must be deactivated
         // private ComponentContext and implementation instances
         final ComponentContext serviceContext;
-        serviceContext = ( ComponentContext ) serviceContexts.remove( service );
+        serviceContext = serviceContexts.get( service );
 
         disposeImplementationObject( service, serviceContext, ComponentConstants.DEACTIVATION_REASON_DISPOSED );
-
+        serviceContexts.remove( service );
+        cleanupImplementationObject( service );
         // if this was the last use of the component, go back to REGISTERED state
         if ( serviceContexts.isEmpty() && getState() == STATE_ACTIVE )
         {