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

bug 415286: Autobuild of a C++ project enters an infinite loop

This commit is contained in:
Andrew Gvozdev 2013-08-22 16:03:05 -04:00
parent 73e87bf305
commit ed74138b16
2 changed files with 36 additions and 1 deletions

View file

@ -22,6 +22,8 @@ import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.internal.core.XmlUtil; import org.eclipse.cdt.internal.core.XmlUtil;
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer; import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsProvidersSerializer;
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsSerializableStorage; import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsSerializableStorage;
import org.eclipse.cdt.internal.core.settings.model.CConfigurationSpecSettings;
import org.eclipse.cdt.internal.core.settings.model.IInternalCCfgInfo;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
@ -273,12 +275,33 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
*/ */
public void serializeLanguageSettingsInBackground(ICConfigurationDescription cfgDescription) { public void serializeLanguageSettingsInBackground(ICConfigurationDescription cfgDescription) {
if (cfgDescription != null) { if (cfgDescription != null) {
if (isLanguageSettingsProviderStoreChanged(cfgDescription)) {
LanguageSettingsManager.serializeLanguageSettingsInBackground(cfgDescription.getProjectDescription()); LanguageSettingsManager.serializeLanguageSettingsInBackground(cfgDescription.getProjectDescription());
}
} else { } else {
LanguageSettingsManager.serializeLanguageSettingsWorkspaceInBackground(); LanguageSettingsManager.serializeLanguageSettingsWorkspaceInBackground();
} }
} }
/**
* Compare provider store with cached persistent store used to calculate delta.
*/
private boolean isLanguageSettingsProviderStoreChanged(ICConfigurationDescription cfgDescription) {
if (cfgDescription instanceof IInternalCCfgInfo) {
try {
CConfigurationSpecSettings ss = ((IInternalCCfgInfo)cfgDescription).getSpecSettings();
if (ss != null) {
return ss.isLanguageSettingsProviderStoreChanged(this);
}
} catch (CoreException e) {
CCorePlugin.log(e);
}
}
// If something went wrong assuming it might have changed
return true;
}
/** /**
* Load provider from XML provider element. * Load provider from XML provider element.
* This is convenience method not intended to be overridden on purpose. * This is convenience method not intended to be overridden on purpose.

View file

@ -27,6 +27,7 @@ import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsBroadca
import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvider; import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvider;
import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvidersKeeper; import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvidersKeeper;
import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsManager; import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsManager;
import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsSerializableProvider;
import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsStorage; import org.eclipse.cdt.core.language.settings.providers.LanguageSettingsStorage;
import org.eclipse.cdt.core.settings.model.CExternalSetting; import org.eclipse.cdt.core.settings.model.CExternalSetting;
import org.eclipse.cdt.core.settings.model.ICBuildSetting; import org.eclipse.cdt.core.settings.model.ICBuildSetting;
@ -1090,4 +1091,15 @@ public class CConfigurationSpecSettings implements ICSettingsStorage, ILanguageS
return languageSettingsDelta; return languageSettingsDelta;
} }
/**
* Check if language settings that provider keeps got changed since last notification event.
*
* @param provider - serializable language settings provider.
* @return {@code true} if provider's entries changed or {@code false} if not.
*/
public boolean isLanguageSettingsProviderStoreChanged(LanguageSettingsSerializableProvider provider) {
LanguageSettingsStorage store = ((ILanguageSettingsBroadcastingProvider) provider).copyStorage();
return ! store.equals(lspPersistedState.get(provider.getId()));
}
} }