FELIX-3680 track modified events concurrently
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1397883 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 5806b86..6928fe4 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
@@ -176,38 +176,74 @@
// service not currently bound --- what to do ?
// if static
// if inactive and target match: activate
- // if dynamic
+ // if dynamic or greedy
// if multiple and target match: bind
if ( targetFilterMatch( ref ) )
{
- // new filter match, so increase the counter
- m_size.incrementAndGet();
-
- if ( isStatic() )
+ synchronized ( added )
{
- // if static reference: activate if currentl unsatisifed, otherwise no influence
- if ( m_componentManager.getState() == AbstractComponentManager.STATE_UNSATISFIED )
+ added.add( ref );
+ }
+ synchronized (enableLock)
+ {
+ //wait for enable to complete
+ }
+ boolean process;
+ synchronized ( added )
+ {
+ if (process = added.contains( ref ))
{
- m_componentManager.log( LogService.LOG_DEBUG,
- "Dependency Manager: Service {0} registered, activate component", new Object[]
- { m_dependencyMetadata.getName() }, null );
-
- // immediately try to activate the component (FELIX-2368)
- m_componentManager.activateInternal();
+ added.remove( ref );
+ m_size.incrementAndGet();
}
}
- else if ( isMultiple() || !isReluctant())
+ if (process)
{
- // if dynamic and multiple reference, bind, otherwise ignore
- serviceAdded( ref );
+ if ( isStatic() )
+ {
+ // if static reference: activate if currentl unsatisifed, otherwise no influence
+ if ( m_componentManager.getState() == AbstractComponentManager.STATE_UNSATISFIED )
+ {
+ m_componentManager.log( LogService.LOG_DEBUG,
+ "Dependency Manager: Service {0} registered, activate component", new Object[]
+ { m_dependencyMetadata.getName() }, null );
+
+ // immediately try to activate the component (FELIX-2368)
+ m_componentManager.activateInternal();
+ }
+ }
+ else if ( isMultiple() || !isReluctant())
+ {
+ // if dynamic and multiple reference, bind, otherwise ignore
+ serviceAdded( ref );
+ }
}
+
}
}
else if ( !targetFilterMatch( ref ) )
{
- // service reference does not match target any more, remove
- m_size.decrementAndGet();
- serviceRemoved( ref );
+ 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
{