1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-05 23:35:48 +02:00

Early version check for imported PDOMs, fixes an exception (no bugzilla).

This commit is contained in:
Markus Schorn 2008-01-28 17:14:48 +00:00
parent 5289cfd50b
commit 94f89a6d02
2 changed files with 56 additions and 41 deletions

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2005, 2007 QNX Software Systems and others. * Copyright (c) 2005, 2008 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -62,6 +62,7 @@ import org.eclipse.cdt.internal.core.index.IndexerStateEvent;
import org.eclipse.cdt.internal.core.index.provider.IndexProviderManager; import org.eclipse.cdt.internal.core.index.provider.IndexProviderManager;
import org.eclipse.cdt.internal.core.pdom.PDOM.IListener; import org.eclipse.cdt.internal.core.pdom.PDOM.IListener;
import org.eclipse.cdt.internal.core.pdom.db.ChunkCache; import org.eclipse.cdt.internal.core.pdom.db.ChunkCache;
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMProjectIndexLocationConverter; import org.eclipse.cdt.internal.core.pdom.dom.PDOMProjectIndexLocationConverter;
import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences; import org.eclipse.cdt.internal.core.pdom.indexer.IndexerPreferences;
import org.eclipse.cdt.internal.core.pdom.indexer.PDOMNullIndexer; import org.eclipse.cdt.internal.core.pdom.indexer.PDOMNullIndexer;
@ -147,15 +148,15 @@ public class PDOMManager implements IWritableIndexManager, IListener {
private Object fTaskQueueMutex = new Object(); private Object fTaskQueueMutex = new Object();
private PDOMIndexerJob fIndexerJob; private PDOMIndexerJob fIndexerJob;
private IPDOMIndexerTask fCurrentTask; private IPDOMIndexerTask fCurrentTask;
private LinkedList fTaskQueue = new LinkedList(); private LinkedList<IPDOMIndexerTask> fTaskQueue = new LinkedList<IPDOMIndexerTask>();
private int fCompletedSources; private int fCompletedSources;
private int fCompletedHeaders; private int fCompletedHeaders;
/** /**
* Stores mapping from pdom to project, used to serialize\ creation of new pdoms. * Stores mapping from pdom to project, used to serialize\ creation of new pdoms.
*/ */
private Map fProjectToPDOM= new HashMap(); private Map<IProject, IPDOM> fProjectToPDOM= new HashMap<IProject, IPDOM>();
private Map fFileToProject= new HashMap(); private Map<File, ICProject> fFileToProject= new HashMap<File, ICProject>();
private ListenerList fChangeListeners= new ListenerList(); private ListenerList fChangeListeners= new ListenerList();
private ListenerList fStateListeners= new ListenerList(); private ListenerList fStateListeners= new ListenerList();
@ -174,8 +175,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
* Serializes creation of new indexer, when acquiring the lock you are * Serializes creation of new indexer, when acquiring the lock you are
* not allowed to hold a lock on fPDOMs. * not allowed to hold a lock on fPDOMs.
*/ */
private HashMap fUpdatePolicies= new HashMap(); private HashMap<ICProject, IndexUpdatePolicy> fUpdatePolicies= new HashMap<ICProject, IndexUpdatePolicy>();
private HashMap fPrefListeners= new HashMap(); private HashMap<IProject, PCL> fPrefListeners= new HashMap<IProject, PCL>();
public Job startup() { public Job startup() {
Job postStartupJob= new Job(CCorePlugin.getResourceString("CCorePlugin.startupJob")) { //$NON-NLS-1$ Job postStartupJob= new Job(CCorePlugin.getResourceString("CCorePlugin.startupJob")) { //$NON-NLS-1$
@ -274,7 +275,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
public IPDOM getPDOM(ICProject project) throws CoreException { public IPDOM getPDOM(ICProject project) throws CoreException {
synchronized (fProjectToPDOM) { synchronized (fProjectToPDOM) {
IProject rproject = project.getProject(); IProject rproject = project.getProject();
IPDOM pdom = (IPDOM) fProjectToPDOM.get(rproject); IPDOM pdom = fProjectToPDOM.get(rproject);
if (pdom == null) { if (pdom == null) {
pdom= new PDOMProxy(); pdom= new PDOMProxy();
fProjectToPDOM.put(rproject, pdom); fProjectToPDOM.put(rproject, pdom);
@ -293,7 +294,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
private WritablePDOM getOrCreatePDOM(ICProject project) throws CoreException { private WritablePDOM getOrCreatePDOM(ICProject project) throws CoreException {
synchronized (fProjectToPDOM) { synchronized (fProjectToPDOM) {
IProject rproject = project.getProject(); IProject rproject = project.getProject();
IPDOM pdomProxy= (IPDOM) fProjectToPDOM.get(rproject); IPDOM pdomProxy= fProjectToPDOM.get(rproject);
if (pdomProxy instanceof WritablePDOM) { if (pdomProxy instanceof WritablePDOM) {
return (WritablePDOM) pdomProxy; return (WritablePDOM) pdomProxy;
} }
@ -307,7 +308,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
dbName= null; dbName= null;
} }
else { else {
ICProject currentCOwner= (ICProject) fFileToProject.get(dbFile); ICProject currentCOwner= fFileToProject.get(dbFile);
if (currentCOwner != null) { if (currentCOwner != null) {
IProject currentOwner= currentCOwner.getProject(); IProject currentOwner= currentCOwner.getProject();
if (!currentOwner.exists()) { if (!currentOwner.exists()) {
@ -328,7 +329,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
fromScratch= true; fromScratch= true;
} }
WritablePDOM pdom= new WritablePDOM(dbFile, new PDOMProjectIndexLocationConverter(rproject), LanguageManager.getInstance().getPDOMLinkageFactoryMappings()); WritablePDOM pdom= new WritablePDOM(dbFile, new PDOMProjectIndexLocationConverter(rproject), getLinkageFactories());
if (!pdom.isSupportedVersion() || fromScratch) { if (!pdom.isSupportedVersion() || fromScratch) {
try { try {
pdom.acquireWriteLock(); pdom.acquireWriteLock();
@ -356,6 +357,11 @@ public class PDOMManager implements IWritableIndexManager, IListener {
} }
} }
@SuppressWarnings("unchecked")
private Map<String, IPDOMLinkageFactory> getLinkageFactories() {
return LanguageManager.getInstance().getPDOMLinkageFactoryMappings();
}
private void storeDatabaseName(IProject rproject, String dbName) private void storeDatabaseName(IProject rproject, String dbName)
throws CoreException { throws CoreException {
rproject.setPersistentProperty(dbNameProperty, dbName); rproject.setPersistentProperty(dbNameProperty, dbName);
@ -566,15 +572,15 @@ public class PDOMManager implements IWritableIndexManager, IListener {
} }
public void enqueue(IPDOMIndexerTask subjob) { public void enqueue(IPDOMIndexerTask subjob) {
final HashSet referencing= new HashSet(); final HashSet<IProject> referencing= new HashSet<IProject>();
final IPDOMIndexer indexer = subjob.getIndexer(); final IPDOMIndexer indexer = subjob.getIndexer();
if (indexer != null) { if (indexer != null) {
getReferencingProjects(indexer.getProject().getProject(), referencing); getReferencingProjects(indexer.getProject().getProject(), referencing);
} }
synchronized (fTaskQueueMutex) { synchronized (fTaskQueueMutex) {
int i=0; int i=0;
for (Iterator it = fTaskQueue.iterator(); it.hasNext();) { for (Iterator<IPDOMIndexerTask> it = fTaskQueue.iterator(); it.hasNext();) {
final IPDOMIndexerTask task= (IPDOMIndexerTask) it.next(); final IPDOMIndexerTask task= it.next();
final IPDOMIndexer ti = task.getIndexer(); final IPDOMIndexer ti = task.getIndexer();
if (ti != null && referencing.contains(ti.getProject().getProject())) { if (ti != null && referencing.contains(ti.getProject().getProject())) {
fTaskQueue.add(i, subjob); fTaskQueue.add(i, subjob);
@ -596,11 +602,11 @@ public class PDOMManager implements IWritableIndexManager, IListener {
} }
} }
private void getReferencingProjects(IProject prj, HashSet result) { private void getReferencingProjects(IProject prj, HashSet<IProject> result) {
LinkedList projectsToSearch= new LinkedList(); LinkedList<IProject> projectsToSearch= new LinkedList<IProject>();
projectsToSearch.add(prj); projectsToSearch.add(prj);
while (!projectsToSearch.isEmpty()) { while (!projectsToSearch.isEmpty()) {
prj= (IProject) projectsToSearch.removeFirst(); prj= projectsToSearch.removeFirst();
if (result.add(prj)) { if (result.add(prj)) {
projectsToSearch.addAll(Arrays.asList(prj.getReferencingProjects())); projectsToSearch.addAll(Arrays.asList(prj.getReferencingProjects()));
} }
@ -621,7 +627,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
fCompletedSources+= info.fCompletedSources; fCompletedSources+= info.fCompletedSources;
fCompletedHeaders+= info.fCompletedHeaders; fCompletedHeaders+= info.fCompletedHeaders;
} }
result= fCurrentTask= (IPDOMIndexerTask)fTaskQueue.removeFirst(); result= fCurrentTask= fTaskQueue.removeFirst();
} }
} }
return result; return result;
@ -707,7 +713,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
private void registerPreferenceListener(ICProject project) { private void registerPreferenceListener(ICProject project) {
IProject prj= project.getProject(); IProject prj= project.getProject();
PCL pcl= (PCL) fPrefListeners.get(prj); PCL pcl= fPrefListeners.get(prj);
if (pcl == null) { if (pcl == null) {
pcl= new PCL(project); pcl= new PCL(project);
fPrefListeners.put(prj, pcl); fPrefListeners.put(prj, pcl);
@ -719,7 +725,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
private void unregisterPreferenceListener(ICProject project) { private void unregisterPreferenceListener(ICProject project) {
IProject prj= project.getProject(); IProject prj= project.getProject();
PCL pcl= (PCL) fPrefListeners.remove(prj); PCL pcl= fPrefListeners.remove(prj);
if (pcl != null) { if (pcl != null) {
IndexerPreferences.removeChangeListener(prj, pcl); IndexerPreferences.removeChangeListener(prj, pcl);
Preferences pref = CCorePlugin.getDefault().getPluginPreferences(); Preferences pref = CCorePlugin.getDefault().getPluginPreferences();
@ -748,7 +754,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
private IndexUpdatePolicy createPolicy(final ICProject project) { private IndexUpdatePolicy createPolicy(final ICProject project) {
assert !Thread.holdsLock(fProjectToPDOM); assert !Thread.holdsLock(fProjectToPDOM);
synchronized (fUpdatePolicies) { synchronized (fUpdatePolicies) {
IndexUpdatePolicy policy= (IndexUpdatePolicy) fUpdatePolicies.get(project); IndexUpdatePolicy policy= fUpdatePolicies.get(project);
if (policy == null) { if (policy == null) {
policy= new IndexUpdatePolicy(project, IndexerPreferences.getUpdatePolicy(project.getProject())); policy= new IndexUpdatePolicy(project, IndexerPreferences.getUpdatePolicy(project.getProject()));
fUpdatePolicies.put(project, policy); fUpdatePolicies.put(project, policy);
@ -759,7 +765,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
private IndexUpdatePolicy getPolicy(final ICProject project) { private IndexUpdatePolicy getPolicy(final ICProject project) {
synchronized (fUpdatePolicies) { synchronized (fUpdatePolicies) {
return (IndexUpdatePolicy) fUpdatePolicies.get(project); return fUpdatePolicies.get(project);
} }
} }
@ -845,8 +851,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
private void cancelIndexerJobs(IPDOMIndexer indexer) { private void cancelIndexerJobs(IPDOMIndexer indexer) {
PDOMIndexerJob jobToCancel= null; PDOMIndexerJob jobToCancel= null;
synchronized (fTaskQueueMutex) { synchronized (fTaskQueueMutex) {
for (Iterator iter = fTaskQueue.iterator(); iter.hasNext();) { for (Iterator<IPDOMIndexerTask> iter = fTaskQueue.iterator(); iter.hasNext();) {
IPDOMIndexerTask task= (IPDOMIndexerTask) iter.next(); IPDOMIndexerTask task= iter.next();
if (task.getIndexer() == indexer) { if (task.getIndexer() == indexer) {
iter.remove(); iter.remove();
} }
@ -938,7 +944,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
ICProject project; ICProject project;
synchronized (fProjectToPDOM) { synchronized (fProjectToPDOM) {
project = (ICProject) fFileToProject.get(pdom.getPath()); project = fFileToProject.get(pdom.getPath());
} }
if (project != null) { if (project != null) {
@ -1053,8 +1059,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
completedHeaders= fCompletedHeaders; completedHeaders= fCompletedHeaders;
completedSources= fCompletedSources; completedSources= fCompletedSources;
totalEstimate= fCompletedHeaders+fCompletedSources; totalEstimate= fCompletedHeaders+fCompletedSources;
for (Iterator iter = fTaskQueue.iterator(); iter.hasNext();) { for (Iterator<IPDOMIndexerTask> iter = fTaskQueue.iterator(); iter.hasNext();) {
IPDOMIndexerTask task = (IPDOMIndexerTask) iter.next(); IPDOMIndexerTask task = iter.next();
info= task.getProgressInformation(); info= task.getProgressInformation();
remainingSources+= info.getRemainingSources(); remainingSources+= info.getRemainingSources();
totalEstimate+= info.getTimeEstimate(); totalEstimate+= info.getTimeEstimate();
@ -1145,7 +1151,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
} }
// overwrite internal location representations // overwrite internal location representations
final WritablePDOM newPDOM = new WritablePDOM(targetLocation, pdom.getLocationConverter(), LanguageManager.getInstance().getPDOMLinkageFactoryMappings()); final WritablePDOM newPDOM = new WritablePDOM(targetLocation, pdom.getLocationConverter(), getLinkageFactories());
newPDOM.acquireWriteLock(); newPDOM.acquireWriteLock();
try { try {
newPDOM.rewriteLocations(newConverter); newPDOM.rewriteLocations(newConverter);
@ -1176,6 +1182,16 @@ public class PDOMManager implements IWritableIndexManager, IListener {
File newFile= fileFromDatabaseName(newName); File newFile= fileFromDatabaseName(newName);
OutputStream out= new FileOutputStream(newFile); OutputStream out= new FileOutputStream(newFile);
try { try {
int version= 0;
for (int i=0; i<4; i++) {
byte b= (byte) stream.read();
version= (version << 8) + (b & 0xff);
out.write(b);
}
if (version < PDOM.MIN_SUPPORTED_VERSION) {
final IStatus status = new Status(IStatus.WARNING, CCorePlugin.PLUGIN_ID, 0, CCorePlugin.getResourceString("PDOMManager.unsupportedVersion"), null); //$NON-NLS-1$
throw new CoreException(status);
}
byte[] buffer= new byte[2048]; byte[] buffer= new byte[2048];
int read; int read;
while ((read= stream.read(buffer)) >= 0) { while ((read= stream.read(buffer)) >= 0) {
@ -1226,12 +1242,10 @@ public class PDOMManager implements IWritableIndexManager, IListener {
} }
public void update(ICElement[] tuSelection, int options) throws CoreException { public void update(ICElement[] tuSelection, int options) throws CoreException {
Map projectsToElements= splitSelection(tuSelection); Map<ICProject, List<ICElement>> projectsToElements= splitSelection(tuSelection);
for (Iterator i = projectsToElements.entrySet().iterator(); i for (Map.Entry<ICProject, List<ICElement>> entry : projectsToElements.entrySet()) {
.hasNext();) { ICProject project = entry.getKey();
Map.Entry entry = (Map.Entry) i.next(); List<ICElement> filesAndFolders = entry.getValue();
ICProject project = (ICProject) entry.getKey();
List filesAndFolders = (List) entry.getValue();
update(project, filesAndFolders, options); update(project, filesAndFolders, options);
} }
@ -1241,19 +1255,19 @@ public class PDOMManager implements IWritableIndexManager, IListener {
* computes a map from projects to a collection containing the minimal * computes a map from projects to a collection containing the minimal
* set of folders and files specifying the selection. * set of folders and files specifying the selection.
*/ */
private Map splitSelection(ICElement[] tuSelection) { private Map<ICProject, List<ICElement>> splitSelection(ICElement[] tuSelection) {
HashMap result= new HashMap(); HashMap<ICProject, List<ICElement>> result= new HashMap<ICProject, List<ICElement>>();
allElements: for (int i = 0; i < tuSelection.length; i++) { allElements: for (int i = 0; i < tuSelection.length; i++) {
ICElement element = tuSelection[i]; ICElement element = tuSelection[i];
if (element instanceof ICProject || element instanceof ICContainer || element instanceof ITranslationUnit) { if (element instanceof ICProject || element instanceof ICContainer || element instanceof ITranslationUnit) {
ICProject project= element.getCProject(); ICProject project= element.getCProject();
ArrayList set= (ArrayList) result.get(project); List<ICElement> set= result.get(project);
if (set == null) { if (set == null) {
set= new ArrayList(); set= new ArrayList<ICElement>();
result.put(project, set); result.put(project, set);
} }
for (int j= 0; j<set.size(); j++) { for (int j= 0; j<set.size(); j++) {
ICElement other= (ICElement) set.get(j); ICElement other= set.get(j);
if (contains(other, element)) { if (contains(other, element)) {
continue allElements; continue allElements;
} }
@ -1279,7 +1293,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
return contains(a, b); return contains(a, b);
} }
private void update(ICProject project, List filesAndFolders, int options) throws CoreException { private void update(ICProject project, List<ICElement> filesAndFolders, int options) throws CoreException {
assert !Thread.holdsLock(fProjectToPDOM); assert !Thread.holdsLock(fProjectToPDOM);
synchronized (fUpdatePolicies) { synchronized (fUpdatePolicies) {
IPDOMIndexer indexer= getIndexer(project); IPDOMIndexer indexer= getIndexer(project);
@ -1294,8 +1308,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
void handlePostBuildEvent() { void handlePostBuildEvent() {
assert !Thread.holdsLock(fProjectToPDOM); assert !Thread.holdsLock(fProjectToPDOM);
synchronized (fUpdatePolicies) { synchronized (fUpdatePolicies) {
for (Iterator i = fUpdatePolicies.values().iterator(); i.hasNext();) { for (Iterator<IndexUpdatePolicy> i = fUpdatePolicies.values().iterator(); i.hasNext();) {
IndexUpdatePolicy policy= (IndexUpdatePolicy) i.next(); IndexUpdatePolicy policy= i.next();
IPDOMIndexerTask task= policy.createTask(); IPDOMIndexerTask task= policy.createTask();
if (task != null) { if (task != null) {
enqueue(task); enqueue(task);

View file

@ -77,6 +77,7 @@ pdom.requestTooLarge=Request too large
pdom.indexer.name=C/C++ Indexer pdom.indexer.name=C/C++ Indexer
pdom.indexer.task=Indexing pdom.indexer.task=Indexing
PDOMIndexerJob.updateMonitorJob=Update Monitor PDOMIndexerJob.updateMonitorJob=Update Monitor
PDOMManager.unsupportedVersion=The team-shared index cannot be imported, its format is no longer supported.
CCoreInternals.savePreferencesJob=Save preferences CCoreInternals.savePreferencesJob=Save preferences
CConfigBasedDescriptorManager.0=the project is not a CDT project CConfigBasedDescriptorManager.0=the project is not a CDT project
CConfigBasedDescriptorManager.1=description based descriptor operation can not be nested CConfigBasedDescriptorManager.1=description based descriptor operation can not be nested