documents leak fixed

This commit is contained in:
Alexey Kudravtsev
2010-04-05 14:57:24 +04:00
parent 5949a15e9f
commit 26370bdffb
2 changed files with 39 additions and 8 deletions
@@ -23,6 +23,7 @@
package com.intellij.openapi.vfs.encoding;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
@@ -71,23 +72,47 @@ public class EncodingManagerImpl extends EncodingManager implements PersistentSt
private final Queue<Document> myChangedDocuments = new ConcurrentLinkedQueue<Document>();
private final Runnable myEncodingUpdateRunnable = new Runnable() {
public void run() {
Document document = myChangedDocuments.poll();
if (document == null) return;
VirtualFile virtualFile = FileDocumentManager.getInstance().getFile(document);
if (virtualFile == null) return;
Project project = guessProject(virtualFile);
if (project != null && project.isDisposed()) return;
Charset charset = LoadTextUtil.charsetFromContentOrNull(project, virtualFile, document.getText());
document.putUserData(CACHED_CHARSET_FROM_CONTENT, charset);
for (int i=0; i<50;i++) {
if (!pollAndHandleDocument()) return;
}
// requeue myself to handle the tail of the queue in next request
addCacheEncodingAlarm();
}
};
private boolean pollAndHandleDocument() {
final Document document = myChangedDocuments.poll();
if (document == null) return false;
ApplicationManager.getApplication().runReadAction(new Runnable(){
public void run() {
VirtualFile virtualFile = FileDocumentManager.getInstance().getFile(document);
if (virtualFile == null) return;
Project project = guessProject(virtualFile);
if (project != null && project.isDisposed()) return;
Charset charset = LoadTextUtil.charsetFromContentOrNull(project, virtualFile, document.getText());
document.putUserData(CACHED_CHARSET_FROM_CONTENT, charset);
}
});
return true;
}
public void dispose() {
updateEncodingFromContent.cancelAllRequests();
drainDocumentQueue();
}
public void drainDocumentQueue() {
while (pollAndHandleDocument()) {
// loop until empty
}
}
public void updateEncodingFromContent(Document document) {
myChangedDocuments.offer(document);
addCacheEncodingAlarm();
}
private void addCacheEncodingAlarm() {
updateEncodingFromContent.cancelAllRequests();
updateEncodingFromContent.addRequest(myEncodingUpdateRunnable, 400);
}
@@ -61,6 +61,8 @@ import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.openapi.vfs.encoding.EncodingManager;
import com.intellij.openapi.vfs.encoding.EncodingManagerImpl;
import com.intellij.openapi.vfs.newvfs.ManagingFS;
import com.intellij.openapi.vfs.newvfs.persistent.PersistentFS;
import com.intellij.profile.codeInspection.InspectionProfileManager;
@@ -411,10 +413,14 @@ public abstract class LightPlatformTestCase extends UsefulTestCase implements Da
e.printStackTrace();
}
}
EncodingManager encodingManager = EncodingManager.getInstance();
if (encodingManager instanceof EncodingManagerImpl) ((EncodingManagerImpl)encodingManager).drainDocumentQueue();
FileDocumentManager manager = FileDocumentManager.getInstance();
if (manager instanceof FileDocumentManagerImpl) {
((FileDocumentManagerImpl)manager).dropAllUnsavedDocuments();
}
ApplicationManager.getApplication().runWriteAction(EmptyRunnable.getInstance()); // Flash posponed formatting if any.
manager.saveAllDocuments();
}