From: Robert Varga Date: Wed, 16 Jul 2014 21:07:27 +0000 (+0200) Subject: BUG-1381: make users of JavassistUtils.getLock synchronized properly X-Git-Tag: release/helium~446^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=1d5ba4a98412a83dc83a6151ef7fea2289f33fdb BUG-1381: make users of JavassistUtils.getLock synchronized properly As a transition period, use both locking schemes. Once the initial patches are in, we can then remove the use of getLock(). Change-Id: Ibf4c0ea9f420d81dfe74f7b0c5479f01b45a8d2d Signed-off-by: Robert Varga --- diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/AbstractRuntimeCodeGenerator.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/AbstractRuntimeCodeGenerator.java index 8fa88ead07..86003b2aed 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/AbstractRuntimeCodeGenerator.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/AbstractRuntimeCodeGenerator.java @@ -7,6 +7,8 @@ */ package org.opendaylight.controller.sal.binding.codegen.impl; +import com.google.common.base.Supplier; + import java.util.Map; import java.util.WeakHashMap; @@ -29,8 +31,6 @@ import org.opendaylight.yangtools.yang.binding.RpcService; import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext; import org.opendaylight.yangtools.yang.binding.util.ClassLoaderUtils; -import com.google.common.base.Supplier; - abstract class AbstractRuntimeCodeGenerator implements org.opendaylight.controller.sal.binding.codegen.RuntimeCodeGenerator, NotificationInvokerFactory { @GuardedBy("this") private final Map, RuntimeGeneratedInvokerPrototype> invokerClasses = new WeakHashMap<>(); @@ -138,12 +138,14 @@ abstract class AbstractRuntimeCodeGenerator implements org.opendaylight.controll utils.getLock().lock(); try { - invoker = ClassLoaderUtils.withClassLoader(cls.getClassLoader(), new Supplier() { - @Override - public RuntimeGeneratedInvokerPrototype get() { - return generateListenerInvoker(cls); - } - }); + synchronized (utils) { + invoker = ClassLoaderUtils.withClassLoader(cls.getClassLoader(), new Supplier() { + @Override + public RuntimeGeneratedInvokerPrototype get() { + return generateListenerInvoker(cls); + } + }); + } invokerClasses.put(cls, invoker); return invoker; @@ -161,7 +163,9 @@ abstract class AbstractRuntimeCodeGenerator implements org.opendaylight.controll public final T getDirectProxyFor(final Class serviceType) { utils.getLock().lock(); try { - return ClassLoaderUtils.withClassLoader(serviceType.getClassLoader(), directProxySupplier(serviceType)); + synchronized (utils) { + return ClassLoaderUtils.withClassLoader(serviceType.getClassLoader(), directProxySupplier(serviceType)); + } } finally { utils.getLock().unlock(); } @@ -182,8 +186,10 @@ abstract class AbstractRuntimeCodeGenerator implements org.opendaylight.controll utils.getLock().lock(); try { - final T instance = ClassLoaderUtils.withClassLoader(serviceType.getClassLoader(), routerSupplier(serviceType, metadata)); - return new RpcRouterCodegenInstance(name, serviceType, instance, metadata.getContexts()); + synchronized (utils) { + final T instance = ClassLoaderUtils.withClassLoader(serviceType.getClassLoader(), routerSupplier(serviceType, metadata)); + return new RpcRouterCodegenInstance(name, serviceType, instance, metadata.getContexts()); + } } finally { utils.getLock().unlock(); }