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 2013/12/10 01:53:43 UTC
svn commit: r1549723 - in /felix/trunk/scr/src:
main/java/org/apache/felix/scr/impl/manager/
test/java/org/apache/felix/scr/integration/
Author: djencks
Date: Tue Dec 10 00:53:42 2013
New Revision: 1549723
URL: http://svn.apache.org/r1549723
Log:
FELIX-4350 Fix race between activation and deactivation. Problem with ServiceTracker exposed and ignored
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RefPair.java
felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java
felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/Felix4350Test.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=1549723&r1=1549722&r2=1549723&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 Tue Dec 10 00:53:42 2013
@@ -263,6 +263,7 @@ public class DependencyManager<S, T> imp
public void removedService( ServiceReference<T> serviceReference, RefPair<T> refPair, int trackingCount )
{
+ refPair.setDeleted( true );
if ( !isOptional() )
{
if (getTracker().isEmpty())
@@ -351,6 +352,7 @@ public class DependencyManager<S, T> imp
public void removedService( ServiceReference<T> serviceReference, RefPair<T> refPair, int trackingCount )
{
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleDynamic removed {2} (enter)", new Object[] {getName(), trackingCount, serviceReference}, null );
+ refPair.setDeleted( true );
boolean unbind = isOptional() || !getTracker().isEmpty();
if ( unbind )
{
@@ -469,6 +471,7 @@ public class DependencyManager<S, T> imp
public void removedService( ServiceReference<T> serviceReference, RefPair<T> refPair, int trackingCount )
{
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleStaticGreedy removed {2} (enter)", new Object[] {getName(), trackingCount, serviceReference}, null );
+ refPair.setDeleted( true );
tracked( trackingCount );
if ( isActive() )
{
@@ -566,6 +569,7 @@ public class DependencyManager<S, T> imp
public void removedService( ServiceReference<T> serviceReference, RefPair<T> refPair, int trackingCount )
{
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleStaticReluctant removed {2} (enter)", new Object[] {getName(), trackingCount, serviceReference}, null );
+ refPair.setDeleted( true );
tracked( trackingCount );
Collection<RefPair<T>> refs = this.refs.get();
if ( isActive() && refs != null )
@@ -737,6 +741,7 @@ public class DependencyManager<S, T> imp
public void removedService( ServiceReference<T> serviceReference, RefPair<T> refPair, int trackingCount )
{
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} SingleDynamic removed {2} (enter)", new Object[] {getName(), trackingCount, serviceReference}, null );
+ refPair.setDeleted( true );
boolean deactivate = false;
boolean untracked = true;
RefPair<T> oldRefPair = null;
@@ -937,6 +942,10 @@ public class DependencyManager<S, T> imp
public void removedService( ServiceReference<T> serviceReference, RefPair<T> refPair, int trackingCount )
{
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} SingleStatic removed {2} (enter)", new Object[] {getName(), trackingCount, serviceReference}, null );
+ if ( refPair != null ) //TODO needs investigation
+ {
+ refPair.setDeleted( true );
+ }
this.trackingCount = trackingCount;
tracked( trackingCount );
boolean reactivate;
@@ -1427,7 +1436,7 @@ public class DependencyManager<S, T> imp
new Object[]{ getName(), success, refs }, null );
for ( RefPair<T> refPair : refs )
{
- if ( !refPair.isFailed() )
+ if ( !refPair.isDeleted() && !refPair.isFailed() )
{
if ( !doInvokeBindMethod( componentInstance, refPair ) )
{
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RefPair.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RefPair.java?rev=1549723&r1=1549722&r2=1549723&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RefPair.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/RefPair.java Tue Dec 10 00:53:42 2013
@@ -33,6 +33,7 @@ public class RefPair<T>
private AtomicReference<T> serviceObjectRef = new AtomicReference<T>();
private boolean failed;
+ private volatile boolean deleted;
public RefPair( ServiceReference<T> ref )
{
@@ -74,6 +75,15 @@ public class RefPair<T>
return failed;
}
+ public boolean isDeleted()
+ {
+ return deleted;
+ }
+
+ public void setDeleted(boolean deleted)
+ {
+ this.deleted = deleted;
+ }
@Override
public String toString()
Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java?rev=1549723&r1=1549722&r2=1549723&view=diff
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java (original)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/ComponentTestBase.java Tue Dec 10 00:53:42 2013
@@ -254,13 +254,17 @@ public abstract class ComponentTestBase
protected static void delay()
{
+ delay(300);
+ }
+
+ protected static void delay(int millis)
+ {
try
{
- Thread.sleep( 300 );
+ Thread.sleep(millis);
}
- catch ( InterruptedException ie )
+ catch (InterruptedException ie)
{
- // dont care
}
}
Modified: felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/Felix4350Test.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/Felix4350Test.java?rev=1549723&r1=1549722&r2=1549723&view=diff
==============================================================================
--- felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/Felix4350Test.java (original)
+++ felix/trunk/scr/src/test/java/org/apache/felix/scr/integration/Felix4350Test.java Tue Dec 10 00:53:42 2013
@@ -45,44 +45,35 @@ public class Felix4350Test extends Compo
// uncomment to enable debugging of this test class
// paxRunnerVmOption = DEBUG_VM_OPTION;
descriptorFile = "/integration_test_FELIX_4350.xml";
- restrictedLogging = true;
//comment to get debug logging if the test fails.
// DS_LOGLEVEL = "warn";
}
- @Inject
- protected BundleContext bundleContext;
-
@Test
- @Ignore
public void test_unbind_while_activating_single_static()
{
doTest("SingleStatic");
}
@Test
- @Ignore
public void test_unbind_while_activating_single_dynamic()
{
doTest("SingleDynamic");
}
@Test
- @Ignore
public void test_unbind_while_activating_multiple_dynamic()
{
doTest("MultipleDynamic");
}
@Test
- @Ignore
public void test_unbind_while_activating_multiple_static_greedy()
{
doTest("MultipleStaticGreedy");
}
@Test
- @Ignore
public void test_unbind_while_activating_multiple_static_reluctant()
{
doTest("MultipleStaticReluctant");
@@ -126,15 +117,4 @@ public class Felix4350Test extends Compo
TestCase.assertNull(mainCompInst);
}
- protected static void delay(int millis)
- {
- try
- {
- Thread.sleep(millis);
- }
- catch (InterruptedException ie)
- {
- }
- }
-
}