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);
         }
     }
-
 }