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