From a8413fa96d6399da6bcc0e80797ff2a604a59a64 Mon Sep 17 00:00:00 2001 From: Mikhail Sennikovsky Date: Thu, 9 Aug 2007 15:08:43 +0000 Subject: [PATCH] 1. Follow up for Fix for [Bug 191744] Switching build configurations should not save .cproject 2. Follow up for Fix for [Bug 186380] [New Project Model] Saving project description is slow --- .../ConfigurationDataProvider.java | 5 ++-- .../settings/model/IModificationContext.java | 20 +++++++++---- .../model/CConfigurationDescriptionCache.java | 7 +++-- .../core/settings/model/SettingsContext.java | 29 ++++++++++++------- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java index 6e1a89b7609..ca3133706c5 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/dataprovider/ConfigurationDataProvider.java @@ -147,12 +147,11 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem BuildConfigurationData baseCfgData = (BuildConfigurationData)base; IConfiguration baseCfg = baseCfgData.getConfiguration(); BuildConfigurationData appliedCfg; - if(context.getBaseConfigurationDataCacheState() && !baseCfg.isDirty()){ + if(context.isBaseDataCached() && !baseCfg.isDirty()){ appliedCfg = baseCfgData; - context.setConfiguratoinDataModifiedState(false); + context.setConfigurationSettingsFlags(IModificationContext.CFG_DATA_STORAGE_UNMODIFIED | IModificationContext.CFG_DATA_SETTINGS_UNMODIFIED); } else { appliedCfg = writeConfiguration(des, baseCfgData); - context.setConfiguratoinDataModifiedState(true); IManagedBuildInfo info = getBuildInfo(des); ManagedProject mProj = (ManagedProject)info.getManagedProject(); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/IModificationContext.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/IModificationContext.java index 0f41e23d9a1..56bf64fbac5 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/IModificationContext.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/IModificationContext.java @@ -16,6 +16,9 @@ import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.runtime.CoreException; public interface IModificationContext { + public static final int CFG_DATA_SETTINGS_UNMODIFIED = 1; + public static final int CFG_DATA_STORAGE_UNMODIFIED = 1 << 1; + IProject getProject(); IProjectDescription getEclipseProjectDescription() throws CoreException; @@ -25,12 +28,19 @@ public interface IModificationContext { void addWorkspaceRunnable(IWorkspaceRunnable runnable); /** - * the CConfigurationDataProvider can call this method to indicate whether the - * ICConfigurationDescription settings were changed - * @param modified + * the CConfigurationDataProvider can call this method to indicate the + * CConfigurationData settings state. + * + * @param flags */ - void setConfiguratoinDataModifiedState(boolean modified); + void setConfigurationSettingsFlags(int flags); - boolean getBaseConfigurationDataCacheState(); + /** + * returns true if the cache data gets re-applied, i.e. there were no changes to the + * current configuration data performed from the core side + * + * @return boolean + */ + boolean isBaseDataCached(); } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java index f00c89d5e8c..50c16dd3592 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CConfigurationDescriptionCache.java @@ -32,6 +32,7 @@ import org.eclipse.cdt.core.settings.model.ICSettingObject; import org.eclipse.cdt.core.settings.model.ICSourceEntry; import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting; +import org.eclipse.cdt.core.settings.model.IModificationContext; import org.eclipse.cdt.core.settings.model.WriteAccessException; import org.eclipse.cdt.core.settings.model.extension.CBuildData; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; @@ -138,11 +139,13 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData fId = fData.getId(); fSettingsFactory = factory; - if(context.getConfiguratoinDataModifiedState() || fBaseCache == null) + if((context.getAllConfigurationSettingsFlags() & IModificationContext.CFG_DATA_SETTINGS_UNMODIFIED) == 0 || fBaseCache == null){ copySettingsFrom(fData, true); - else { + } else { copySettingsFrom(fBaseCache, true); modified = fSpecSettings.isModified(); + if(!modified) + modified = (context.getAllConfigurationSettingsFlags() & IModificationContext.CFG_DATA_STORAGE_UNMODIFIED) == 0; } fSettingsFactory = null; diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsContext.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsContext.java index 34f0723bf49..7a8876f6fed 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsContext.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SettingsContext.java @@ -19,11 +19,14 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; public final class SettingsContext implements IModificationContext{ + private static final int USER_FLAGS_MASK = 0x0000ffff; + public static final int CFG_DATA_CACHED = 1 << 15; + private IProjectDescription fEDes; private IProject fProject; private CompositeWorkspaceRunnable fRunnable; - private boolean fCfgDataModifyState; - private boolean fCfgDataCacheState; + private int fFlags; + SettingsContext(IProject project){ fProject = project; @@ -34,8 +37,10 @@ public final class SettingsContext implements IModificationContext{ } void init(CConfigurationDescriptionCache cfg){ - fCfgDataModifyState = true; - fCfgDataCacheState = cfg.getBaseCache() != null; + int flags = 0; + if(cfg.getBaseCache() != null) + flags |= CFG_DATA_CACHED; + fFlags = flags; } IProjectDescription getEclipseProjectDescription(boolean create) throws CoreException{ @@ -97,15 +102,17 @@ public final class SettingsContext implements IModificationContext{ return null; } - public boolean getBaseConfigurationDataCacheState() { - return fCfgDataCacheState; + public int getAllConfigurationSettingsFlags() { + return fFlags; } - public void setConfiguratoinDataModifiedState(boolean modified) { - fCfgDataModifyState = modified; + public void setConfigurationSettingsFlags(int flags) { + //system flags are read only; + flags &= USER_FLAGS_MASK; + fFlags |= flags; } - - public boolean getConfiguratoinDataModifiedState(){ - return fCfgDataModifyState; + + public boolean isBaseDataCached() { + return (fFlags & CFG_DATA_CACHED) != 0; } }