1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

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
This commit is contained in:
John Camelon 2004-02-15 23:30:53 +00:00
parent 3f2a1ba9ff
commit 39a6ce2544
9 changed files with 105 additions and 62 deletions

View file

@ -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

View file

@ -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();

View file

@ -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;
}

View file

@ -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();

View file

@ -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;

View file

@ -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;

View file

@ -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 <code>IIndexer</code> 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;}
}
}

View file

@ -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

View file

@ -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();
}
}
}
}