1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-04 14:55:41 +02:00

1. Fix for [Bug 191744] Switching build configurations should not save .cproject

2. Fix for [Bug 186380] [New Project Model] Saving project description is slow
This commit is contained in:
Mikhail Sennikovsky 2007-08-09 14:11:53 +00:00
parent c11d44bf9e
commit d8c16534f0
9 changed files with 155 additions and 82 deletions

View file

@ -960,7 +960,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild
LanguageSettingEntriesSerializer.serializeEntries(sourceEntries, el); LanguageSettingEntriesSerializer.serializeEntries(sourceEntries, el);
} }
// I am clean now // I am clean now
isDirty = false; setDirty(false);
} }
/* /*

View file

@ -100,8 +100,8 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem
} }
static BuildConfigurationData writeConfiguration(ICConfigurationDescription des, static BuildConfigurationData writeConfiguration(ICConfigurationDescription des,
CConfigurationData base) throws CoreException { BuildConfigurationData base) throws CoreException {
BuildConfigurationData appliedCfg = (BuildConfigurationData)base; BuildConfigurationData appliedCfg = base;
ICStorageElement rootElement = des.getStorage(BUILD_SYSTEM_DATA_MODULE_NAME, true); ICStorageElement rootElement = des.getStorage(BUILD_SYSTEM_DATA_MODULE_NAME, true);
rootElement.clear(); rootElement.clear();
rootElement.setAttribute(VERSION_ATTRIBUTE, ManagedBuildManager.getVersion().toString()); rootElement.setAttribute(VERSION_ATTRIBUTE, ManagedBuildManager.getVersion().toString());
@ -122,7 +122,7 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem
protected CConfigurationData applyPreferences( protected CConfigurationData applyPreferences(
ICConfigurationDescription des, CConfigurationData base) throws CoreException{ ICConfigurationDescription des, CConfigurationData base) throws CoreException{
BuildConfigurationData appliedCfg = writeConfiguration(des, base); BuildConfigurationData appliedCfg = writeConfiguration(des, (BuildConfigurationData)base);
IConfiguration cfg = ((BuildConfigurationData)base).getConfiguration(); IConfiguration cfg = ((BuildConfigurationData)base).getConfiguration();
try { try {
@ -144,38 +144,46 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem
if(des.isPreferenceConfiguration()) if(des.isPreferenceConfiguration())
return applyPreferences(des, base); return applyPreferences(des, base);
BuildConfigurationData appliedCfg = writeConfiguration(des, base); BuildConfigurationData baseCfgData = (BuildConfigurationData)base;
IConfiguration baseCfg = baseCfgData.getConfiguration();
BuildConfigurationData appliedCfg;
if(context.getBaseConfigurationDataCacheState() && !baseCfg.isDirty()){
appliedCfg = baseCfgData;
context.setConfiguratoinDataModifiedState(false);
} else {
appliedCfg = writeConfiguration(des, baseCfgData);
context.setConfiguratoinDataModifiedState(true);
IManagedBuildInfo info = getBuildInfo(des); IManagedBuildInfo info = getBuildInfo(des);
ManagedProject mProj = (ManagedProject)info.getManagedProject(); ManagedProject mProj = (ManagedProject)info.getManagedProject();
mProj.applyConfiguration((Configuration)appliedCfg.getConfiguration()); mProj.applyConfiguration((Configuration)appliedCfg.getConfiguration());
writeManagedProjectInfo(des.getProjectDescription(), mProj); writeManagedProjectInfo(des.getProjectDescription(), mProj);
try { try {
CfgScannerConfigInfoFactory2.save(appliedCfg, des.getProjectDescription(), baseDescription.getProjectDescription(), !isPersistedCfg(des)); CfgScannerConfigInfoFactory2.save(appliedCfg, des.getProjectDescription(), baseDescription.getProjectDescription(), !isPersistedCfg(des));
} catch (CoreException e){ } catch (CoreException e){
ManagedBuilderCorePlugin.log(e); ManagedBuilderCorePlugin.log(e);
} }
info.setValid(true); info.setValid(true);
setPersistedFlag(des); setPersistedFlag(des);
cacheNaturesIdsUsedOnCache(des); cacheNaturesIdsUsedOnCache(des);
if(des.isActive()){ if(des.isActive()){
IConfiguration cfg = appliedCfg.getConfiguration(); IConfiguration cfg = appliedCfg.getConfiguration();
IBuilder builder = cfg.getEditableBuilder(); IBuilder builder = cfg.getEditableBuilder();
IProject project = context.getProject(); IProject project = context.getProject();
IProjectDescription eDes = context.getEclipseProjectDescription(); IProjectDescription eDes = context.getEclipseProjectDescription();
switch(BuilderFactory.applyBuilder(eDes, builder)){ switch(BuilderFactory.applyBuilder(eDes, builder)){
case BuilderFactory.CMD_UNDEFINED: case BuilderFactory.CMD_UNDEFINED:
IWorkspaceRunnable applyR = new DesApplyRunnable(project, builder); IWorkspaceRunnable applyR = new DesApplyRunnable(project, builder);
context.addWorkspaceRunnable(applyR); context.addWorkspaceRunnable(applyR);
break; break;
case BuilderFactory.CMD_CHANGED: case BuilderFactory.CMD_CHANGED:
context.setEclipseProjectDescription(eDes); context.setEclipseProjectDescription(eDes);
break; break;
}
} }
} }
return appliedCfg; return appliedCfg;
} }

View file

@ -23,4 +23,14 @@ public interface IModificationContext {
void setEclipseProjectDescription(IProjectDescription eDes) throws CoreException; void setEclipseProjectDescription(IProjectDescription eDes) throws CoreException;
void addWorkspaceRunnable(IWorkspaceRunnable runnable); void addWorkspaceRunnable(IWorkspaceRunnable runnable);
/**
* the CConfigurationDataProvider can call this method to indicate whether the
* ICConfigurationDescription settings were changed
* @param modified
*/
void setConfiguratoinDataModifiedState(boolean modified);
boolean getBaseConfigurationDataCacheState();
} }

