diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 1f02d646a29..3d9680f6d68 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -425,10 +425,13 @@ public class PDOM extends PlatformObject implements IPDOM { db = new Database(fPath, cache, getDefaultVersion(), isPermanentlyReadOnly()); db.setLocked(lockDB); - if (isSupportedVersion()) { - readLinkages(); + try { + if (isSupportedVersion()) { + readLinkages(); + } + } finally { + db.setLocked(lockCount != 0); } - db.setLocked(lockCount != 0); } public IIndexLocationConverter getLocationConverter() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java index 01defac2337..02ac75d1194 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOMManager.java @@ -384,8 +384,10 @@ public class PDOMManager implements IWritableIndexManager, IListener { WritablePDOM pdom; try { pdom= new WritablePDOM(dbFile, new PDOMProjectIndexLocationConverter(project), getLinkageFactories()); - } catch (CoreException e) { - CCorePlugin.log("Failed to open C/C++ index " + dbFile.getAbsolutePath() //$NON-NLS-1$ + } catch (CoreException | RuntimeException e) { + // Index file is likely corrupted. Recover by rebuilding the index. + // See http://bugs.eclipse.org/510054 + CCorePlugin.log("Failed to open C/C++ index file " + dbFile.getAbsolutePath() //$NON-NLS-1$ + " - rebuilding the index", e); //$NON-NLS-1$ dbFile.delete(); fromScratch= true;