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:
parent
3f2a1ba9ff
commit
39a6ce2544
9 changed files with 105 additions and 62 deletions
|
@ -1,16 +1,27 @@
|
|||
2004-02-09 Bogdan Gheorghe
|
||||
2004-02-13 Bogdan Gheorghe
|
||||
PR 51232
|
||||
|
||||
- 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)
|
||||
- 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
|
||||
|
||||
- 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
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -125,8 +125,7 @@ public class IndexAllProject extends IndexRequest {
|
|||
if (isCancelled) return false;
|
||||
switch(proxy.getType()) {
|
||||
case IResource.FILE :
|
||||
// TODO: BOG Put the file name checking back
|
||||
//if (Util.isCCFileName(proxy.getName())) {
|
||||
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;
|
||||
|
|
|
@ -97,18 +97,8 @@ 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();
|
||||
boolean retVal = parser.parse();
|
||||
|
||||
if (!retVal)
|
||||
org.eclipse.cdt.internal.core.model.Util.log(null, "Failed to index " + resourceFile.getFullPath(), ICLogConstants.CDT);
|
||||
|
@ -120,6 +110,24 @@ public class SourceIndexer extends AbstractIndexer {
|
|||
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;}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -451,8 +451,23 @@ public class MatchLocator implements ISourceElementRequestor, ICSearchConstants
|
|||
if (VERBOSE)
|
||||
MatchLocator.verbose("*** New Search for path: " + pathString);
|
||||
|
||||
|
||||
try{
|
||||
parser.parse();
|
||||
}
|
||||
catch(Exception ex){
|
||||
if (VERBOSE){
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
catch(VirtualMachineError vmErr){
|
||||
if (VERBOSE){
|
||||
MatchLocator.verbose("MatchLocator VM Error: ");
|
||||
vmErr.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
protected void report( ISourceElementCallbackDelegate node, int accuracyLevel ){
|
||||
|
|
Loading…
Add table
Reference in a new issue