View file

@ -32,7 +32,6 @@ import org.eclipse.cdt.core.settings.model.ICSettingObject;
import org.eclipse.cdt.core.settings.model.ICSourceEntry; import org.eclipse.cdt.core.settings.model.ICSourceEntry;
import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.ICStorageElement;
import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting; 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.WriteAccessException;
import org.eclipse.cdt.core.settings.model.extension.CBuildData; import org.eclipse.cdt.core.settings.model.extension.CBuildData;
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
@ -60,6 +59,7 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData
private List fChildList = new ArrayList(); private List fChildList = new ArrayList();
private CConfigurationSpecSettings fSpecSettings; private CConfigurationSpecSettings fSpecSettings;
private CConfigurationData fData; private CConfigurationData fData;
private CConfigurationDescriptionCache fBaseCache;
private ICSourceEntry fProjSourceEntries[]; private ICSourceEntry fProjSourceEntries[];
private StorableCdtVariables fMacros; private StorableCdtVariables fMacros;
private boolean fDataLoadded; private boolean fDataLoadded;
@ -105,11 +105,12 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData
// fInitializing = false; // fInitializing = false;
} }
CConfigurationDescriptionCache(ICConfigurationDescription baseDescription, CConfigurationData base, CConfigurationSpecSettings settingsBase, CProjectDescription parent, ICStorageElement rootEl) throws CoreException { CConfigurationDescriptionCache(ICConfigurationDescription baseDescription, CConfigurationData base, CConfigurationDescriptionCache baseCache, CConfigurationSpecSettings settingsBase, CProjectDescription parent, ICStorageElement rootEl) throws CoreException {
super(base.getId(), base.getName(), null); super(base.getId(), base.getName(), null);
fInitializing = true; fInitializing = true;
fParent = parent; fParent = parent;
fSpecSettings = new CConfigurationSpecSettings(this, settingsBase, rootEl); fSpecSettings = new CConfigurationSpecSettings(this, settingsBase, rootEl);
fSpecSettings.setModified(settingsBase.isModified());
fBaseDescription = baseDescription; fBaseDescription = baseDescription;
if(base instanceof CConfigurationDescriptionCache){ if(base instanceof CConfigurationDescriptionCache){
fData = ((CConfigurationDescriptionCache)base).getConfigurationData(); fData = ((CConfigurationDescriptionCache)base).getConfigurationData();
@ -119,41 +120,44 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData
// base = CProjectDescriptionManager.getInstance().applyData(this, baseDescription, base); // base = CProjectDescriptionManager.getInstance().applyData(this, baseDescription, base);
// fData = base; // fData = base;
} }
// fDataLoadded = true;
// fName = fData.getName(); fBaseCache = baseCache;
// fId = fData.getId();
//
// copySettingsFrom(base, true);
//
// ICdtVariable vars[] = CdtVariableManager.getDefault().getVariables(this);
// fMacros = new StorableCdtVariables(vars, true);
// if(saving)
// fSpecSettings.serialize();
//
// fInitializing = false;
} }
void applyData(CSettingEntryFactory factory, IModificationContext context) throws CoreException{ CConfigurationDescriptionCache getBaseCache(){
if(fBaseDescription == null) return fBaseCache;
return; }
fData = CProjectDescriptionManager.getInstance().applyData(this, fBaseDescription, fData, context, null); boolean applyData(CSettingEntryFactory factory, SettingsContext context) throws CoreException{
fDataLoadded = true; boolean modified = true;
fName = fData.getName(); if(fBaseDescription != null){
fId = fData.getId();
fSettingsFactory = factory;
copySettingsFrom(fData, true); fData = CProjectDescriptionManager.getInstance().applyData(this, fBaseDescription, fData, context, null);
fDataLoadded = true;
fName = fData.getName();
fId = fData.getId();
fSettingsFactory = factory;
fSettingsFactory = null; if(context.getConfiguratoinDataModifiedState() || fBaseCache == null)
copySettingsFrom(fData, true);
else {
copySettingsFrom(fBaseCache, true);
modified = fSpecSettings.isModified();
}
ICdtVariable vars[] = CdtVariableManager.getDefault().getVariables(this); fSettingsFactory = null;
fMacros = new StorableCdtVariables(vars, true);
// if(saving) ICdtVariable vars[] = CdtVariableManager.getDefault().getVariables(this);
fMacros = new StorableCdtVariables(vars, true);
fSpecSettings.serialize(); fSpecSettings.serialize();
fSpecSettings.setModified(false);
}
fBaseDescription = null; fBaseDescription = null;
// fInitializing = false; fBaseCache = null;
return modified;
} }
CSettingEntryFactory getSettingsFactory(){ CSettingEntryFactory getSettingsFactory(){

View file

@ -488,10 +488,13 @@ public class CConfigurationSpecSettings implements ICSettingsStorage{
return fExtSettingsProvider.isModified(); return fExtSettingsProvider.isModified();
} }
void setModified(){ void setModified(boolean modified){
if(isReadOnly()) if(isReadOnly())
throw ExceptionFactory.createIsReadOnlyException(); throw ExceptionFactory.createIsReadOnlyException();
fIsModified = true; fIsModified = modified;
}
void setModified(){
setModified(true);
} }
private Map getSessionPropertiesMap(boolean create){ private Map getSessionPropertiesMap(boolean create){

View file

@ -23,7 +23,6 @@ import org.eclipse.cdt.core.settings.model.ICSettingContainer;
import org.eclipse.cdt.core.settings.model.ICSettingObject; import org.eclipse.cdt.core.settings.model.ICSettingObject;
import org.eclipse.cdt.core.settings.model.ICSettingsStorage; import org.eclipse.cdt.core.settings.model.ICSettingsStorage;
import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.ICStorageElement;
import org.eclipse.cdt.core.settings.model.IModificationContext;
import org.eclipse.cdt.core.settings.model.WriteAccessException; import org.eclipse.cdt.core.settings.model.WriteAccessException;
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
import org.eclipse.cdt.core.settings.model.util.CSettingEntryFactory; import org.eclipse.cdt.core.settings.model.util.CSettingEntryFactory;
@ -206,15 +205,17 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
// fIsLoadding = false; // fIsLoadding = false;
} }
void applyDatas(IModificationContext context){ boolean applyDatas(SettingsContext context){
if(!fIsReadOnly || !fIsApplying) if(!fIsReadOnly || !fIsApplying)
return; return false;
CSettingEntryFactory factory = new CSettingEntryFactory(); CSettingEntryFactory factory = new CSettingEntryFactory();
boolean modified = false;
for(Iterator iter = fCfgMap.values().iterator(); iter.hasNext();){ for(Iterator iter = fCfgMap.values().iterator(); iter.hasNext();){
CConfigurationDescriptionCache cache = (CConfigurationDescriptionCache)iter.next(); CConfigurationDescriptionCache cache = (CConfigurationDescriptionCache)iter.next();
try { try {
cache.applyData(factory, context); if(cache.applyData(factory, context))
modified = true;
} catch (CoreException e) { } catch (CoreException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
e.printStackTrace(); e.printStackTrace();
@ -227,6 +228,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
factory.clear(); factory.clear();
// fIsApplying = false; // fIsApplying = false;
return modified;
} }
@ -280,10 +283,12 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
IInternalCCfgInfo cfgDes = (IInternalCCfgInfo)iter.next(); IInternalCCfgInfo cfgDes = (IInternalCCfgInfo)iter.next();
if(fIsReadOnly){ if(fIsReadOnly){
CConfigurationData baseData = cfgDes.getConfigurationData(false); CConfigurationData baseData = cfgDes.getConfigurationData(false);
CConfigurationDescriptionCache baseCache = null;
if(baseData instanceof CConfigurationDescriptionCache){ if(baseData instanceof CConfigurationDescriptionCache){
baseData = ((CConfigurationDescriptionCache)baseData).getConfigurationData(); baseCache = (CConfigurationDescriptionCache)baseData;
baseData = baseCache.getConfigurationData();
} }
CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache((ICConfigurationDescription)cfgDes, baseData, cfgDes.getSpecSettings(), this, null); CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache((ICConfigurationDescription)cfgDes, baseData, baseCache, cfgDes.getSpecSettings(), this, null);
configurationCreated(cache); configurationCreated(cache);
} else { } else {
CConfigurationData baseData = cfgDes.getConfigurationData(false); CConfigurationData baseData = cfgDes.getConfigurationData(false);

View file

@ -69,7 +69,6 @@ import org.eclipse.cdt.core.settings.model.ICSettingsStorage;
import org.eclipse.cdt.core.settings.model.ICSourceEntry; import org.eclipse.cdt.core.settings.model.ICSourceEntry;
import org.eclipse.cdt.core.settings.model.ICStorageElement; import org.eclipse.cdt.core.settings.model.ICStorageElement;
import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting; import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting;
import org.eclipse.cdt.core.settings.model.IModificationContext;
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData; import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
import org.eclipse.cdt.core.settings.model.extension.CConfigurationDataProvider; import org.eclipse.cdt.core.settings.model.extension.CConfigurationDataProvider;
import org.eclipse.cdt.core.settings.model.extension.CFileData; import org.eclipse.cdt.core.settings.model.extension.CFileData;
@ -1671,11 +1670,12 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
return provider.loadConfiguration(des, monitor); return provider.loadConfiguration(des, monitor);
} }
CConfigurationData applyData(ICConfigurationDescription des, ICConfigurationDescription baseDescription, CConfigurationData base, IModificationContext context, IProgressMonitor monitor) throws CoreException { CConfigurationData applyData(CConfigurationDescriptionCache des, ICConfigurationDescription baseDescription, CConfigurationData base, SettingsContext context, IProgressMonitor monitor) throws CoreException {
if(monitor == null) if(monitor == null)
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
CConfigurationDataProvider provider = getProvider(des); CConfigurationDataProvider provider = getProvider(des);
context.init(des);
return provider.applyConfiguration(des, baseDescription, base, context, monitor); return provider.applyConfiguration(des, baseDescription, base, context, monitor);
} }
@ -3095,8 +3095,10 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
private CConfigurationDescriptionCache createPreferenceCache(ICConfigurationDescription des) throws CoreException{ private CConfigurationDescriptionCache createPreferenceCache(ICConfigurationDescription des) throws CoreException{
IInternalCCfgInfo cfgDes = (IInternalCCfgInfo)des; IInternalCCfgInfo cfgDes = (IInternalCCfgInfo)des;
CConfigurationData baseData = cfgDes.getConfigurationData(false); CConfigurationData baseData = cfgDes.getConfigurationData(false);
CConfigurationDescriptionCache baseCache = null;
if(baseData instanceof CConfigurationDescriptionCache){ if(baseData instanceof CConfigurationDescriptionCache){
baseData = ((CConfigurationDescriptionCache)baseData).getConfigurationData(); baseCache = (CConfigurationDescriptionCache)baseData;
baseData = baseCache.getConfigurationData();
} }
CConfigurationSpecSettings settings = cfgDes.getSpecSettings(); CConfigurationSpecSettings settings = cfgDes.getSpecSettings();
ICStorageElement rootEl = getBuildSystemConfigPreferenceStorage(des.getBuildSystemId(), true, false); ICStorageElement rootEl = getBuildSystemConfigPreferenceStorage(des.getBuildSystemId(), true, false);
@ -3104,7 +3106,7 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
rootParent.removeChild(rootEl); rootParent.removeChild(rootEl);
ICStorageElement baseRootEl = settings.getRootStorageElement(); ICStorageElement baseRootEl = settings.getRootStorageElement();
rootEl = rootParent.importChild(baseRootEl); rootEl = rootParent.importChild(baseRootEl);
CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(des, baseData, cfgDes.getSpecSettings(), null, rootEl); CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(des, baseData, baseCache, cfgDes.getSpecSettings(), null, rootEl);
CSettingEntryFactory factory = new CSettingEntryFactory(); CSettingEntryFactory factory = new CSettingEntryFactory();
SettingsContext context = new SettingsContext(null); SettingsContext context = new SettingsContext(null);
cache.applyData(factory, context); cache.applyData(factory, context);

View file

@ -45,7 +45,7 @@ public class SetCProjectDescriptionOperation extends CModelOperation {
mngr.notifyListeners(event); mngr.notifyListeners(event);
CProjectDescription fNewDescriptionCache = null; CProjectDescription fNewDescriptionCache = null;
SettingsContext context = new SettingsContext(project); SettingsContext context = new SettingsContext(project);
boolean modified;
if(fSetDescription != null){ if(fSetDescription != null){
InternalXmlStorageElement el = null; InternalXmlStorageElement el = null;
try { try {
@ -63,10 +63,12 @@ public class SetCProjectDescriptionOperation extends CModelOperation {
fNewDescriptionCache = new CProjectDescription(fSetDescription, true, el, creating); fNewDescriptionCache = new CProjectDescription(fSetDescription, true, el, creating);
try { try {
mngr.setDescriptionApplying(project, fNewDescriptionCache); mngr.setDescriptionApplying(project, fNewDescriptionCache);
fNewDescriptionCache.applyDatas(context); modified = fNewDescriptionCache.applyDatas(context);
} finally { } finally {
mngr.clearDescriptionApplying(project); mngr.clearDescriptionApplying(project);
} }
} else {
modified = fOldDescriptionCache != null;
} }
ICDescriptionDelta delta = mngr.createDelta(fNewDescriptionCache, fOldDescriptionCache); ICDescriptionDelta delta = mngr.createDelta(fNewDescriptionCache, fOldDescriptionCache);
@ -115,8 +117,11 @@ public class SetCProjectDescriptionOperation extends CModelOperation {
mngr.notifyListeners(event); mngr.notifyListeners(event);
try { try {
if(fNewDescriptionCache != null && !CProjectDescriptionManager.checkFlags(fFlags, ICProjectDescriptionManager.SET_NO_SERIALIZE)) if(fNewDescriptionCache != null && !CProjectDescriptionManager.checkFlags(fFlags, ICProjectDescriptionManager.SET_NO_SERIALIZE)){
context.addWorkspaceRunnable(mngr.createDesSerializationRunnable(fNewDescriptionCache)); if(modified || isPersistentCoreSettingChanged(event)){
context.addWorkspaceRunnable(mngr.createDesSerializationRunnable(fNewDescriptionCache));
}
}
IWorkspaceRunnable toRun = context.createOperationRunnable(); IWorkspaceRunnable toRun = context.createOperationRunnable();
if(toRun != null) if(toRun != null)
@ -126,6 +131,23 @@ public class SetCProjectDescriptionOperation extends CModelOperation {
} }
} }
private static boolean isPersistentCoreSettingChanged(CProjectDescriptionEvent event){
ICDescriptionDelta delta = event.getProjectDelta();
if(delta == null)
return false;
if(delta.getDeltaKind() != ICDescriptionDelta.CHANGED)
return true;
if(delta.getChildren().length != 0)
return true;
int flags = delta.getChangeFlags();
if(flags != 0 && flags != ICDescriptionDelta.ACTIVE_CFG)
return true;
return false;
}
public boolean isReadOnly() { public boolean isReadOnly() {
return false; return false;
} }

View file

@ -22,6 +22,8 @@ public final class SettingsContext implements IModificationContext{
private IProjectDescription fEDes; private IProjectDescription fEDes;
private IProject fProject; private IProject fProject;
private CompositeWorkspaceRunnable fRunnable; private CompositeWorkspaceRunnable fRunnable;
private boolean fCfgDataModifyState;
private boolean fCfgDataCacheState;
SettingsContext(IProject project){ SettingsContext(IProject project){
fProject = project; fProject = project;
@ -31,6 +33,11 @@ public final class SettingsContext implements IModificationContext{
return fProject; return fProject;
} }
void init(CConfigurationDescriptionCache cfg){
fCfgDataModifyState = true;
fCfgDataCacheState = cfg.getBaseCache() != null;
}
IProjectDescription getEclipseProjectDescription(boolean create) throws CoreException{ IProjectDescription getEclipseProjectDescription(boolean create) throws CoreException{
IProjectDescription eDes = fEDes; IProjectDescription eDes = fEDes;
if(eDes == null && create){ if(eDes == null && create){
@ -89,4 +96,16 @@ public final class SettingsContext implements IModificationContext{
} }
return null; return null;
} }
public boolean getBaseConfigurationDataCacheState() {
return fCfgDataCacheState;
}
public void setConfiguratoinDataModifiedState(boolean modified) {
fCfgDataModifyState = modified;
}
public boolean getConfiguratoinDataModifiedState(){
return fCfgDataModifyState;
}
} }