You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by dj...@apache.org on 2012/10/13 18:15:00 UTC

svn commit: r1397881 - /felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java

Author: djencks
Date: Sat Oct 13 16:15:00 2012
New Revision: 1397881

URL: http://svn.apache.org/viewvc?rev=1397881&view=rev
Log:
FELIX-3680 track remove events concurrently

Modified:
    felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java

Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java?rev=1397881&r1=1397880&r2=1397881&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java Sat Oct 13 16:15:00 2012
@@ -77,6 +77,7 @@ public class DependencyManager implement
 
     private final Object enableLock = new Object();
     private final Collection<ServiceReference> added = new ArrayList<ServiceReference>();
+    private final Collection<ServiceReference> removed = new ArrayList<ServiceReference>();
 
 
     /**
@@ -223,7 +224,27 @@ public class DependencyManager implement
                     // manage the service counter if the filter matchs
                     if ( targetFilterMatch( ref ) )
                     {
-                        m_size.decrementAndGet();
+                        synchronized ( removed )
+                        {
+                            removed.add( ref );
+                        }
+                        synchronized (enableLock)
+                        {
+                            //wait for enable to complete
+                        }
+                        boolean process;
+                        synchronized ( removed )
+                        {
+                            if (process = removed.contains( ref ))
+                            {
+                                removed.remove( ref );
+                                m_size.decrementAndGet();
+                            }
+                        }
+                        if (process)
+                        {
+                            serviceRemoved( ref );
+                        }
                     }
                     else
                     {
@@ -234,11 +255,11 @@ public class DependencyManager implement
                                 new Object[]
                                     { m_dependencyMetadata.getName(), ref.getProperty( Constants.SERVICE_ID ), getTarget() },
                                 null );
+                        // remove the service ignoring the filter match because if the
+                        // service is bound, it has to be removed no matter what
+                        serviceRemoved( ref );
                     }
 
-                    // remove the service ignoring the filter match because if the
-                    // service is bound, it has to be removed no matter what
-                    serviceRemoved( ref );
 
                     break;
             }
@@ -589,6 +610,19 @@ public class DependencyManager implement
                         }
                     }
                 }
+                synchronized ( removed )
+                {
+                    if (refs != null)
+                    {
+                        for (ServiceReference ref: refs)
+                        {
+                            if (!removed.contains( ref ))
+                            {
+                                removed.remove( ref );
+                            }
+                        }
+                    }
+                }
                 m_size.set( ( refs == null ) ? 0 : refs.length);
             }