Return-Path: X-Original-To: apmail-felix-commits-archive@www.apache.org Delivered-To: apmail-felix-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 4406EDB88 for ; Sun, 19 May 2013 01:44:21 +0000 (UTC) Received: (qmail 70591 invoked by uid 500); 19 May 2013 01:44:21 -0000 Delivered-To: apmail-felix-commits-archive@felix.apache.org Received: (qmail 70524 invoked by uid 500); 19 May 2013 01:44:20 -0000 Mailing-List: contact commits-help@felix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@felix.apache.org Delivered-To: mailing list commits@felix.apache.org Received: (qmail 70513 invoked by uid 99); 19 May 2013 01:44:20 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 19 May 2013 01:44:20 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 19 May 2013 01:44:19 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id C4A6223888E7; Sun, 19 May 2013 01:43:58 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1484207 - /felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java Date: Sun, 19 May 2013 01:43:58 -0000 To: commits@felix.apache.org From: djencks@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130519014358.C4A6223888E7@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: djencks Date: Sun May 19 01:43:58 2013 New Revision: 1484207 URL: http://svn.apache.org/r1484207 Log: FELIX-4069 synchronize access to service instance map Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java URL: http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java?rev=1484207&r1=1484206&r2=1484207&view=diff ============================================================================== --- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java (original) +++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ServiceFactoryComponentManager.java Sun May 19 01:43:58 2013 @@ -19,6 +19,8 @@ package org.apache.felix.scr.impl.manager; +import java.util.ArrayList; +import java.util.Collection; import java.util.IdentityHashMap; import java.util.Iterator; @@ -80,13 +82,12 @@ public class ServiceFactoryComponentMana { throw new IllegalStateException( "need write lock (deleteComponent)" ); } - for (Iterator i = serviceContexts.values().iterator(); i.hasNext(); ) + for (ComponentContextImpl componentContext: getComponentContexts() ) { - ComponentContextImpl componentContext = i.next(); disposeImplementationObject( componentContext, reason ); - i.remove(); log( LogService.LOG_DEBUG, "Unset implementation object for component {0} in deleteComponent for reason {1}", new Object[] { getName(), REASONS[ reason ] }, null ); } + serviceContexts.clear(); } @@ -139,12 +140,18 @@ public class ServiceFactoryComponentMana { public void presetComponentContext( ComponentContextImpl componentContext ) { - serviceContexts.put( componentContext.getImplementationObject( false ), componentContext ); + synchronized ( serviceContexts ) + { + serviceContexts.put( componentContext.getImplementationObject( false ), componentContext ); + } } public void resetImplementationObject( S implementationObject ) { - serviceContexts.remove( implementationObject ); + synchronized ( serviceContexts ) + { + serviceContexts.remove( implementationObject ); + } } } ); @@ -180,21 +187,34 @@ public class ServiceFactoryComponentMana // When the ungetServiceMethod is called, the implementation object must be deactivated // private ComponentContext and implementation instances final ComponentContextImpl serviceContext; - serviceContext = serviceContexts.get( service ); - + synchronized ( serviceContexts ) + { + serviceContext = serviceContexts.get( service ); + } disposeImplementationObject( serviceContext, ComponentConstants.DEACTIVATION_REASON_DISPOSED ); - serviceContexts.remove( service ); - // if this was the last use of the component, go back to REGISTERED state - if ( serviceContexts.isEmpty() && getState() == STATE_ACTIVE ) + synchronized ( serviceContexts ) + { + serviceContexts.remove( service ); + // if this was the last use of the component, go back to REGISTERED state + if ( serviceContexts.isEmpty() && getState() == STATE_ACTIVE ) + { + changeState( Registered.getInstance() ); + unsetDependenciesCollected(); + } + } + } + + private Collection getComponentContexts() + { + synchronized ( serviceContexts ) { - changeState( Registered.getInstance() ); - unsetDependenciesCollected(); + return new ArrayList( serviceContexts.values() ); } } void invokeBindMethod( DependencyManager dependencyManager, RefPair refPair, int trackingCount ) { - for ( ComponentContextImpl cc : serviceContexts.values() ) + for ( ComponentContextImpl cc : getComponentContexts() ) { dependencyManager.invokeBindMethod( cc.getImplementationObject( false ), refPair, trackingCount, cc.getEdgeInfo( dependencyManager ) ); } @@ -202,7 +222,7 @@ public class ServiceFactoryComponentMana void invokeUpdatedMethod( DependencyManager dependencyManager, RefPair refPair, int trackingCount ) { - for ( ComponentContextImpl cc : serviceContexts.values() ) + for ( ComponentContextImpl cc : getComponentContexts() ) { dependencyManager.invokeUpdatedMethod( cc.getImplementationObject( false ), refPair, trackingCount, cc.getEdgeInfo( dependencyManager ) ); } @@ -210,7 +230,7 @@ public class ServiceFactoryComponentMana void invokeUnbindMethod( DependencyManager dependencyManager, RefPair oldRefPair, int trackingCount ) { - for ( ComponentContextImpl cc : serviceContexts.values() ) + for ( ComponentContextImpl cc : getComponentContexts() ) { dependencyManager.invokeUnbindMethod( cc.getImplementationObject( false ), oldRefPair, trackingCount, cc.getEdgeInfo( dependencyManager ) ); } @@ -220,7 +240,7 @@ public class ServiceFactoryComponentMana { ModifiedMethod modifiedMethod = getComponentMethods().getModifiedMethod(); MethodResult result = MethodResult.VOID; - for ( ComponentContextImpl componentContext : serviceContexts.values() ) + for ( ComponentContextImpl componentContext : getComponentContexts() ) { Object instance = componentContext.getImplementationObject(true); result = modifiedMethod.invoke( instance,