mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
documents leak fixed
This commit is contained in:
+33
-8
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user