From 1cb1f17a9a16965171f5c72f1624a6d373789acd Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 2 Dec 2011 20:54:38 +0400 Subject: [PATCH 1/2] IDEA-77512 fix R.java generating in background/compilation conflicts [rev=rustam.vishnyakov] --- .../android/AndroidProjectComponent.java | 26 ++++++++++++++++++- .../android/compiler/AndroidCompileUtil.java | 26 ++++++++++++------- .../compiler/AndroidPrecompileTask.java | 23 +++++++++++++++- 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/plugins/android/src/org/jetbrains/android/AndroidProjectComponent.java b/plugins/android/src/org/jetbrains/android/AndroidProjectComponent.java index e047daf6bb8b..65bff27a39de 100644 --- a/plugins/android/src/org/jetbrains/android/AndroidProjectComponent.java +++ b/plugins/android/src/org/jetbrains/android/AndroidProjectComponent.java @@ -19,11 +19,15 @@ import com.intellij.openapi.compiler.CompilerManager; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.project.Project; import org.jetbrains.android.compiler.AndroidPrecompileTask; +import org.jetbrains.annotations.NotNull; /** * @author Eugene.Kudelevsky */ public class AndroidProjectComponent extends AbstractProjectComponent { + private volatile boolean myCompilationRunning = false; + private final Object COMPILATION_FLAG_LOCK = new Object(); + protected AndroidProjectComponent(Project project) { super(project); } @@ -31,6 +35,26 @@ public class AndroidProjectComponent extends AbstractProjectComponent { @Override public void projectOpened() { final CompilerManager manager = CompilerManager.getInstance(myProject); - manager.addBeforeTask(new AndroidPrecompileTask()); + manager.addBeforeTask(new AndroidPrecompileTask(this)); + } + + public void setCompilationStarted() { + synchronized (COMPILATION_FLAG_LOCK) { + myCompilationRunning = true; + } + } + + public void setCompilationFinished() { + synchronized (COMPILATION_FLAG_LOCK) { + myCompilationRunning = false; + } + } + + public void runIfNotInCompilation(@NotNull Runnable r) { + synchronized (COMPILATION_FLAG_LOCK) { + if (!myCompilationRunning) { + r.run(); + } + } } } diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java index e3edf4f77940..a5222ce3f74a 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidCompileUtil.java @@ -44,6 +44,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.HashSet; +import org.jetbrains.android.AndroidProjectComponent; import org.jetbrains.android.dom.resources.Attr; import org.jetbrains.android.dom.resources.DeclareStyleable; import org.jetbrains.android.dom.resources.ResourceElement; @@ -340,19 +341,24 @@ public class AndroidCompileUtil { } } - public static void generate(final Module module, GeneratingCompiler compiler) { - assert !ApplicationManager.getApplication().isDispatchThread(); - final CompileContext[] contextWrapper = new CompileContext[1]; - ApplicationManager.getApplication().runReadAction(new Runnable() { + public static void generate(final Module module, final GeneratingCompiler compiler) { + module.getProject().getComponent(AndroidProjectComponent.class).runIfNotInCompilation(new Runnable() { + @Override public void run() { - Project project = module.getProject(); - if (project.isDisposed()) return; - CompilerTask task = new CompilerTask(project, true, "Android auto-generation", true); - CompileScope scope = new ModuleCompileScope(module, false); - contextWrapper[0] = new CompileContextImpl(project, task, scope, null, false, false); + assert !ApplicationManager.getApplication().isDispatchThread(); + final CompileContext[] contextWrapper = new CompileContext[1]; + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + Project project = module.getProject(); + if (project.isDisposed()) return; + CompilerTask task = new CompilerTask(project, true, "Android auto-generation", true); + CompileScope scope = new ModuleCompileScope(module, false); + contextWrapper[0] = new CompileContextImpl(project, task, scope, null, false, false); + } + }); + generate(compiler, contextWrapper[0]); } }); - generate(compiler, contextWrapper[0]); } public static boolean isModuleAffected(CompileContext context, Module module) { diff --git a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java index 1835433415db..a12daa8df257 100644 --- a/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java +++ b/plugins/android/src/org/jetbrains/android/compiler/AndroidPrecompileTask.java @@ -34,6 +34,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.hash.HashSet; +import org.jetbrains.android.AndroidProjectComponent; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidRootUtil; import org.jetbrains.android.sdk.AndroidPlatform; @@ -48,11 +49,19 @@ import java.util.Set; * @author Eugene.Kudelevsky */ public class AndroidPrecompileTask implements CompileTask { - private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidPrecompileTask"); + private final AndroidProjectComponent myOwner; + private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.compiler.AndroidPrecompileTask"); + + public AndroidPrecompileTask(@NotNull AndroidProjectComponent owner) { + myOwner = owner; + } + @Override public boolean execute(CompileContext context) { final Project project = context.getProject(); + + myOwner.setCompilationStarted(); ExcludedEntriesConfiguration configuration = ((CompilerConfigurationImpl)CompilerConfiguration.getInstance(project)).getExcludedEntriesConfiguration(); @@ -96,6 +105,18 @@ public class AndroidPrecompileTask implements CompileTask { CompilerManager.getInstance(project).addCompilationStatusListener(new MyCompilationStatusListener(project, addedEntries), project); } + CompilerManager.getInstance(project).addCompilationStatusListener(new CompilationStatusListener() { + @Override + public void compilationFinished(boolean aborted, int errors, int warnings, final CompileContext compileContext) { + ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { + @Override + public void run() { + myOwner.setCompilationFinished(); + } + }); + } + }, project); + return true; } From 82e4291727896722763b50644845b17616dfbcd0 Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Fri, 2 Dec 2011 21:36:44 +0400 Subject: [PATCH 2/2] [r=kirillk] assorted project leaks. --- .../execution/actions/RunConfigurationAction.java | 8 ++++++++ .../openapi/wm/impl/content/ToolWindowContentUi.java | 4 ++-- .../intellij/openapi/wm/impl/status/IdeStatusBarImpl.java | 5 +++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationAction.java b/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationAction.java index 61d6b12fa1b0..862790d02294 100644 --- a/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationAction.java +++ b/platform/lang-impl/src/com/intellij/execution/actions/RunConfigurationAction.java @@ -120,6 +120,14 @@ public class RunConfigurationAction extends ComboBoxAction implements DumbAware LOG.assertTrue(frame != null); frame.getComponent().getRootPane().putClientProperty(BUTTON_KEY, this); } + + @Override + public void removeNotify() { + final IdeFrame frame = findFrame(this); + LOG.assertTrue(frame != null); + frame.getComponent().getRootPane().putClientProperty(BUTTON_KEY, null); + super.removeNotify(); + } }; final JPanel panel = new JPanel(new BorderLayout()); diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java index e6e2a8771718..423f8eda7369 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java @@ -70,7 +70,7 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh ContentLayout myComboLayout = new ComboContentLayout(this); private ToolWindowContentUiType myType = ToolWindowContentUiType.TABBED; - private static DefaultActionGroup myGroup; + private DefaultActionGroup myGroup; public ToolWindowContentUi(ToolWindowImpl window) { myWindow = window; @@ -252,7 +252,7 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh return true; } - static void initMouseListeners(final JComponent c, final ToolWindowContentUi ui) { + void initMouseListeners(final JComponent c, final ToolWindowContentUi ui) { if (c.getClientProperty(ui) != null) return; diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.java index 019b59619859..c5ae1e9efeb6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/IdeStatusBarImpl.java @@ -257,6 +257,11 @@ public class IdeStatusBarImpl extends JComponent implements StatusBarEx { public void dispose() { myWidgetMap.clear(); + myChildren.clear(); + + myLeftPanel.removeAll(); + myRightPanel.removeAll(); + myCenterPanel.removeAll(); } private void addWidget(@NotNull final StatusBarWidget widget, @NotNull final Position pos, @NotNull final String anchor) {