From 5d7b64cd11cdf696aaa6f92879a28d0f11f73a0f Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Sun, 16 Oct 2016 23:03:17 -0400 Subject: [PATCH] Fix the BinaryRunner deadlock correctly. Change-Id: I23907639a4f550c3ed0406f7229b9459deebb4d0 --- .../cdt/internal/core/model/BinaryRunner.java | 6 ++- .../build/CBuildConfigurationManager.java | 38 +++++++++---------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryRunner.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryRunner.java index b51513e6696..7fff3e71f68 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryRunner.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/BinaryRunner.java @@ -153,10 +153,12 @@ public class BinaryRunner { */ public void waitIfRunning() { try { - if (runnerJob != null && !runnerJob.equals(Job.getJobManager().currentJob())) { + Job currentJob = Job.getJobManager().currentJob(); + if (!runnerJob.equals(currentJob)) { runnerJob.join(); } - } catch (InterruptedException e) { + } catch (InterruptedException | IllegalStateException e) { + CCorePlugin.log(e); } } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java index a68e2287b5d..ebe71c5b998 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java @@ -166,16 +166,14 @@ public class CBuildConfigurationManager implements ICBuildConfigurationManager, @Override public ICBuildConfiguration getBuildConfiguration(IBuildConfiguration buildConfig) throws CoreException { initProviders(); + ICBuildConfiguration config = null; + boolean resetBinaryParser = false; synchronized (configs) { - if (noConfigs.contains(buildConfig)) { - return null; - } else { - ICBuildConfiguration config = configs.get(buildConfig); - if (config != null) { - return config; - } else { - String configName; - ICBuildConfigurationProvider provider; + if (!noConfigs.contains(buildConfig)) { + config = configs.get(buildConfig); + if (config == null) { + String configName = null; + ICBuildConfigurationProvider provider = null; if (IBuildConfiguration.DEFAULT_CONFIG_NAME.equals(buildConfig.getName())) { configName = ICBuildConfiguration.DEFAULT_NAME; provider = getProvider(buildConfig.getProject()); @@ -187,12 +185,7 @@ public class CBuildConfigurationManager implements ICBuildConfigurationManager, Provider delegate = getProviderDelegate(providerId); if (delegate != null && delegate.supports(buildConfig.getProject())) { provider = delegate.getProvider(); - } else { - return null; } - } else { - // Not ours - return null; } } @@ -200,18 +193,25 @@ public class CBuildConfigurationManager implements ICBuildConfigurationManager, config = provider.getCBuildConfiguration(buildConfig, configName); if (config != null) { configs.put(buildConfig, config); - // Also make sure we reset the binary parser cache for the new config - CModelManager.getDefault().resetBinaryParser(buildConfig.getProject()); - return config; + resetBinaryParser = true; } } - noConfigs.add(buildConfig); - return null; + if (config == null) { + noConfigs.add(buildConfig); + } } } } + + if (resetBinaryParser) { + // Do this outside of the synchronized block to avoid deadlock with + // BinaryRunner + CModelManager.getDefault().resetBinaryParser(buildConfig.getProject()); + } + + return config; } @Override