1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Fix the BinaryRunner deadlock correctly.

Change-Id: I23907639a4f550c3ed0406f7229b9459deebb4d0
This commit is contained in:
Doug Schaefer 2016-10-16 23:03:17 -04:00
parent e76ec05aab
commit 5d7b64cd11
2 changed files with 23 additions and 21 deletions

View file

@ -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);
}
}

View file

@ -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,20 +193,27 @@ 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;
}
}
if (config == null) {
noConfigs.add(buildConfig);
return null;
}
}
}
}
if (resetBinaryParser) {
// Do this outside of the synchronized block to avoid deadlock with
// BinaryRunner
CModelManager.getDefault().resetBinaryParser(buildConfig.getProject());
}
return config;
}
@Override
public ICBuildConfiguration getBuildConfiguration(IProject project, IToolChain toolChain,
String launchMode, IProgressMonitor monitor) throws CoreException {