mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
allow SerializationManager to be unmodifiable (fix serializer set)
GitOrigin-RevId: 748d549ec4113081cd644506b4f8154655e57200
This commit is contained in:
committed by
intellij-monorepo-bot
parent
596e36dfa7
commit
744cf7ddc8
@@ -88,7 +88,7 @@ abstract class PrebuiltStubsProviderBase : PrebuiltIndexProviderBase<SerializedS
|
||||
return null
|
||||
}
|
||||
else {
|
||||
mySerializationManager = SerializationManagerImpl(File(indexesRoot, "$indexName.names"))
|
||||
mySerializationManager = SerializationManagerImpl(File(indexesRoot, "$indexName.names"), true)
|
||||
Disposer.register(ApplicationManager.getApplication(), mySerializationManager!!)
|
||||
return super.openIndexStorage(indexesRoot)
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ import com.intellij.openapi.application.PathManager;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.openapi.util.Computable;
|
||||
import com.intellij.openapi.util.ShutDownTracker;
|
||||
import com.intellij.util.io.AbstractStringEnumerator;
|
||||
import com.intellij.util.io.IOUtil;
|
||||
import com.intellij.util.io.PersistentStringEnumerator;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -39,22 +38,24 @@ public class SerializationManagerImpl extends SerializationManagerEx implements
|
||||
|
||||
private final AtomicBoolean myNameStorageCrashed = new AtomicBoolean(false);
|
||||
private final File myFile;
|
||||
private final boolean myUnmodifiable;
|
||||
private final AtomicBoolean myShutdownPerformed = new AtomicBoolean(false);
|
||||
private AbstractStringEnumerator myNameStorage;
|
||||
private PersistentStringEnumerator myNameStorage;
|
||||
private StubSerializationHelper myStubSerializationHelper;
|
||||
|
||||
public SerializationManagerImpl() {
|
||||
this(new File(PathManager.getIndexRoot(), "rep.names"));
|
||||
this(new File(PathManager.getIndexRoot(), "rep.names"), false);
|
||||
}
|
||||
|
||||
public SerializationManagerImpl(@NotNull File nameStorageFile) {
|
||||
public SerializationManagerImpl(@NotNull File nameStorageFile, boolean unmodifiable) {
|
||||
myFile = nameStorageFile;
|
||||
myFile.getParentFile().mkdirs();
|
||||
myUnmodifiable = unmodifiable;
|
||||
try {
|
||||
// we need to cache last id -> String mappings due to StringRefs and stubs indexing that initially creates stubs (doing enumerate on String)
|
||||
// and then index them (valueOf), also similar string items are expected to be enumerated during stubs processing
|
||||
myNameStorage = new PersistentStringEnumerator(myFile, true);
|
||||
myStubSerializationHelper = new StubSerializationHelper(myNameStorage, this);
|
||||
myStubSerializationHelper = new StubSerializationHelper(myNameStorage, unmodifiable, this);
|
||||
}
|
||||
catch (IOException e) {
|
||||
nameStorageCrashed();
|
||||
@@ -83,10 +84,13 @@ public class SerializationManagerImpl extends SerializationManagerEx implements
|
||||
}
|
||||
|
||||
StubSerializationHelper prevHelper = myStubSerializationHelper;
|
||||
if (myUnmodifiable) {
|
||||
LOG.error("Data provided by unmodifiable serialization manager can be invalid after repair");
|
||||
}
|
||||
|
||||
IOUtil.deleteAllFilesStartingWith(myFile);
|
||||
myNameStorage = new PersistentStringEnumerator(myFile, true);
|
||||
myStubSerializationHelper = new StubSerializationHelper(myNameStorage, this);
|
||||
myStubSerializationHelper = new StubSerializationHelper(myNameStorage, myUnmodifiable, this);
|
||||
myStubSerializationHelper.copyFrom(prevHelper);
|
||||
}
|
||||
catch (IOException e) {
|
||||
|
||||
@@ -14,6 +14,7 @@ import com.intellij.util.containers.RecentStringInterner;
|
||||
import com.intellij.util.io.AbstractStringEnumerator;
|
||||
import com.intellij.util.io.DataInputOutputUtil;
|
||||
import com.intellij.util.io.IOUtil;
|
||||
import com.intellij.util.io.PersistentStringEnumerator;
|
||||
import gnu.trove.*;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -25,7 +26,9 @@ import java.util.*;
|
||||
* Author: dmitrylomov
|
||||
*/
|
||||
class StubSerializationHelper {
|
||||
private final AbstractStringEnumerator myNameStorage;
|
||||
private static final Logger LOG = Logger.getInstance(StubSerializationHelper.class);
|
||||
|
||||
private final PersistentStringEnumerator myNameStorage;
|
||||
|
||||
private final TIntObjectHashMap<String> myIdToName = new TIntObjectHashMap<>();
|
||||
private final TObjectIntHashMap<String> myNameToId = new TObjectIntHashMap<>();
|
||||
@@ -34,10 +37,12 @@ class StubSerializationHelper {
|
||||
private final ConcurrentIntObjectMap<ObjectStubSerializer> myIdToSerializer = ContainerUtil.createConcurrentIntObjectMap();
|
||||
private final Map<ObjectStubSerializer, Integer> mySerializerToId = ContainerUtil.newConcurrentMap();
|
||||
|
||||
private final boolean myUnmodifiable;
|
||||
private final RecentStringInterner myStringInterner;
|
||||
|
||||
StubSerializationHelper(@NotNull AbstractStringEnumerator nameStorage, @NotNull Disposable parentDisposable) {
|
||||
StubSerializationHelper(@NotNull PersistentStringEnumerator nameStorage, boolean unmodifiable, @NotNull Disposable parentDisposable) {
|
||||
myNameStorage = nameStorage;
|
||||
myUnmodifiable = unmodifiable;
|
||||
myStringInterner = new RecentStringInterner(parentDisposable);
|
||||
}
|
||||
|
||||
@@ -53,7 +58,17 @@ class StubSerializationHelper {
|
||||
return;
|
||||
}
|
||||
|
||||
int id = myNameStorage.enumerate(name);
|
||||
int id;
|
||||
if (myUnmodifiable) {
|
||||
id = myNameStorage.tryEnumerate(name);
|
||||
if (id == 0) {
|
||||
LOG.info("serialized " + name + " is ignored in unmodifiable stub serialization manager");
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
id = myNameStorage.enumerate(name);
|
||||
}
|
||||
myIdToName.put(id, name);
|
||||
myNameToId.put(name, id);
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ import java.util.*
|
||||
open class StubsGenerator(private val stubsVersion: String, private val stubsStorageFilePath: String) :
|
||||
IndexGenerator<SerializedStubTree>(stubsStorageFilePath) {
|
||||
|
||||
private val serializationManager = SerializationManagerImpl(File("$stubsStorageFilePath.names"))
|
||||
private val serializationManager = SerializationManagerImpl(File("$stubsStorageFilePath.names"), false)
|
||||
|
||||
fun buildStubsForRoots(roots: Collection<VirtualFile>) {
|
||||
try {
|
||||
@@ -96,7 +96,7 @@ fun mergeStubs(paths: List<String>, stubsFilePath: String, stubsFileName: String
|
||||
stringEnumeratorFile.delete()
|
||||
}
|
||||
|
||||
val newSerializationManager = SerializationManagerImpl(stringEnumeratorFile)
|
||||
val newSerializationManager = SerializationManagerImpl(stringEnumeratorFile, false)
|
||||
|
||||
val map = HashMap<HashCode, Int>()
|
||||
|
||||
@@ -109,7 +109,7 @@ fun mergeStubs(paths: List<String>, stubsFilePath: String, stubsFileName: String
|
||||
val fromStorage = PersistentHashMap<HashCode, SerializedStubTree>(fromStorageFile,
|
||||
HashCodeDescriptor.instance, stubExternalizer)
|
||||
|
||||
val serializationManager = SerializationManagerImpl(File(path, "$stubsFileName.names"))
|
||||
val serializationManager = SerializationManagerImpl(File(path, "$stubsFileName.names"), true)
|
||||
|
||||
try {
|
||||
fromStorage.processKeysWithExistingMapping { key ->
|
||||
|
||||
Reference in New Issue
Block a user