Bug 573396 - Make InternalPlatform.getLog() thread-safe

The method InternalPlatform.getLog(Bundle) was not guarded against
concurrent access. If multiple threads concurrently query a log the
'logs'-map could have ended in an inconsistent state.
However the ExtendedLogServiceFactory of the ExtendedLogService used to
create a new logger seems to be thread-safe.

Change-Id: Id12833936c32fce28f877292d5363152a4fccdbb
Signed-off-by: Hannes Wellmann <wellmann.hannes1@gmx.net>
Reviewed-on: https://git.eclipse.org/r/c/platform/eclipse.platform.runtime/+/180289
Tested-by: Platform Bot <platform-bot@eclipse.org>
Reviewed-by: Andrey Loskutov <loskutov@gmx.de>
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/InternalPlatform.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/InternalPlatform.java
index 561f15d..9c0b1cb 100644
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/InternalPlatform.java
+++ b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/InternalPlatform.java
@@ -19,6 +19,7 @@
 import java.io.File;
 import java.net.URL;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import org.eclipse.core.internal.preferences.exchange.ILegacyPreferences;
 import org.eclipse.core.internal.preferences.exchange.IProductPreferencesService;
 import org.eclipse.core.internal.preferences.legacy.InitLegacyPreferences;
@@ -60,8 +61,7 @@
 	private static final String KEYRING = "-keyring"; //$NON-NLS-1$
 	private String keyringFile;
 
-	//XXX This is not synchronized
-	private Map<Bundle,Log> logs = new HashMap<>(5);
+	private Map<Bundle, Log> logs = new ConcurrentHashMap<>(5);
 
 	private static final String[] OS_LIST = { Platform.OS_LINUX, Platform.OS_MACOSX, Platform.OS_WIN32 };
 	private String password = ""; //$NON-NLS-1$
@@ -355,16 +355,14 @@
 	 * The system log listener needs to be optional: turned on or off. What about a system property? :-)
 	 */
 	public ILog getLog(Bundle bundle) {
-		Log result = logs.get(bundle);
-		if (result != null)
-			return result;
-		ExtendedLogService logService = extendedLogTracker.getService();
-		Logger logger = logService != null ? logService.getLogger(bundle, PlatformLogWriter.EQUINOX_LOGGER_NAME) : null;
-		result = new Log(bundle, logger);
-		ExtendedLogReaderService logReader = logReaderTracker.getService();
-		logReader.addLogListener(result, result);
-		logs.put(bundle, result);
-		return result;
+		return logs.computeIfAbsent(bundle, b -> {
+			ExtendedLogService logService = extendedLogTracker.getService();
+			Logger logger = logService != null ? logService.getLogger(b, PlatformLogWriter.EQUINOX_LOGGER_NAME) : null;
+			Log log = new Log(b, logger);
+			ExtendedLogReaderService logReader = logReaderTracker.getService();
+			logReader.addLogListener(log, log);
+			return log;
+		});
 	}
 
 	public String getNL() {