From 4c471669ee7397a5593b6afc5e714220ff7ddcfe Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 16 Feb 2017 10:28:14 +0300 Subject: [PATCH] concurrency bug: cached value can be set to null while the other thread has already computed it in the meantime. This leads to multiple unnecessary re-computations. --- .../src/com/intellij/util/CachedValuesManagerImpl.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java b/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java index c837e564841e..28c2a6cd69e7 100644 --- a/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java +++ b/platform/core-impl/src/com/intellij/util/CachedValuesManagerImpl.java @@ -59,9 +59,12 @@ public class CachedValuesManagerImpl extends CachedValuesManager { if (dataHolder instanceof UserDataHolderEx) { UserDataHolderEx dh = (UserDataHolderEx)dataHolder; value = dh.getUserData(key); - if (isOutdated(value)) { - value = null; - dh.putUserData(key, null); + while (isOutdated(value)) { + if (dh.replace(key, value, null)) { + value = null; + break; + } + value = dh.getUserData(key); } if (value == null) { value = createCachedValue(provider, trackValue);