Bug 578702 - Revert unintended changes in Log

Change-Id: I5725418f2090afd1a9fb1ee53a0984ba68bf999b
Signed-off-by: Hannes Wellmann <wellmann.hannes1@gmx.net>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.runtime/+/190734
Tested-by: Platform Bot <platform-bot@eclipse.org>
Reviewed-by: Thomas Watson <tjwatson@us.ibm.com>
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Log.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Log.java
index 9b72f0c..d0fe41b 100644
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Log.java
+++ b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/Log.java
@@ -13,8 +13,8 @@
  *******************************************************************************/
 package org.eclipse.core.internal.runtime;
 
+import java.util.HashSet;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
 import org.eclipse.core.runtime.*;
 import org.eclipse.equinox.log.*;
 import org.osgi.framework.Bundle;
@@ -26,7 +26,7 @@
 public class Log implements ILog, SynchronousLogListener, LogFilter {
 	final Bundle bundle;
 	private final Logger logger;
-	private final Set<ILogListener> logListeners = ConcurrentHashMap.newKeySet();
+	private final Set<ILogListener> logListeners = new HashSet<>(5);
 
 	public Log(Bundle plugin, Logger logger) {
 		if (plugin == null)
@@ -43,7 +43,9 @@
 	 */
 	@Override
 	public void addLogListener(ILogListener listener) {
-		logListeners.add(listener);
+		synchronized (logListeners) {
+			logListeners.add(listener);
+		}
 	}
 
 	/**
@@ -74,7 +76,9 @@
 	 */
 	@Override
 	public void removeLogListener(ILogListener listener) {
-		logListeners.remove(listener);
+		synchronized (logListeners) {
+			logListeners.remove(listener);
+		}
 	}
 
 	@Override
@@ -83,8 +87,24 @@
 	}
 
 	private void logToListeners(final IStatus status) {
-		for (final ILogListener listener : logListeners) {
-			SafeRunner.run(() -> listener.logging(status, bundle.getSymbolicName()));
+		// create array to avoid concurrent access
+		ILogListener[] listeners;
+		synchronized (logListeners) {
+			listeners = logListeners.toArray(new ILogListener[logListeners.size()]);
+		}
+		for (final ILogListener listener : listeners) {
+			ISafeRunnable code = new ISafeRunnable() {
+				@Override
+				public void run() throws Exception {
+					listener.logging(status, bundle.getSymbolicName());
+				}
+
+				@Override
+				public void handleException(Throwable e) {
+					//Ignore
+				}
+			};
+			SafeRunner.run(code);
 		}
 	}