From cf91ada5c0e374fddade9f53dbf0c24327de266e Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Thu, 19 May 2016 19:25:28 +0300 Subject: [PATCH] [io] move synchronized markCorrupted out of storage lock to avoid incorrect locking order --- .../util/io/PersistentEnumeratorBase.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/platform/util/src/com/intellij/util/io/PersistentEnumeratorBase.java b/platform/util/src/com/intellij/util/io/PersistentEnumeratorBase.java index 7171af3788e6..4c0d185d0a8e 100644 --- a/platform/util/src/com/intellij/util/io/PersistentEnumeratorBase.java +++ b/platform/util/src/com/intellij/util/io/PersistentEnumeratorBase.java @@ -454,12 +454,19 @@ public abstract class PersistentEnumeratorBase implements Forceable, Close } public Data valueOf(int idx) throws IOException { - lockStorage(); try { - int addr = indexToAddr(idx); - if (myKeyStorage == null) return ((InlineKeyDescriptor)myDataDescriptor).fromInt(addr); - return myKeyStorage.read(addr, myDataDescriptor); + lockStorage(); + try { + int addr = indexToAddr(idx); + + if (myKeyStorage == null) return ((InlineKeyDescriptor)myDataDescriptor).fromInt(addr); + return myKeyStorage.read(addr, myDataDescriptor); + } + finally { + unlockStorage(); + } + } catch (IOException io) { markCorrupted(); @@ -469,9 +476,6 @@ public abstract class PersistentEnumeratorBase implements Forceable, Close markCorrupted(); throw new RuntimeException(e); } - finally { - unlockStorage(); - } } int reenumerate(Data key) throws IOException {