diff --git a/platform/util/src/com/intellij/openapi/util/FieldCache.java b/platform/util/src/com/intellij/openapi/util/FieldCache.java index 23e70510eadc..886efe5f1fe7 100644 --- a/platform/util/src/com/intellij/openapi/util/FieldCache.java +++ b/platform/util/src/com/intellij/openapi/util/FieldCache.java @@ -21,6 +21,7 @@ import com.intellij.util.concurrency.JBReentrantReadWriteLock; import com.intellij.util.concurrency.LockFactory; public abstract class FieldCache { + private static final RecursionGuard ourGuard = RecursionManager.createGuard("fieldCache"); private final JBLock r; private final JBLock w; @@ -46,8 +47,11 @@ public abstract class FieldCache { try { result = getValue(owner, a); if (result == null) { + RecursionGuard.StackStamp stamp = ourGuard.markStack(); result = compute(owner, p); - putValue(result, owner, a); + if (stamp.mayCacheNow()) { + putValue(result, owner, a); + } } } finally { diff --git a/platform/platform-api/src/com/intellij/openapi/util/RecursionGuard.java b/platform/util/src/com/intellij/openapi/util/RecursionGuard.java similarity index 100% rename from platform/platform-api/src/com/intellij/openapi/util/RecursionGuard.java rename to platform/util/src/com/intellij/openapi/util/RecursionGuard.java diff --git a/platform/platform-api/src/com/intellij/openapi/util/RecursionManager.java b/platform/util/src/com/intellij/openapi/util/RecursionManager.java similarity index 100% rename from platform/platform-api/src/com/intellij/openapi/util/RecursionManager.java rename to platform/util/src/com/intellij/openapi/util/RecursionManager.java diff --git a/platform/util/src/com/intellij/openapi/util/UserDataCache.java b/platform/util/src/com/intellij/openapi/util/UserDataCache.java index c4da2c94525f..410cde1fa5f2 100644 --- a/platform/util/src/com/intellij/openapi/util/UserDataCache.java +++ b/platform/util/src/com/intellij/openapi/util/UserDataCache.java @@ -19,6 +19,7 @@ package com.intellij.openapi.util; import org.jetbrains.annotations.NonNls; public abstract class UserDataCache extends FieldCache, Param> { + private static final RecursionGuard ourGuard = RecursionManager.createGuard("userDataCache"); private final Key myKey; protected UserDataCache() { @@ -49,8 +50,11 @@ public abstract class UserDataCache exte public T get(Key a, Owner owner, Param p) { T value = owner.getUserData(a); if (value == null) { + RecursionGuard.StackStamp stamp = ourGuard.markStack(); value = compute(owner, p); - value = ((UserDataHolderEx)owner).putUserDataIfAbsent(a, value); + if (stamp.mayCacheNow()) { + value = ((UserDataHolderEx)owner).putUserDataIfAbsent(a, value); + } } return value; }