From f15136acf25fc10b71bc8a808c7122e850962ea1 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 8 Mar 2011 17:55:48 +0100 Subject: [PATCH] init/shutdown SerializationManager for stubs before/after FileBasedIndex --- .../psi/stubs/SerializationManagerImpl.java | 20 ++++++++++++++++++- .../intellij/psi/stubs/StubUpdatingIndex.java | 7 +------ .../util/indexing/FileBasedIndex.java | 3 ++- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/platform/lang-api/src/com/intellij/psi/stubs/SerializationManagerImpl.java b/platform/lang-api/src/com/intellij/psi/stubs/SerializationManagerImpl.java index eb627af84818..528c752ebfe6 100644 --- a/platform/lang-api/src/com/intellij/psi/stubs/SerializationManagerImpl.java +++ b/platform/lang-api/src/com/intellij/psi/stubs/SerializationManagerImpl.java @@ -20,6 +20,7 @@ import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.diagnostic.LogUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.util.ShutDownTracker; import com.intellij.openapi.util.io.FileUtil; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.IStubFileElementType; @@ -51,6 +52,7 @@ public class SerializationManagerImpl extends SerializationManager implements Ap private final AtomicBoolean myNameStorageCrashed = new AtomicBoolean(false); private final File myFile = new File(PathManager.getIndexRoot(), "rep.names"); private boolean mySerializersLoaded = false; + private final AtomicBoolean myShutdownPerformed = new AtomicBoolean(false); public SerializationManagerImpl() { myFile.getParentFile().mkdirs(); @@ -63,7 +65,14 @@ public class SerializationManagerImpl extends SerializationManager implements Ap repairNameStorage(); // need this in order for myNameStorage not to be null myNameStorageCrashed.set(true); } - registerSerializer(PsiFileStubImpl.TYPE); + finally { + registerSerializer(PsiFileStubImpl.TYPE); + ShutDownTracker.getInstance().registerShutdownTask(new Runnable() { + public void run() { + performShutdown(); + } + }); + } } public boolean isNameStorageCorrupted() { @@ -230,8 +239,17 @@ public class SerializationManagerImpl extends SerializationManager implements Ap } public void disposeComponent() { + performShutdown(); + } + + private void performShutdown() { + if (!myShutdownPerformed.compareAndSet(false, true)) { + return; // already shut down + } + LOG.info("START StubSerializationManager SHUTDOWN"); try { myNameStorage.close(); + LOG.info("END StubSerializationManager SHUTDOWN"); } catch (IOException e) { LOG.error(e); diff --git a/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java b/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java index c2a3e2d99284..a8215c2f9987 100644 --- a/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java +++ b/platform/lang-impl/src/com/intellij/psi/stubs/StubUpdatingIndex.java @@ -407,12 +407,7 @@ public class StubUpdatingIndex extends CustomImplementationFileBasedIndexExtensi super.dispose(); } finally { - try { - getStubIndex().dispose(); - } - finally { - ((SerializationManagerImpl)SerializationManager.getInstance()).disposeComponent(); - } + getStubIndex().dispose(); } } } diff --git a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndex.java b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndex.java index 617340445c6d..d63296b3277b 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndex.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndex.java @@ -57,6 +57,7 @@ import com.intellij.psi.impl.PsiDocumentTransactionListener; import com.intellij.psi.impl.source.PsiFileImpl; import com.intellij.psi.search.EverythingGlobalScope; import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.stubs.SerializationManager; import com.intellij.util.ArrayUtil; import com.intellij.util.CommonProcessors; import com.intellij.util.Processor; @@ -132,7 +133,7 @@ public class FileBasedIndex implements ApplicationComponent { boolean acceptInput(VirtualFile file); } - public FileBasedIndex(final VirtualFileManagerEx vfManager, FileDocumentManager fdm, MessageBus bus) throws IOException { + public FileBasedIndex(final VirtualFileManagerEx vfManager, FileDocumentManager fdm, MessageBus bus, SerializationManager sm /*need this parameter to ensure component dependency*/) throws IOException { myVfManager = vfManager; myFileDocumentManager = fdm; myIsUnitTestMode = ApplicationManager.getApplication().isUnitTestMode();