From 39a6ce254473d79ae991332572df9467a4346ac7 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Sun, 15 Feb 2004 23:30:53 +0000 Subject: [PATCH] Patch for Bogdan Gheorghe. Improved error handling for Indexer Improved error handling for MatchLocator Bounds checking for mappings in IncudeEntry Improved error handling for Merge operations Source file name fitering for recreating an already existing index --- core/org.eclipse.cdt.core/index/ChangeLog | 27 +++++--- .../org/eclipse/cdt/internal/core/Util.java | 6 +- .../core/index/impl/IncludeEntry.java | 6 +- .../core/index/impl/MergeFactory.java | 22 +++++- .../search/indexing/AddFolderToIndex.java | 7 +- .../core/search/indexing/IndexAllProject.java | 9 ++- .../core/search/indexing/SourceIndexer.java | 69 ++++++++----------- core/org.eclipse.cdt.core/search/ChangeLog | 4 ++ .../core/search/matching/MatchLocator.java | 17 ++++- 9 files changed, 105 insertions(+), 62 deletions(-) diff --git a/core/org.eclipse.cdt.core/index/ChangeLog b/core/org.eclipse.cdt.core/index/ChangeLog index 625bd50f091..8f803a99c66 100644 --- a/core/org.eclipse.cdt.core/index/ChangeLog +++ b/core/org.eclipse.cdt.core/index/ChangeLog @@ -1,17 +1,28 @@ -2004-02-09 Bogdan Gheorghe +2004-02-13 Bogdan Gheorghe PR 51232 + + - Added mapping range checking to IncludeEntry to avoid out of bounds exceptions + - Added error handling to MergeFactory to handle problems during the save operation + - Added source file name filtering for the recreate an already existing index scenario in + IndexAllProject. + - Added more robust error handling to SourceIndexer + - Added error handling routine to Util.getFileCharContent() to deal with potential out of + memory crash + + * index/org/eclipse/cdt/internal/core/index/impl/IncludeEntry.java + * index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java + * index/org/eclipse/cdt/internal/core/index/search/Util.java + * index/org/eclipse/cdt/internal/core/index/search/indexing/IndexAllProject.java + * index/org/eclipse/cdt/internal/core/index/search/indexing/SourceIndexer.java + * index/org/eclipse/cdt/internal/core/index/search/indexing/AddFolderToIndex.java + +2004-02-10 Bogdan Gheorghe - - Added a layer of separation between the parser and the indexer: we now - create a worker thread to run the parser in. This allows the indexer to - finish all scheduled jobs regardless of how the parser performs on - individual files (i.e. indexing no longer affected by parser failures) - - Modified some of the stored index block reading routines to use separate counters, thus avoiding potential EOF exceptions. * index/org/eclipse/cdt/internal/core/index/impl/BlocksIndexInput.java - * index/org/eclipse/cdt/internal/core/index/search/indexing/SourceIndexer.java - + 2004-02-03 Alain Magloire PR 51106 diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/Util.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/Util.java index a384a3a3808..91d3de9592c 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/Util.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/Util.java @@ -148,7 +148,11 @@ public class Util { try { stream = new BufferedInputStream(new FileInputStream(file)); return Util.getInputStreamAsCharArray(stream, (int) file.length(), encoding); - } finally { + } + catch (OutOfMemoryError er){ + return null; + } + finally { if (stream != null) { try { stream.close(); diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/IncludeEntry.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/IncludeEntry.java index 7495ac6e54a..e762d1a4231 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/IncludeEntry.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/IncludeEntry.java @@ -157,8 +157,12 @@ public class IncludeEntry { */ public void mapRefs(int[] mappings) { int position= 0; + for (int i= 0; i < fNumRefs; i++) { - int map= mappings[fRefs[i]]; + //Take care that the reference is actually within the bounds of the mapping + int map= -1; + if(fRefs[i] >= 0 && fRefs[i] < mappings.length) + map= mappings[fRefs[i]]; if (map != -1 && map != 0) fRefs[position++]= map; } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java index 10d2a65497a..8d2e787f030 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/index/impl/MergeFactory.java @@ -13,6 +13,9 @@ package org.eclipse.cdt.internal.core.index.impl; import java.io.IOException; import java.util.Map; +import org.eclipse.cdt.internal.core.search.indexing.IndexManager; +import org.eclipse.cdt.internal.core.search.processing.JobManager; + /** * A mergeFactory is used to merge 2 indexes into one. One of the indexes * (oldIndex) is on the disk and the other(addsIndex) is in memory. @@ -81,7 +84,24 @@ public class MergeFactory { mergeReferences(); mergeIncludes(); mergeOutput.flush(); - } finally { + } + catch ( Exception ex ){ + if (ex instanceof IOException) + throw (IOException) ex; + else { + if (IndexManager.VERBOSE) { + JobManager.verbose("-> got the following exception during merge:"); //$NON-NLS-1$ + ex.printStackTrace(); + } + } + } + catch ( VirtualMachineError er ) { + if (IndexManager.VERBOSE) { + JobManager.verbose("-> got the following exception during merge:"); //$NON-NLS-1$ + er.printStackTrace(); + } + } + finally { //closes everything oldInput.close(); addsInput.close(); diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java index 029aa05f285..5f225521c4b 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AddFolderToIndex.java @@ -58,13 +58,12 @@ class AddFolderToIndex extends IndexRequest { public boolean visit(IResourceProxy proxy) throws CoreException { switch(proxy.getType()) { case IResource.FILE : -// TODO: BOG Put the file name checking back - //if (Util.isJavaFileName(proxy.getName())) { + if (Util.isCCFileName(proxy.getName())) { IResource resource = proxy.requestResource(); if (pattern == null || !Util.isExcluded(resource, pattern)) indexManager.addSource((IFile)resource, container); - //} - //return false; + } + return false; case IResource.FOLDER : if (pattern != null && Util.isExcluded(proxy.requestResource(), pattern)) return false; diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java index bf4b4cf9b1d..8143a1767e6 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java @@ -124,9 +124,8 @@ public class IndexAllProject extends IndexRequest { public boolean visit(IResourceProxy proxy) { if (isCancelled) return false; switch(proxy.getType()) { - case IResource.FILE : -// TODO: BOG Put the file name checking back - //if (Util.isCCFileName(proxy.getName())) { + case IResource.FILE : + if (Util.isCCFileName(proxy.getName())) { IResource resource = proxy.requestResource(); IPath path = resource.getLocation(); if (path != null && (patterns == null || !Util.isExcluded(resource, patterns))) { @@ -136,8 +135,8 @@ public class IndexAllProject extends IndexRequest { ? (Object) resource : (Object) OK); } - //} - //return false; + } + return false; case IResource.FOLDER : if (patterns != null && Util.isExcluded(proxy.requestResource(), patterns)) return false; diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java index 895a5d8fa15..dd71ee600db 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexer.java @@ -97,28 +97,36 @@ public class SourceIndexer extends AbstractIndexer { { } - ParserRunner p = new ParserRunner(parser); - Thread t = new Thread(p, "CDT Indexer Parser Runner"); - t.start(); - try{ - t.join(); - } - catch (InterruptedException e){ - org.eclipse.cdt.internal.core.model.Util.log(null, "Parser Runner InterruptedException - file: " + resourceFile.getFullPath(), ICLogConstants.CDT); - } - - boolean retVal = p.getResult(); - - if (!retVal) - org.eclipse.cdt.internal.core.model.Util.log(null, "Failed to index " + resourceFile.getFullPath(), ICLogConstants.CDT); - - if (AbstractIndexer.VERBOSE){ + boolean retVal = parser.parse(); + if (!retVal) - AbstractIndexer.verbose("PARSE FAILED " + resourceFile.getName().toString()); - else - AbstractIndexer.verbose("PARSE SUCCEEDED " + resourceFile.getName().toString()); - } + org.eclipse.cdt.internal.core.model.Util.log(null, "Failed to index " + resourceFile.getFullPath(), ICLogConstants.CDT); + + if (AbstractIndexer.VERBOSE){ + if (!retVal) + AbstractIndexer.verbose("PARSE FAILED " + resourceFile.getName().toString()); + else + AbstractIndexer.verbose("PARSE SUCCEEDED " + resourceFile.getName().toString()); + } + } + catch ( VirtualMachineError vmErr){ + if (vmErr instanceof OutOfMemoryError){ + org.eclipse.cdt.internal.core.model.Util.log(null, "Out Of Memory error: " + vmErr.getMessage() + " on File: " + resourceFile.getName(), ICLogConstants.CDT); + } + } + catch ( Exception ex ){ + if (ex instanceof IOException) + throw (IOException) ex; + } + finally{ + //Release all resources + parser=null; + currentProject = null; + requestor = null; + provider = null; + scanInfo=null; + } } /** * Sets the document types the IIndexer handles. @@ -132,25 +140,4 @@ public class SourceIndexer extends AbstractIndexer { return resourceFile; } - class ParserRunner implements Runnable { - IParser parser; - boolean retVal; - ParserRunner(IParser parser){ - this.parser = parser; - } - /* (non-Javadoc) - * @see java.lang.Runnable#run() - */ - public void run() { - try{ - retVal=parser.parse(); - } - catch (Exception e){ - org.eclipse.cdt.internal.core.model.Util.log(null, "Parser Runner Exception " + resourceFile.getFullPath() + " Message: " + e.getMessage(), ICLogConstants.CDT); - } - } - - boolean getResult(){ return retVal;} - - } } diff --git a/core/org.eclipse.cdt.core/search/ChangeLog b/core/org.eclipse.cdt.core/search/ChangeLog index 30210b06292..4e4dadd37a2 100644 --- a/core/org.eclipse.cdt.core/search/ChangeLog +++ b/core/org.eclipse.cdt.core/search/ChangeLog @@ -1,3 +1,7 @@ +2004-02-13 Bogdan Gheorghe + - Added error handling to MatchLocator.locateMatches to handle possible + parser failures. + 2004-02-06 Bogdan Gheorghe - Modified CSearchPattern.scanforParameters. If no parameters are passed in diff --git a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java index 45dfdd31664..5c49552797d 100644 --- a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java +++ b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java @@ -451,7 +451,22 @@ public class MatchLocator implements ISourceElementRequestor, ICSearchConstants if (VERBOSE) MatchLocator.verbose("*** New Search for path: " + pathString); - parser.parse(); + + try{ + parser.parse(); + } + catch(Exception ex){ + if (VERBOSE){ + ex.printStackTrace(); + } + } + catch(VirtualMachineError vmErr){ + if (VERBOSE){ + MatchLocator.verbose("MatchLocator VM Error: "); + vmErr.printStackTrace(); + } + } + } }