diff --git a/platform/core-api/src/com/intellij/util/indexing/ID.java b/platform/core-api/src/com/intellij/util/indexing/ID.java index a901214fb83d..4837e0a0d634 100644 --- a/platform/core-api/src/com/intellij/util/indexing/ID.java +++ b/platform/core-api/src/com/intellij/util/indexing/ID.java @@ -43,23 +43,37 @@ public class ID { final File indices = getEnumFile(); try { final BufferedReader reader = new BufferedReader(new FileReader(indices)); + TObjectIntHashMap nameToIdRegistry = new TObjectIntHashMap(); try { int cnt = 0; do { cnt++; final String name = reader.readLine(); if (name == null) break; - ourNameToIdRegistry.put(name, cnt); + nameToIdRegistry.put(name, cnt); } while (true); } finally { reader.close(); } + + synchronized (ourNameToIdRegistry) { + ourNameToIdRegistry.ensureCapacity(nameToIdRegistry.size()); + nameToIdRegistry.forEachEntry(new TObjectIntProcedure() { + @Override + public boolean execute(String name, int index) { + ourNameToIdRegistry.put(name, index); + return true; + } + }); + } } catch (IOException e) { - ourNameToIdRegistry.clear(); - writeEnumFile(); + synchronized (ourNameToIdRegistry) { + ourNameToIdRegistry.clear(); + writeEnumFile(); + } } } @@ -77,18 +91,18 @@ public class ID { } private static short stringToId(String name) { - if (ourNameToIdRegistry.containsKey(name)) { - return (short)ourNameToIdRegistry.get(name); + synchronized (ourNameToIdRegistry) { + if (ourNameToIdRegistry.containsKey(name)) { + return (short)ourNameToIdRegistry.get(name); + } + + int n = ourNameToIdRegistry.size() + 1; + assert n <= MAX_NUMBER_OF_INDICES : "Number of indices exceeded"; + + ourNameToIdRegistry.put(name, n); + writeEnumFile(); + return (short)n; } - - int n = ourNameToIdRegistry.size() + 1; - assert n <= MAX_NUMBER_OF_INDICES : "Number of indices exceeded"; - - ourNameToIdRegistry.put(name, n); - - writeEnumFile(); - - return (short)n; } private static void writeEnumFile() {