mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
avoid concurrency problem, 2 (EA-84206)
This commit is contained in:
@@ -43,23 +43,37 @@ public class ID<K, V> {
|
||||
final File indices = getEnumFile();
|
||||
try {
|
||||
final BufferedReader reader = new BufferedReader(new FileReader(indices));
|
||||
TObjectIntHashMap<String> nameToIdRegistry = new TObjectIntHashMap<String>();
|
||||
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<String>() {
|
||||
@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<K, V> {
|
||||
}
|
||||
|
||||
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() {
|
||||
|
||||
Reference in New Issue
Block a user