FELIX-5034 : Reduce and correct locking related to the hook registry
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1703163 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/framework/src/main/java/org/apache/felix/framework/Felix.java b/framework/src/main/java/org/apache/felix/framework/Felix.java
index c675ff7..fe4bda6 100644
--- a/framework/src/main/java/org/apache/felix/framework/Felix.java
+++ b/framework/src/main/java/org/apache/felix/framework/Felix.java
@@ -3112,7 +3112,7 @@
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 @@
}
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 @@
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 @@
// 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 @@
{
// 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 @@
// 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);
diff --git a/framework/src/main/java/org/apache/felix/framework/HookRegistry.java b/framework/src/main/java/org/apache/felix/framework/HookRegistry.java
index 3f06052..55084cd 100644
--- a/framework/src/main/java/org/apache/felix/framework/HookRegistry.java
+++ b/framework/src/main/java/org/apache/felix/framework/HookRegistry.java
@@ -25,6 +25,7 @@
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 @@
}
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 @@
{
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 @@
{
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 @@
{
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 @@
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 @@
m_blackList.put(sr, sr);
}
}
-
}