FELIX-3680 fix a few concurrency problems demonstrated by Pierres test
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1391231 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
index f773a20..0c03fe6 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
@@ -1461,6 +1461,11 @@
doDeactivate( acm, reason );
}
+ Object getService( ImmediateComponentManager dcm )
+ {
+ return null;
+ }
+
void ungetService( ImmediateComponentManager dcm )
{
//do nothing, deactivate will unget all the services.
@@ -1623,6 +1628,17 @@
acm.changeState( Disposed.getInstance() );
}
+ Object getService( ImmediateComponentManager dcm )
+ {
+ //concurrent attempt to get service and remove dependency
+ return null;
+ }
+
+ void ungetService( ImmediateComponentManager dcm )
+ {
+ //do nothing. This can arise if component is deactivated concurrently with ungetService on a delayed component.
+ }
+
}
protected static abstract class Satisfied extends State
@@ -1754,6 +1770,11 @@
// no service can be returned (be prepared for more logging !!)
return null;
}
+
+ void ungetService( ImmediateComponentManager dcm )
+ {
+ //do nothing. This can arise if component is deactivated concurrently with ungetService on a delayed component.
+ }
}
/**
diff --git a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
index 165ffbc..61d2fca 100644
--- a/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
+++ b/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
@@ -611,7 +611,8 @@
boolean release = obtainReadLock( "ImmediateComponentManager.getService.1" );
try
{
- if ( m_implementationObject == null )
+ Object implementationObject = m_implementationObject;
+ if ( implementationObject == null )
{
releaseReadLock( "ImmediateComponentManager.getService.1" );
try
@@ -658,7 +659,7 @@
}
}
m_useCount++;
- return state().getService( this );
+ return implementationObject;
}
finally
{