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:
parent
e76ec05aab
commit
5d7b64cd11
2 changed files with 23 additions and 21 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Add table
Reference in a new issue