From 26370bdffb31ff41b0e02f7739c94b6a6724563b Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 5 Apr 2010 14:56:07 +0400 Subject: [PATCH] documents leak fixed --- .../vfs/encoding/EncodingManagerImpl.java | 41 +++++++++++++++---- .../testFramework/LightPlatformTestCase.java | 6 +++ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java index 16ec5be2d307..e58ed35a9032 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/encoding/EncodingManagerImpl.java @@ -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 myChangedDocuments = new ConcurrentLinkedQueue(); 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); } diff --git a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java index bb51060993f7..0e1863ddff05 100644 --- a/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java +++ b/platform/testFramework/src/com/intellij/testFramework/LightPlatformTestCase.java @@ -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(); }