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/11 02:29:25 UTC
svn commit: r1550015 - in
/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager:
AbstractComponentManager.java DependencyManager.java
SingleComponentManager.java
Author: djencks
Date: Wed Dec 11 01:29:24 2013
New Revision: 1550015
URL: http://svn.apache.org/r1550015
Log:
FELIX-4350 Close stuff more definitely on failed activation
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
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/SingleComponentManager.java
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java?rev=1550015&r1=1550014&r2=1550015&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java Wed Dec 11 01:29:24 2013
@@ -928,17 +928,14 @@ public abstract class AbstractComponentM
obtainStateLock( "AbstractComponentManager.State.doDeactivate.1" );
try
{
- if ( m_activated )
+ m_activated = false;
+ deleteComponent( reason );
+ deactivateDependencyManagers();
+ if ( disable )
{
- m_activated = false;
- deleteComponent( reason );
- deactivateDependencyManagers();
- if ( disable )
- {
- disableDependencyManagers();
- }
- unsetDependenciesCollected();
+ disableDependencyManagers();
}
+ unsetDependenciesCollected();
}
finally
{
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=1550015&r1=1550014&r2=1550015&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 Wed Dec 11 01:29:24 2013
@@ -202,6 +202,15 @@ public class DependencyManager<S, T> imp
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracker opened", new Object[] {getName()}, null );
}
+ protected void deactivateTracker()
+ {
+ ServiceTracker<T, RefPair<T>> tracker = getTracker();
+ if ( tracker != null )
+ {
+ tracker.deactivate();
+ }
+ }
+
protected Map<ServiceReference<T>, RefPair<T>> getPreviousRefMap()
{
return previousRefMap;
@@ -283,7 +292,7 @@ public class DependencyManager<S, T> imp
public void close()
{
- getTracker().deactivate();
+ deactivateTracker();
}
public Collection<RefPair<T>> getRefs( AtomicInteger trackingCount )
@@ -315,6 +324,7 @@ public class DependencyManager<S, T> imp
{
if (isActive())
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleDynamic already active, binding {2}", new Object[] {getName(), trackingCount, serviceReference}, null );
getServiceObject( m_bindMethods.getBind(), refPair );
if ( !refPair.isFailed() )
{
@@ -326,10 +336,15 @@ public class DependencyManager<S, T> imp
}
else if ( isTrackerOpened() && !isOptional() )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleDynamic, activating", new Object[] {getName(), trackingCount}, null );
tracked( trackingCount );
tracked = true;
m_componentManager.activateInternal( trackingCount );
}
+ else
+ {
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleDynamic, inactive, doing nothing: tracker opened: {2}, optional: {3}", new Object[] {getName(), trackingCount, isTrackerOpened(), isOptional()}, null );
+ }
}
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} MultipleDynamic added {2} (exit)", new Object[] {getName(), trackingCount, serviceReference}, null );
if ( !tracked )
@@ -401,7 +416,7 @@ public class DependencyManager<S, T> imp
{
ungetService( ref );
}
- getTracker().deactivate();
+ deactivateTracker();
}
@@ -519,7 +534,7 @@ public class DependencyManager<S, T> imp
{
ungetService( ref );
}
- getTracker().deactivate();
+ deactivateTracker();
}
public Collection<RefPair<T>> getRefs( AtomicInteger trackingCount )
@@ -645,7 +660,7 @@ public class DependencyManager<S, T> imp
ungetService( ref );
}
}
- getTracker().deactivate();
+ deactivateTracker();
}
public Collection<RefPair<T>> getRefs( AtomicInteger trackingCount )
@@ -847,7 +862,7 @@ public class DependencyManager<S, T> imp
public void close()
{
closeRefPair();
- getTracker().deactivate();
+ deactivateTracker();
}
private void closeRefPair()
@@ -949,10 +964,20 @@ public class DependencyManager<S, T> imp
synchronized (getTracker().tracked())
{
reactivate = ( isActive() && refPair == this.refPair) || ( !isOptional() && getTracker().isEmpty());
+ if (!reactivate && refPair == this.refPair) {
+ this.refPair = null;
+ }
}
if ( reactivate )
{
m_componentManager.deactivateInternal( ComponentConstants.DEACTIVATION_REASON_REFERENCE, false, false );
+ synchronized ( getTracker().tracked() )
+ {
+ if (refPair == this.refPair)
+ {
+ this.refPair = null;
+ }
+ }
m_componentManager.activateInternal( trackingCount );
}
m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1} SingleStatic removed {2} (exit)", new Object[] {getName(), trackingCount, serviceReference}, null );
@@ -989,17 +1014,21 @@ public class DependencyManager<S, T> imp
public void close()
{
- RefPair<T> ref;
- synchronized ( getTracker().tracked() )
- {
- ref = refPair;
- refPair = null;
- }
- if ( ref != null )
+ ServiceTracker<T, RefPair<T>> tracker = getTracker();
+ if ( tracker != null )
{
- ungetService( ref );
+ RefPair<T> ref;
+ synchronized ( tracker.tracked() )
+ {
+ ref = refPair;
+ refPair = null;
+ }
+ if ( ref != null )
+ {
+ ungetService( ref );
+ }
+ tracker.deactivate();
}
- getTracker().deactivate();
}
public Collection<RefPair<T>> getRefs( AtomicInteger trackingCount )
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java?rev=1550015&r1=1550014&r2=1550015&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java (original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/SingleComponentManager.java Wed Dec 11 01:29:24 2013
@@ -303,8 +303,10 @@ public class SingleComponentManager<S> e
{
md.close( implementationObject, componentContext.getEdgeInfo( md ) );
}
+ md.deactivate();
}
setter.resetImplementationObject( implementationObject );
+ unsetDependenciesCollected();
return null;
}
@@ -344,21 +346,23 @@ public class SingleComponentManager<S> e
componentContext.setImplementationAccessible( false );
S implementationObject = componentContext.getImplementationObject( false );
- // 1. Call the deactivate method, if present
- // don't care for the result, the error (acccording to 112.5.12 If the deactivate
- // method throws an exception, SCR must log an error message containing the
- // exception with the Log Service and continue) has already been logged
- final MethodResult result = getComponentMethods().getDeactivateMethod().invoke( implementationObject, new ActivatorParameter( componentContext,
- reason ), null, this );
- if ( result != null )
+ if ( implementationObject != null )
{
- setServiceProperties( result );
- }
-
- // 2. Unbind any bound services
- for ( DependencyManager md: getReversedDependencyManagers() )
- {
- md.close( implementationObject, componentContext.getEdgeInfo( md ) );
+ // 1. Call the deactivate method, if present
+ // don't care for the result, the error (acccording to 112.5.12 If the deactivate
+ // method throws an exception, SCR must log an error message containing the
+ // exception with the Log Service and continue) has already been logged
+ final MethodResult result = getComponentMethods().getDeactivateMethod().invoke( implementationObject,
+ new ActivatorParameter( componentContext, reason ), null, this );
+ if ( result != null )
+ {
+ setServiceProperties( result );
+ }
+ // 2. Unbind any bound services
+ for ( DependencyManager md: getReversedDependencyManagers() )
+ {
+ md.close( implementationObject, componentContext.getEdgeInfo( md ) );
+ }
}
}