From 2b2001fb5475b13177842442cc2f188d6f44ba0d Mon Sep 17 00:00:00 2001 From: Andrey Turbanov Date: Sat, 17 Apr 2021 23:34:32 +0300 Subject: [PATCH] use single-threaded executor to avoid races when registering Run Configuration actions. Closes #8 --- README.md | 2 +- resources/META-INF/plugin.xml | 9 +++++++-- resources/META-INF/pluginIcon.svg | 1 + src/org/turbanov/actions/Bootstrap.java | 13 ++++++++++++- 4 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 resources/META-INF/pluginIcon.svg diff --git a/README.md b/README.md index b83e071..7b14e84 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Plugins for Jetbrains IDEs. It's provides a way to use run configurations as buttons on toolbar. Or assign shortcuts to execute specific run configuration. -Plugin is compatible with all major IDEs based on IntelliJ Platform starting from version 2019.1: +Plugin is compatible with all major IDEs based on IntelliJ Platform starting from version 2019.2: * IntelliJ IDEA * Android Studio * PhpStorm diff --git a/resources/META-INF/plugin.xml b/resources/META-INF/plugin.xml index d2a049e..8ac6b41 100644 --- a/resources/META-INF/plugin.xml +++ b/resources/META-INF/plugin.xml @@ -1,7 +1,7 @@ org.turbanov.run.configuration.as.action Run Configuration as Action - 1.4.2 + 1.4.3 Turbanov Andrey ]]> 1.4.3 +
    +
  • Fix race when registering many Run Configurations at once +
  • +

1.4.2

  • Properly show Run configurations with underscore character. @@ -45,7 +50,7 @@ Also it allows to create button in toolbar to run specific configuration.
    ]]> - + com.intellij.modules.platform diff --git a/resources/META-INF/pluginIcon.svg b/resources/META-INF/pluginIcon.svg new file mode 100644 index 0000000..22bf0a4 --- /dev/null +++ b/resources/META-INF/pluginIcon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/org/turbanov/actions/Bootstrap.java b/src/org/turbanov/actions/Bootstrap.java index ab0a827..325ecbf 100644 --- a/src/org/turbanov/actions/Bootstrap.java +++ b/src/org/turbanov/actions/Bootstrap.java @@ -23,6 +23,7 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.IconUtil; import com.intellij.util.ImageLoader; +import com.intellij.util.concurrency.AppExecutorUtil; import com.intellij.util.ui.JBImageIcon; import java.awt.Image; @@ -30,6 +31,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; /** * @author Andrey Turbanov @@ -39,6 +41,7 @@ public class Bootstrap implements ProjectComponent { private static final Logger log = Logger.getInstance(RunConfigurationAsAction.class); private static final String ACTION_ID_PREFIX = "RunConfigurationAsAction"; private static final PluginId PLUGIN_ID = PluginId.getId("org.turbanov.run.configuration.as.action"); + private static final ExecutorService ourExecutor = AppExecutorUtil.createBoundedApplicationPoolExecutor("RunConfigurationAsAction", 1); private final Project myProject; @@ -117,6 +120,10 @@ private static String makeActionId(@NotNull Executor executor, } public void removeForAllExecutors(@NotNull RunnerAndConfigurationSettings runConfig) { + ourExecutor.execute(() -> removeForAllExecutorsImpl(runConfig)); + } + + private void removeForAllExecutorsImpl(@NotNull RunnerAndConfigurationSettings runConfig) { List executors = Executor.EXECUTOR_EXTENSION_NAME.getExtensionList(); ActionManager actionManager = ActionManager.getInstance(); List targets = getTargets(runConfig); @@ -138,7 +145,11 @@ public void removeForAllExecutors(@NotNull RunnerAndConfigurationSettings runCon } } - private void registerForAllExecutors(@NotNull RunnerAndConfigurationSettings settings) { + private void registerForAllExecutors(@NotNull RunnerAndConfigurationSettings runConfig) { + ourExecutor.execute(() -> registerForAllExecutorsImpl(runConfig)); + } + + private void registerForAllExecutorsImpl(@NotNull RunnerAndConfigurationSettings settings) { List executors = Executor.EXECUTOR_EXTENSION_NAME.getExtensionList(); List targets = getTargets(settings); for (Executor executor : executors) {