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();