From 9ae20627f0b3ca3444b87f40f81440bd3ab61de9 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 2 Jun 2023 11:29:31 +0200 Subject: [PATCH] [slicer] SliceNode: attempts to fix possible concurrency problem getChildren() GitOrigin-RevId: 36335a438817f42edcf59c87c6a4b2ce7520b4f9 --- .../src/com/intellij/slicer/SliceNode.java | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/slicer/SliceNode.java b/platform/lang-impl/src/com/intellij/slicer/SliceNode.java index b058d2cd0acd..3133534abc11 100644 --- a/platform/lang-impl/src/com/intellij/slicer/SliceNode.java +++ b/platform/lang-impl/src/com/intellij/slicer/SliceNode.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2016 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.slicer; import com.intellij.ide.projectView.PresentationData; @@ -41,7 +27,7 @@ import java.util.Collections; import java.util.List; public class SliceNode extends AbstractTreeNode implements DuplicateNodeRenderer.DuplicatableNode, MyColoredTreeCellRenderer { - protected List myCachedChildren; + protected volatile List myCachedChildren; boolean dupNodeCalculated; protected SliceNode duplicate; public final DuplicateMap targetEqualUsages; @@ -81,7 +67,11 @@ public class SliceNode extends AbstractTreeNode implements Duplicate } synchronized (nodes) { - myCachedChildren = nodes; + if (myCachedChildren != null) { + nodes = myCachedChildren; + } else { + myCachedChildren = nodes; + } } return nodes; }