You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2014/10/02 23:56:57 UTC

svn commit: r1629079 - in /felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm: context/DependencyContext.java impl/ComponentImpl.java impl/DependencyImpl.java

Author: pderop
Date: Thu Oct  2 21:56:57 2014
New Revision: 1629079

URL: http://svn.apache.org/r1629079
Log:
Removed the DependencyContext.remove(ComponentContext component) method, because when stopping a component, we must not modify the
Dependency, which may be currently active on another thread.
Fixed a concurrency problem: when a Component is stopped, we must ignore any handleAdded/handleChanged/handleRemoved/handleSwap events.
(this kind of problem may occur when using DM with a threadpool).

Modified:
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java
    felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/DependencyImpl.java

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java?rev=1629079&r1=1629078&r2=1629079&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/context/DependencyContext.java Thu Oct  2 21:56:57 2014
@@ -32,8 +32,7 @@ public interface DependencyContext {
 	public void add(final Event e);
 	public void change(final Event e);
 	public void remove(final Event e);
-	public void add(ComponentContext component);
-	public void remove(ComponentContext component);
+	public void setComponentContext(ComponentContext component);
 	/** Invoked by the component when the dependency should start working. */
 	public void start();
 	/** Invoked by the component when the dependency should stop working. */

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java?rev=1629079&r1=1629078&r2=1629079&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/ComponentImpl.java Thu Oct  2 21:56:57 2014
@@ -171,7 +171,7 @@ public class ComponentImpl implements Co
 					DependencyContext dc = (DependencyContext) d;
 					m_dependencyEvents.put(dc,  new ConcurrentSkipListSet<Event>());
 					m_dependencies.add(dc);
-					dc.add(ComponentImpl.this);
+					dc.setComponentContext(ComponentImpl.this);
 					if (!(m_state == ComponentState.INACTIVE)) {
 						dc.setInstanceBound(true);
 						instanceBoundDeps.add(dc);
@@ -199,7 +199,6 @@ public class ComponentImpl implements Co
 				}
 				// Finally, cleanup the dependency events.
                 m_dependencyEvents.remove(d);
-				dc.remove(ComponentImpl.this);
 				handleChange();
 			}
 		});
@@ -246,8 +245,11 @@ public class ComponentImpl implements Co
 
 	@Override
 	public void handleAdded(DependencyContext dc, Event e) {
-		if (debug) {
-			System.out.println("*" + debugKey + " T" + Thread.currentThread().getId() + " handleAdded " + e);
+	    if (! m_isStarted) {
+	        return;
+	    }
+	    if (debug) {
+	          System.out.println("*" + debugKey + " T" + Thread.currentThread().getId() + " handleAdded " + e);
 		}
 		
 		Set<Event> dependencyEvents = m_dependencyEvents.get(dc);
@@ -293,6 +295,9 @@ public class ComponentImpl implements Co
 		
     @Override
     public void handleChanged(DependencyContext dc, Event e) {
+        if (! m_isStarted) {
+            return;
+        }
         Set<Event> dependencyEvents = m_dependencyEvents.get(dc);
         dependencyEvents.remove(e);
         dependencyEvents.add(e);
@@ -316,11 +321,14 @@ public class ComponentImpl implements Co
 
     @Override
     public void handleRemoved(DependencyContext dc, Event e) {
+        if (! m_isStarted) {
+            return;
+        }
         // Check if the dependency is still available.
         Set<Event> dependencyEvents = m_dependencyEvents.get(dc);
         int size = dependencyEvents.size();
         if (dependencyEvents.contains(e)) {
-            size --; // the dependency is currently registered and is about to be removed.
+            size--; // the dependency is currently registered and is about to be removed.
         }
         dc.setAvailable(size > 0);
         
@@ -357,6 +365,9 @@ public class ComponentImpl implements Co
     }
 
     public void handleSwapped(DependencyContext dc, Event event, Event newEvent) {
+        if (! m_isStarted) {
+            return;
+        }
         Set<Event> dependencyEvents = m_dependencyEvents.get(dc);        
         dependencyEvents.remove(event);
         dependencyEvents.add(newEvent);

Modified: felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/DependencyImpl.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/DependencyImpl.java?rev=1629079&r1=1629078&r2=1629079&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/DependencyImpl.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/org.apache.felix.dependencymanager/src/org/apache/felix/dm/impl/DependencyImpl.java Thu Oct  2 21:56:57 2014
@@ -136,16 +136,11 @@ public class DependencyImpl<T extends De
     }
 
     @Override
-	public void add(ComponentContext component) {
+	public void setComponentContext(ComponentContext component) {
 		m_component = component;
 	}
 	
 	@Override
-	public void remove(ComponentContext component) {
-		m_component = null;
-	}
-
-	@Override
 	public void start() {
 	    if (! m_isStarted) {
 	        startTracking();