You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/09/15 13:58:03 UTC
svn commit: r1703163 - in
/felix/trunk/framework/src/main/java/org/apache/felix/framework: Felix.java
HookRegistry.java
Author: cziegeler
Date: Tue Sep 15 11:58:03 2015
New Revision: 1703163
URL: http://svn.apache.org/r1703163
Log:
FELIX-5034 : Reduce and correct locking related to the hook registry
Modified:
felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
felix/trunk/framework/src/main/java/org/apache/felix/framework/HookRegistry.java
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java?rev=1703163&r1=1703162&r2=1703163&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/Felix.java Tue Sep 15 11:58:03 2015
@@ -3112,7 +3112,7 @@ public class Felix extends BundleImpl im
if (existing != null)
{
Set<ServiceReference<org.osgi.framework.hooks.bundle.FindHook>> hooks =
- getHookRegistry().getBundleFindHooks();
+ getHookRegistry().getHooks(org.osgi.framework.hooks.bundle.FindHook.class);
if (!hooks.isEmpty())
{
Collection<Bundle> bundles = new ArrayList<Bundle>(1);
@@ -3206,7 +3206,7 @@ public class Felix extends BundleImpl im
}
Set<ServiceReference<org.osgi.framework.hooks.bundle.FindHook>> hooks =
- getHookRegistry().getBundleFindHooks();
+ getHookRegistry().getHooks(org.osgi.framework.hooks.bundle.FindHook.class);
if (!hooks.isEmpty() && (bundle != null))
{
Collection<Bundle> bundles = new ArrayList<Bundle>(1);
@@ -3285,7 +3285,7 @@ public class Felix extends BundleImpl im
if ( !bundles.isEmpty() && bc.getBundle() != this )
{
Set<ServiceReference<org.osgi.framework.hooks.bundle.FindHook>> hooks =
- getHookRegistry().getBundleFindHooks();
+ getHookRegistry().getHooks(org.osgi.framework.hooks.bundle.FindHook.class);
if (!hooks.isEmpty())
{
Collection<Bundle> shrunkBundles = new ShrinkableCollection<Bundle>(new ArrayList<Bundle>(bundles));
@@ -3359,7 +3359,7 @@ public class Felix extends BundleImpl im
// Invoke ListenerHook.removed() if filter updated.
Set<ServiceReference<org.osgi.framework.hooks.service.ListenerHook>> listenerHooks =
- getHookRegistry().getServiceListenerHooks();
+ getHookRegistry().getHooks(org.osgi.framework.hooks.service.ListenerHook.class);
if (oldFilter != null)
{
final Collection removed = Collections.singleton(
@@ -3430,7 +3430,7 @@ public class Felix extends BundleImpl im
{
// Invoke the ListenerHook.removed() on all hooks.
Set<ServiceReference<org.osgi.framework.hooks.service.ListenerHook>> listenerHooks =
- getHookRegistry().getServiceListenerHooks();
+ getHookRegistry().getHooks(org.osgi.framework.hooks.service.ListenerHook.class);
Collection removed = Collections.singleton(listener);
for (ServiceReference<org.osgi.framework.hooks.service.ListenerHook> sr : listenerHooks)
{
@@ -3601,7 +3601,7 @@ public class Felix extends BundleImpl im
// activate findhooks
Set<ServiceReference<org.osgi.framework.hooks.service.FindHook>> findHooks =
- getHookRegistry().getServiceFindHooks();
+ getHookRegistry().getHooks(org.osgi.framework.hooks.service.FindHook.class);
for (ServiceReference<org.osgi.framework.hooks.service.FindHook> sr : findHooks)
{
org.osgi.framework.hooks.service.FindHook fh = getService(this, sr, false);
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/HookRegistry.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/HookRegistry.java?rev=1703163&r1=1703162&r2=1703163&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/HookRegistry.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/HookRegistry.java Tue Sep 15 11:58:03 2015
@@ -25,6 +25,7 @@ import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceFactory;
@@ -59,7 +60,7 @@ public class HookRegistry
}
private final Map<String, SortedSet<ServiceReference<?>>> m_allHooks =
- new HashMap<String, SortedSet<ServiceReference<?>>>();
+ new ConcurrentHashMap<String, SortedSet<ServiceReference<?>>>();
private final WeakHashMap<ServiceReference<?>, ServiceReference<?>> m_blackList =
new WeakHashMap<ServiceReference<?>, ServiceReference<?>>();
@@ -119,7 +120,7 @@ public class HookRegistry
{
if (isHook(serviceName, svcObj))
{
- synchronized (m_allHooks)
+ synchronized (m_allHooks) // we need to sync as we replace the value
{
SortedSet<ServiceReference<?>> hooks = m_allHooks.get(serviceName);
if (hooks == null)
@@ -153,7 +154,7 @@ public class HookRegistry
{
if (isHook(serviceName, svcObj))
{
- synchronized (m_allHooks)
+ synchronized (m_allHooks) // we need to sync as we replace the value
{
SortedSet<ServiceReference<?>> hooks = m_allHooks.get(serviceName);
if (hooks != null)
@@ -180,7 +181,7 @@ public class HookRegistry
{
if (isHook(serviceName, svcObj))
{
- synchronized (m_allHooks)
+ synchronized (m_allHooks) // we need to sync as we replace the value
{
SortedSet<ServiceReference<?>> hooks = m_allHooks.get(serviceName);
if (hooks != null)
@@ -214,26 +215,6 @@ public class HookRegistry
return Collections.emptySet();
}
- public Set<ServiceReference<org.osgi.framework.hooks.bundle.FindHook>> getBundleFindHooks()
- {
- return getHooks(org.osgi.framework.hooks.bundle.FindHook.class);
- }
-
- public Set<ServiceReference<org.osgi.framework.hooks.service.FindHook>> getServiceFindHooks()
- {
- return getHooks(org.osgi.framework.hooks.service.FindHook.class);
- }
-
- public Set<ServiceReference<org.osgi.framework.hooks.bundle.EventHook>> getBundleEventHooks()
- {
- return getHooks(org.osgi.framework.hooks.bundle.EventHook.class);
- }
-
- public Set<ServiceReference<org.osgi.framework.hooks.service.ListenerHook>> getServiceListenerHooks()
- {
- return getHooks(org.osgi.framework.hooks.service.ListenerHook.class);
- }
-
public boolean isHookBlackListed(final ServiceReference<?> sr)
{
synchronized ( m_blackList )
@@ -249,5 +230,4 @@ public class HookRegistry
m_blackList.put(sr, sr);
}
}
-
}