Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Resend: Re: [cdt-patch] Indexer deadlock fixes


Patch can now be applied to both 1.2 and the head.

Bogdan




Bogdan Gheorghe/Ottawa/IBM@IBMCA
Sent by: cdt-patch-admin@xxxxxxxxxxx

10/24/2003 11:17 AM

Please respond to
cdt-patch@xxxxxxxxxxx

To
cdt-patch@xxxxxxxxxxx
cc
Subject
[cdt-patch] Indexer deadlock fixes






Here's a patch to take care of Bugs 45324 (IDE hangs up after running search ) and 44366 (Endless loop in dependency checker). Both problems had to do with WorkspaceLocks:


44366: It was possible to create a deadlock in the dependency calculator when calulating which files to reindex.
Solution: Moved off all depedency caluclations to the Indexer thread, created a new UpdateDependency job


45324: Search would freeze under certain scenarios (caused by another deadlock)

Solution: Modified CSearchOperation to only lock the workspace when tagging resources with markers


AutomationSuite run on Windows and Linux.


Patch should be applied to 1.2 and Head.


Thanks,

Bogdan

[attachment "cdt-core-patch.txt" deleted by Bogdan Gheorghe/Ottawa/IBM] [attachment "cdt-ui-patch.txt" deleted by Bogdan Gheorghe/Ottawa/IBM] [attachment "cdt-managedbuilder-core-patch.txt" deleted by Bogdan Gheorghe/Ottawa/IBM] [attachment "cdt-core-tests-patch.txt" deleted by Bogdan Gheorghe/Ottawa/IBM]

Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/ChangeLog,v
retrieving revision 1.159.2.1
diff -u -r1.159.2.1 ChangeLog
--- ChangeLog	27 Oct 2003 13:25:52 -0000	1.159.2.1
+++ ChangeLog	27 Oct 2003 19:35:48 -0000
@@ -1,3 +1,8 @@
+2003-10-27 Bogdan Gheorghe
+
+	Modified DeltaProcessor.updateDependencies to offload dependency
+	updating to the CDT thread.
+	
 2003-10-27 Hoda Amer
 
 	Fixed bug#44507 outline flickers with CDT1.2 RC0
Index: dependency/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/dependency/ChangeLog,v
retrieving revision 1.5
diff -u -r1.5 ChangeLog
--- dependency/ChangeLog	26 Sep 2003 17:53:31 -0000	1.5
+++ dependency/ChangeLog	27 Oct 2003 19:35:48 -0000
@@ -1,3 +1,6 @@
+2003-10-23 Bogdan Gheorghe
+	- Added UpdateDependency job
+	
 2003-09-25 Bogdan Gheorghe
 	- As a result of folding the dependency service into the indexer
 	  have removed the following files:
Index: dependency/org/eclipse/cdt/internal/core/sourcedependency/UpdateDependency.java
===================================================================
RCS file: dependency/org/eclipse/cdt/internal/core/sourcedependency/UpdateDependency.java
diff -N dependency/org/eclipse/cdt/internal/core/sourcedependency/UpdateDependency.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dependency/org/eclipse/cdt/internal/core/sourcedependency/UpdateDependency.java	27 Oct 2003 19:35:48 -0000
@@ -0,0 +1,101 @@
+/*
+ * Created on Oct 13, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.cdt.internal.core.sourcedependency;
+
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.search.ICSearchConstants;
+import org.eclipse.cdt.core.search.ICSearchScope;
+import org.eclipse.cdt.core.search.SearchEngine;
+import org.eclipse.cdt.internal.core.search.PathCollector;
+import org.eclipse.cdt.internal.core.search.PatternSearchJob;
+import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
+import org.eclipse.cdt.internal.core.search.matching.CSearchPattern;
+import org.eclipse.cdt.internal.core.search.processing.IJob;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+
+/**
+ * @author bgheorgh
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class UpdateDependency implements IJob {
+	PathCollector pathCollector;
+	IResource resource;
+	
+	/**
+	 * @param resource
+	 */
+	public UpdateDependency(IResource resource) {
+		this.resource = resource;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.search.processing.IJob#belongsTo(java.lang.String)
+	 */
+	public boolean belongsTo(String jobFamily) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.search.processing.IJob#cancel()
+	 */
+	public void cancel() {
+		// TODO Auto-generated method stub
+
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.search.processing.IJob#execute(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public boolean execute(IProgressMonitor progress) {		
+		PathCollector pathCollector = new PathCollector();
+			//SubProgressMonitor subMonitor = (progressMonitor == null ) ? null : new SubProgressMonitor( progressMonitor, 5 );
+			ICSearchScope scope = SearchEngine.createWorkspaceScope();
+			CSearchPattern pattern = CSearchPattern.createPattern(resource.getLocation().toOSString(),ICSearchConstants.INCLUDE, ICSearchConstants.REFERENCES,ICSearchConstants.EXACT_MATCH,true);
+			IndexManager indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
+			indexManager.performConcurrentJob( 
+				new PatternSearchJob(
+					(CSearchPattern) pattern,
+					scope,
+					pathCollector,
+					indexManager 
+				),
+				ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
+				null,
+				this );
+					
+		String[] iPath = pathCollector.getPaths();
+		for (int i=0;i<iPath.length; i++){
+			IPath pathToReindex = new Path(iPath[i]);
+			IWorkspaceRoot workRoot = resource.getWorkspace().getRoot();
+			IFile fileToReindex = workRoot.getFile(pathToReindex);
+				
+			if (fileToReindex!=null && fileToReindex.exists() ) {
+//			if (VERBOSE)
+//			 System.out.println("Going to reindex " + fileToReindex.getName());
+			 indexManager.addSource(fileToReindex,fileToReindex.getProject().getProject().getFullPath());
+			}
+		}
+		return false;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.internal.core.search.processing.IJob#isReadyToRun()
+	 */
+	public boolean isReadyToRun() {
+	
+		return true;
+	}
+
+}
Index: index/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/index/ChangeLog,v
retrieving revision 1.24
diff -u -r1.24 ChangeLog
--- index/ChangeLog	1 Oct 2003 22:15:34 -0000	1.24
+++ index/ChangeLog	27 Oct 2003 19:35:48 -0000
@@ -1,3 +1,8 @@
+2003-10-22 Bogdan Gheorghe
+	
+	Added updateDependencies() to the IndexManager to request
+	a new UpdateDependency job.
+	
 2003-10-01 Bogdan Gheorghe
 	- Modified BlockIndexOutput.addInclude to properly flush an
 	include block once it's full.
Index: index/org/eclipse/cdt/internal/core/Util.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/Util.java,v
retrieving revision 1.2
diff -u -r1.2 Util.java
--- index/org/eclipse/cdt/internal/core/Util.java	20 Aug 2003 20:53:50 -0000	1.2
+++ index/org/eclipse/cdt/internal/core/Util.java	27 Oct 2003 19:35:48 -0000
@@ -21,6 +21,7 @@
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
+import org.eclipse.cdt.internal.core.model.CModelManager;
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.IPath;
@@ -359,6 +360,37 @@
 		for (int i = 0, length = exclusionPatterns.length; i < length; i++)
 			if (CharOperation.pathMatch(exclusionPatterns[i], path, true, '/'))
 				return true;
+		return false;
+	}
+	/**
+	 * @param string
+	 * @return
+	 */
+	public static boolean isCCFileName(String fileName) {
+		String[] sourceExtensions = CModelManager.sourceExtensions;
+		String[] headerExtensions = CModelManager.headerExtensions;
+		
+		int dot =fileName.lastIndexOf(".");
+		
+		//No extension, give benefit of doubt
+		if (dot == -1)
+		 return true;
+		 
+	    //Extract extension
+		String extension = "";
+	    if (dot + 1 <= fileName.length())
+	    	extension = fileName.substring(dot + 1);
+	    
+	    for (int i=0; i<sourceExtensions.length; i++){	
+	    	if (sourceExtensions[i].equals(extension))
+	    	  return true; 
+	    }
+	    
+	    for (int i=0; i<headerExtensions.length; i++){
+			if (headerExtensions[i].equals(extension))
+			 return true; 
+	    }
+	    
 		return false;
 	}	
 		
Index: index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java,v
retrieving revision 1.6
diff -u -r1.6 IndexAllProject.java
--- index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java	26 Sep 2003 17:53:31 -0000	1.6
+++ index/org/eclipse/cdt/internal/core/search/indexing/IndexAllProject.java	27 Oct 2003 19:35:48 -0000
@@ -97,15 +97,14 @@
 									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();
 											if (resource.getLocation() != null && (patterns == null || !Util.isExcluded(resource, patterns))) {
 												String name = new IFileDocument((IFile) resource).getName();
 												indexedFileNames.put(name, resource);
 											}
-										//}
-										//	return false;
+										}
+										return false;
 			
 										case IResource.FOLDER :
 												if (patterns != null && Util.isExcluded(proxy.requestResource(), patterns))
Index: index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java,v
retrieving revision 1.8
diff -u -r1.8 IndexManager.java
--- index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java	26 Sep 2003 17:53:31 -0000	1.8
+++ index/org/eclipse/cdt/internal/core/search/indexing/IndexManager.java	27 Oct 2003 19:35:48 -0000
@@ -31,8 +31,10 @@
 import org.eclipse.cdt.internal.core.search.SimpleLookupTable;
 import org.eclipse.cdt.internal.core.search.processing.IJob;
 import org.eclipse.cdt.internal.core.search.processing.JobManager;
+import org.eclipse.cdt.internal.core.sourcedependency.UpdateDependency;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspace;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IPath;
@@ -103,7 +105,6 @@
 	 * Note: the actual operation is performed in background
 	 */
 	public void addSource(IFile resource, IPath indexedContainer){
-	
 		if (CCorePlugin.getDefault() == null) return;	
 		AddCompilationUnitToIndex job = new AddCompilationUnitToIndex(resource, indexedContainer, this);
 		if (this.awaitingJobsCount() < MAX_FILES_IN_MEMORY) {
@@ -111,6 +112,13 @@
 			if (!job.initializeContents()) return;
 		}
 		request(job);
+	}
+	
+	public void updateDependencies(IResource resource){
+		if (CCorePlugin.getDefault() == null) return;	
+			UpdateDependency job = new UpdateDependency(resource);
+		
+			request(job);
 	}
 	
 	String computeIndexName(IPath path) {
Index: model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java,v
retrieving revision 1.17
diff -u -r1.17 DeltaProcessor.java
--- model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java	1 Oct 2003 22:15:34 -0000	1.17
+++ model/org/eclipse/cdt/internal/core/model/DeltaProcessor.java	27 Oct 2003 19:35:48 -0000
@@ -5,7 +5,6 @@
  * All Rights Reserved.
  */
 
-import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.model.CModelException;
 import org.eclipse.cdt.core.model.CoreModel;
 import org.eclipse.cdt.core.model.IArchiveContainer;
@@ -15,20 +14,12 @@
 import org.eclipse.cdt.core.model.ICModel;
 import org.eclipse.cdt.core.model.ICProject;
 import org.eclipse.cdt.core.model.IParent;
-import org.eclipse.cdt.core.search.ICSearchConstants;
-import org.eclipse.cdt.core.search.ICSearchScope;
-import org.eclipse.cdt.core.search.SearchEngine;
-import org.eclipse.cdt.internal.core.search.PathCollector;
-import org.eclipse.cdt.internal.core.search.PatternSearchJob;
 import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
-import org.eclipse.cdt.internal.core.search.matching.CSearchPattern;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
 
 /**
  * This class is used by <code>CModelManager</code> to convert
@@ -511,35 +502,8 @@
 		String fileExtension = resource.getFileExtension();
 		
 		if ((fileExtension != null) &&
-			(isValidHeader(fileExtension)))
-		{
-			PathCollector pathCollector = new PathCollector();
-			//SubProgressMonitor subMonitor = (progressMonitor == null ) ? null : new SubProgressMonitor( progressMonitor, 5 );
-			ICSearchScope scope = SearchEngine.createWorkspaceScope();
-			CSearchPattern pattern = CSearchPattern.createPattern(resource.getLocation().toOSString(),ICSearchConstants.INCLUDE, ICSearchConstants.REFERENCES,ICSearchConstants.EXACT_MATCH,true);
-			IndexManager indexManager = CCorePlugin.getDefault().getCoreModel().getIndexManager();
-			indexManager.performConcurrentJob( 
-				new PatternSearchJob(
-					(CSearchPattern) pattern,
-					scope,
-					pathCollector,
-					indexManager 
-				),
-				ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
-				null );
-				
-			String[] iPath = pathCollector.getPaths();
-			for (int i=0;i<iPath.length; i++){
-				IPath pathToReindex = new Path(iPath[i]);
-				IWorkspaceRoot workRoot = element.getCProject().getProject().getWorkspace().getRoot();
-				IFile fileToReindex = workRoot.getFile(pathToReindex);
-				
-				if (fileToReindex!=null && fileToReindex.exists() ) {
-					if (VERBOSE)
-					 System.out.println("Going to reindex " + fileToReindex.getName());
-					this.indexManager.addSource(fileToReindex,fileToReindex.getProject().getProject().getFullPath());
-				}
-			}
+			(isValidHeader(fileExtension))){
+			indexManager.updateDependencies(resource);
 		}
 	}	
 	
Index: search/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/search/ChangeLog,v
retrieving revision 1.37.2.1
diff -u -r1.37.2.1 ChangeLog
--- search/ChangeLog	9 Oct 2003 17:46:54 -0000	1.37.2.1
+++ search/ChangeLog	27 Oct 2003 19:35:49 -0000
@@ -1,3 +1,20 @@
+2003-10-23 Bogdan Gheorghe
+
+	- Added AcceptMatchOperation to get around Bug 45324. The search
+	  operation is no longer a WorkspaceModifyOperation (which used to
+	  lock the workspace for the duration of search). Instead, we now
+	  lock the workspace only when we tag the resources with markers.
+	  	
+	- Modified SearchEngine : we now receive a list of matches
+	from the search that we pass into the AcceptMatchOperation.
+	
+	- Modified MatchLocator to add matches to passed in list instead
+	  of reporting them right away
+	  
+	- Modified JobManager: -added in jobToIgnore parm to unblock dependency
+	  jobs
+	  
+	  
 2003-10-06 Bogdan Gheorghe
 	- added createCFileSearchScope() to SearchEngine.java to improve
 	  code complete performance
Index: search/org/eclipse/cdt/core/search/SearchEngine.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/search/org/eclipse/cdt/core/search/SearchEngine.java,v
retrieving revision 1.9.2.1
diff -u -r1.9.2.1 SearchEngine.java
--- search/org/eclipse/cdt/core/search/SearchEngine.java	9 Oct 2003 17:46:54 -0000	1.9.2.1
+++ search/org/eclipse/cdt/core/search/SearchEngine.java	27 Oct 2003 19:35:49 -0000
@@ -23,6 +23,7 @@
 import org.eclipse.cdt.internal.core.Util;
 import org.eclipse.cdt.internal.core.model.CModelManager;
 import org.eclipse.cdt.internal.core.model.IWorkingCopy;
+import org.eclipse.cdt.internal.core.search.AcceptMatchOperation;
 import org.eclipse.cdt.internal.core.search.CSearchScope;
 import org.eclipse.cdt.internal.core.search.CWorkspaceScope;
 import org.eclipse.cdt.internal.core.search.PathCollector;
@@ -32,6 +33,7 @@
 import org.eclipse.cdt.internal.core.search.matching.MatchLocator;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
@@ -164,7 +166,7 @@
 		
 		/* search is starting */
 		collector.aboutToStart();
-		
+		ArrayList matches = new ArrayList();
 		try{
 			//initialize progress monitor
 			IProgressMonitor progressMonitor = collector.getProgressMonitor();
@@ -188,7 +190,8 @@
 					indexManager
 				),
 			    ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
-				subMonitor );
+				subMonitor,
+				null );
 			
 			subMonitor = (progressMonitor == null ) ? null : new SubProgressMonitor( progressMonitor, 95 );
 				
@@ -199,9 +202,12 @@
 				throw new OperationCanceledException();
 			
 			//TODO: BOG Filter Working Copies...
-			matchLocator.locateMatches( pathCollector.getPaths(), workspace, this.workingCopies);
+			matchLocator.locateMatches( pathCollector.getPaths(), workspace, this.workingCopies, matches);
 		} finally {
-			collector.done();
+			AcceptMatchOperation acceptMatchOp = new AcceptMatchOperation(collector, matches);
+			try {
+				CCorePlugin.getWorkspace().run(acceptMatchOp,null);
+			} catch (CoreException e) {}
 		}
 	}
 }
Index: search/org/eclipse/cdt/internal/core/search/AcceptMatchOperation.java
===================================================================
RCS file: search/org/eclipse/cdt/internal/core/search/AcceptMatchOperation.java
diff -N search/org/eclipse/cdt/internal/core/search/AcceptMatchOperation.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ search/org/eclipse/cdt/internal/core/search/AcceptMatchOperation.java	27 Oct 2003 19:35:49 -0000
@@ -0,0 +1,48 @@
+/*
+ * Created on Oct 20, 2003
+ *
+ * To change the template for this generated file go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+package org.eclipse.cdt.internal.core.search;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.cdt.core.search.ICSearchResultCollector;
+import org.eclipse.cdt.core.search.IMatch;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author bgheorgh
+ *
+ * To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class AcceptMatchOperation implements IWorkspaceRunnable {
+
+	ICSearchResultCollector collector;
+	ArrayList matches;
+	/**
+	 * @param collector
+	 */
+	public AcceptMatchOperation(ICSearchResultCollector collector, ArrayList matches) {
+		this.collector = collector;
+		this.matches = matches;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.core.resources.IWorkspaceRunnable#run(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void run(IProgressMonitor monitor) throws CoreException {
+		Iterator i = matches.iterator();
+		while (i.hasNext()){
+		  IMatch match = (IMatch) i.next();	
+		  collector.acceptMatch(match); 
+		}
+		collector.done();
+	}
+
+}
Index: search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java,v
retrieving revision 1.36
diff -u -r1.36 MatchLocator.java
--- search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java	1 Oct 2003 21:33:17 -0000	1.36
+++ search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java	27 Oct 2003 19:35:49 -0000
@@ -18,6 +18,7 @@
 import java.io.FileReader;
 import java.io.InputStreamReader;
 import java.io.Reader;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -97,6 +98,8 @@
  */
 public class MatchLocator implements ISourceElementRequestor, ICSearchConstants {
 
+
+	ArrayList matchStorage;
 	
 	public static boolean VERBOSE = false;
 	/**
@@ -328,8 +331,9 @@
 		}
 	}
 		
-
-	public void locateMatches( String [] paths, IWorkspace workspace, IWorkingCopy[] workingCopies ){
+   
+	public void locateMatches( String [] paths, IWorkspace workspace, IWorkingCopy[] workingCopies,ArrayList matches ){
+		matchStorage = matches;
 		workspaceRoot = (workspace != null) ? workspace.getRoot() : null;
 		
 		HashMap wcPaths = new HashMap();
@@ -495,7 +499,9 @@
 				match = resultCollector.createMatch( currentPath, offset, end, object );
 			}
 			if( match != null ){
-				resultCollector.acceptMatch( match );
+				//Save till later
+				//resultCollector.acceptMatch( match );
+				matchStorage.add(match);
 			}
 		
 		} catch (CoreException e) {
Index: search/org/eclipse/cdt/internal/core/search/processing/JobManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/processing/JobManager.java,v
retrieving revision 1.5
diff -u -r1.5 JobManager.java
--- search/org/eclipse/cdt/internal/core/search/processing/JobManager.java	1 Oct 2003 13:33:33 -0000	1.5
+++ search/org/eclipse/cdt/internal/core/search/processing/JobManager.java	27 Oct 2003 19:35:49 -0000
@@ -188,8 +188,9 @@
 	public boolean performConcurrentJob(
 		IJob searchJob,
 		int waitingPolicy,
-		IProgressMonitor progress) {
-
+		IProgressMonitor progress, 
+		IJob jobToIgnore) {
+			
 		if (VERBOSE)
 			JobManager.verbose("STARTING  concurrent job - " + searchJob); //$NON-NLS-1$
 		if (!searchJob.isReadyToRun()) {
@@ -250,7 +251,8 @@
 							}
 							this.awaitingClients++;
 						}
-						while ((awaitingWork = awaitingJobsCount()) > 0) {
+						while (((awaitingWork = awaitingJobsCount()) > 0)
+							    && (!jobShouldBeIgnored(jobToIgnore))) {
 							if (subProgress != null && subProgress.isCanceled())
 								throw new OperationCanceledException();
 							currentJob = currentJob();
@@ -295,6 +297,20 @@
 		return status;
 	}
 	
+	/**
+	 * @param jobToIgnore
+	 * @return
+	 */
+	private boolean jobShouldBeIgnored(IJob jobToIgnore) {
+		if (jobToIgnore == null)
+			return false;
+		
+		if (currentJob() == jobToIgnore)
+			return true;
+		
+		return false;
+	}
+
 	public abstract String processName();
 	
 	public synchronized void request(IJob job) {
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.managedbuilder.core/ChangeLog,v
retrieving revision 1.13.2.1
diff -u -r1.13.2.1 ChangeLog
--- ChangeLog	7 Oct 2003 13:29:41 -0000	1.13.2.1
+++ ChangeLog	27 Oct 2003 19:36:27 -0000
@@ -1,3 +1,6 @@
+2003-10-23 Bogdan Gheorghe
+	Updated the indexManager.perfomConcurrentJob call in MakefileGenerator
+	
 2003-10-03 Sean Evoy
 	Fix for critical bug 44134. 
 	
Index: src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java,v
retrieving revision 1.9.2.1
diff -u -r1.9.2.1 MakefileGenerator.java
--- src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java	7 Oct 2003 13:29:41 -0000	1.9.2.1
+++ src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java	27 Oct 2003 19:36:27 -0000
@@ -161,7 +161,7 @@
 					pathCollector, 
 					indexManager),
 				ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
-				null);
+				null, null);
 			
 			// We will get back an array of resource names relative to the workspace
 			String[] deps = pathCollector.getPaths();
@@ -341,7 +341,7 @@
 					// ASk the dep generator to find all the deps for this resource
 					ArrayList dependencies = new ArrayList();
 					try {
-						indexManager.performConcurrentJob(new DependencyQueryJob(project, (IFile)resource, indexManager, dependencies), ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, null);
+						indexManager.performConcurrentJob(new DependencyQueryJob(project, (IFile)resource, indexManager, dependencies), ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, null, null);
 					} catch (Exception e) {
 						continue;
 					}
Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/ChangeLog,v
retrieving revision 1.203.2.2
diff -u -r1.203.2.2 ChangeLog
--- ChangeLog	27 Oct 2003 13:26:10 -0000	1.203.2.2
+++ ChangeLog	27 Oct 2003 19:36:42 -0000
@@ -1,3 +1,7 @@
+2003-10-27 Bogdan Gheorghe
+	- Modified CCompletionProcessor.java to use new performConcurrentJob
+	- Modified CSearchOperation - no longer a WorkspaceModifyOperation (see Bug 45324)
+	
 2003-10-27 Hoda Amer
 
 	Fixed bug#44507 outline flickers with CDT1.2 RC0
Index: src/org/eclipse/cdt/internal/ui/search/CSearchOperation.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchOperation.java,v
retrieving revision 1.8
diff -u -r1.8 CSearchOperation.java
--- src/org/eclipse/cdt/internal/ui/search/CSearchOperation.java	22 Sep 2003 18:38:30 -0000	1.8
+++ src/org/eclipse/cdt/internal/ui/search/CSearchOperation.java	27 Oct 2003 19:36:42 -0000
@@ -27,6 +27,7 @@
 import org.eclipse.core.resources.IWorkspace;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.ui.actions.WorkspaceModifyOperation;
 
@@ -36,7 +37,7 @@
  * To change the template for this generated type comment go to
  * Window>Preferences>Java>Code Generation>Code and Comments
  */
-public class CSearchOperation extends WorkspaceModifyOperation implements ICSearchConstants{
+public class CSearchOperation implements IRunnableWithProgress,ICSearchConstants{
 	public CSearchOperation(IWorkspace workspace, String pattern, boolean caseSensitive, List searchFor, LimitTo limitTo, ICSearchScope scope, String scopeDescription, CSearchResultCollector collector) {
 		this( workspace, limitTo, scope, scopeDescription, collector );
 		_stringPattern = pattern;
@@ -56,8 +57,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.ui.actions.WorkspaceModifyOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
 	 */
-	protected void execute(IProgressMonitor monitor)
-		throws CoreException, InvocationTargetException, InterruptedException 
+	public void run(IProgressMonitor monitor)throws InvocationTargetException
 	{
 		_collector.setProgressMonitor( monitor );	
 		
@@ -79,6 +79,8 @@
 		}
 		
 		engine.search( _workspace, pattern, _scope, _collector, false );
+	
+		
 	}
 	
 	/**
@@ -146,6 +148,7 @@
 	private boolean					_caseSensitive;
 	private LimitTo					_limitTo;
 	private List					_searchFor;
+
 
 		
 }
Index: src/org/eclipse/cdt/internal/ui/search/CSearchResultCollector.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/search/CSearchResultCollector.java,v
retrieving revision 1.11
diff -u -r1.11 CSearchResultCollector.java
--- src/org/eclipse/cdt/internal/ui/search/CSearchResultCollector.java	25 Sep 2003 19:51:42 -0000	1.11
+++ src/org/eclipse/cdt/internal/ui/search/CSearchResultCollector.java	27 Oct 2003 19:36:42 -0000
@@ -54,6 +54,7 @@
 		_matchCount = 0;
 		
 		_view = SearchUI.getSearchResultView();
+	
 		
 		CSearchResultLabelProvider labelProvider = new CSearchResultLabelProvider();
 		labelProvider.setOrder( CSearchResultLabelProvider.SHOW_PATH );
Index: src/org/eclipse/cdt/internal/ui/text/CCompletionProcessor.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/CCompletionProcessor.java,v
retrieving revision 1.15.2.1
diff -u -r1.15.2.1 CCompletionProcessor.java
--- src/org/eclipse/cdt/internal/ui/text/CCompletionProcessor.java	9 Oct 2003 17:46:59 -0000	1.15.2.1
+++ src/org/eclipse/cdt/internal/ui/text/CCompletionProcessor.java	27 Oct 2003 19:36:42 -0000
@@ -513,7 +513,7 @@
 				//Get file's dependencies
 				try {
 					IndexManager indexMan = CCorePlugin.getDefault().getCoreModel().getIndexManager();
-					indexMan.performConcurrentJob(new DependencyQueryJob(project, (IFile)actualFile, indexMan, dependencies), ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, null);
+					indexMan.performConcurrentJob(new DependencyQueryJob(project, (IFile)actualFile, indexMan, dependencies), ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, null, null);
 				} catch (Exception e) {
 				}
 			}
Index: indexer/org/eclipse/cdt/core/indexer/tests/DependencyTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/indexer/org/eclipse/cdt/core/indexer/tests/DependencyTests.java,v
retrieving revision 1.1
diff -u -r1.1 DependencyTests.java
--- indexer/org/eclipse/cdt/core/indexer/tests/DependencyTests.java	26 Sep 2003 17:53:41 -0000	1.1
+++ indexer/org/eclipse/cdt/core/indexer/tests/DependencyTests.java	27 Oct 2003 19:36:04 -0000
@@ -15,7 +15,6 @@
 import java.util.Iterator;
 import java.util.Set;
 
-import junit.extensions.TestDecorator;
 import junit.framework.Test;
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
@@ -143,7 +142,7 @@
    String[] depTest2Model = {File.separator + "DepTestProject" + File.separator + "d.h", File.separator + "DepTestProject" + File.separator + "DepTest2.h"};
 	
    ArrayList includes = new ArrayList();
-   indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest,indexManager,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null);
+   indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest,indexManager,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null,null);
 
    String[] depTestModelLocal = convertToLocalPath(depTestModel);
    String[] depTestIncludes = new String[includes.size()];
@@ -166,7 +165,7 @@
    }
 	
    ArrayList includes2 = new ArrayList();
-   indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest2,indexManager,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null);
+   indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest2,indexManager,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null,null);
    
    String[] depTest2ModelLocal = convertToLocalPath(depTest2Model);
    String[] depTest2Includes = new String[includes2.size()];
@@ -345,7 +344,7 @@
 	 String[] preDepTestModel = {File.separator + "DepTestProject" + File.separator + "DepTest.h", File.separator + "DepTestProject" + File.separator + "Inc1.h", File.separator + "DepTestProject" + File.separator + "a.h", File.separator + "DepTestProject" + File.separator + "c.h", File.separator + "DepTestProject" + File.separator + "d.h"};
 	
 	 ArrayList includes = new ArrayList();
-	 indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTestC,indexManager,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null);
+	 indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTestC,indexManager,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
 
 	 String[] preDepTestModelLocal = convertToLocalPath(preDepTestModel);
 	 String[] preDepTestIncludes = new String[includes.size()];
@@ -374,7 +373,7 @@
 
 	 testProject.refreshLocal(IResource.DEPTH_INFINITE,null);
 	
-	 indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTestC,indexManager,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null);
+	 indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTestC,indexManager,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
 	
 	
 	 String[] postDepTestModelLocal = convertToLocalPath(postDepTestModel);
@@ -412,7 +411,7 @@
 	 String[] preDepTestModel = {File.separator + "DepTestProject" + File.separator + "DepTest3.h", File.separator + "DepTestProject" + File.separator + "a.h", File.separator + "DepTestProject" + File.separator + "c.h"};
 	
 	 ArrayList includes = new ArrayList();
-	 indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest3C,indexManager,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null);
+	 indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest3C,indexManager,includes),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
 
 	 String[] preDepTestModelLocal = convertToLocalPath(preDepTestModel);
 	 String[] preDepTestIncludes = new String[includes.size()];
@@ -441,7 +440,7 @@
 
 	 testProject.refreshLocal(IResource.DEPTH_INFINITE,null);
 	
-	 indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest3C,indexManager,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null);
+	 indexManager.performConcurrentJob(new DependencyQueryJob(testProject,depTest3C,indexManager,includes2),ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,null, null);
 	
 	
 	 String[] postDepTestModelLocal = convertToLocalPath(postDepTestModel);
@@ -583,7 +582,7 @@
 			   indexManager 
 		   ),
 		   ICSearchConstants.WAIT_UNTIL_READY_TO_SEARCH,
-		   null );
+		   null, null );
    }
 	
    private void editCode(IFile tempFile, String beforeString, String afterString) throws IOException, CoreException, InterruptedException{
Index: model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java,v
retrieving revision 1.3
diff -u -r1.3 WorkingCopyTests.java
--- model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java	10 Sep 2003 14:26:04 -0000	1.3
+++ model/org/eclipse/cdt/core/model/tests/WorkingCopyTests.java	27 Oct 2003 19:36:05 -0000
@@ -123,6 +123,8 @@
 		
 		// DestroyWorkingCopy
 		wc.destroy();
-		assertFalse(wc.exists());		
+		assertFalse(wc.exists());	
+		
+		Thread.sleep(1000);	
 	}
 }
Index: search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java,v
retrieving revision 1.10
diff -u -r1.10 BaseSearchTest.java
--- search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java	23 Sep 2003 15:17:03 -0000	1.10
+++ search/org/eclipse/cdt/core/search/tests/BaseSearchTest.java	27 Oct 2003 19:36:05 -0000
@@ -24,7 +24,6 @@
 import org.eclipse.cdt.core.search.ICSearchResultCollector;
 import org.eclipse.cdt.core.search.ICSearchScope;
 import org.eclipse.cdt.core.search.SearchEngine;
-import org.eclipse.cdt.internal.core.search.indexing.IndexManager;
 import org.eclipse.cdt.internal.ui.search.CSearchResultCollector;
 import org.eclipse.cdt.testplugin.FileManager;
 import org.eclipse.core.internal.resources.ResourceException;
Index: search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java,v
retrieving revision 1.18
diff -u -r1.18 OtherPatternTests.java
--- search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java	1 Oct 2003 19:55:04 -0000	1.18
+++ search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java	27 Oct 2003 19:36:05 -0000
@@ -13,19 +13,23 @@
  */
 package org.eclipse.cdt.core.search.tests;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.eclipse.cdt.core.CCorePlugin;
 import org.eclipse.cdt.core.search.BasicSearchMatch;
 import org.eclipse.cdt.core.search.ICSearchPattern;
 import org.eclipse.cdt.core.search.IMatch;
 import org.eclipse.cdt.core.search.SearchEngine;
 import org.eclipse.cdt.internal.core.CharOperation;
+import org.eclipse.cdt.internal.core.search.AcceptMatchOperation;
 import org.eclipse.cdt.internal.core.search.matching.FieldDeclarationPattern;
 import org.eclipse.cdt.internal.core.search.matching.MatchLocator;
 import org.eclipse.cdt.internal.core.search.matching.NamespaceDeclarationPattern;
 import org.eclipse.cdt.internal.core.search.matching.OrPattern;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.Path;
 
 /**
@@ -322,9 +326,20 @@
 		resultCollector.setProgressMonitor( monitor );
 		
 		resultCollector.aboutToStart();
-		MatchLocator matchLocator = new MatchLocator( pattern, resultCollector, scope, monitor );		
-		matchLocator.locateMatches( new String [] { path }, workspace, null );
-		resultCollector.done();
+
+		ArrayList matchesList = new ArrayList();
+		MatchLocator matchLocator = new MatchLocator( pattern, resultCollector, scope, monitor );
+		matchLocator.locateMatches( new String [] { path }, workspace, null, matchesList);
+		
+		AcceptMatchOperation acceptMatchOp = new AcceptMatchOperation(resultCollector, matchesList);
+		try {
+			CCorePlugin.getWorkspace().run(acceptMatchOp,null);
+		} catch (CoreException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		//
+		//resultCollector.done();
 		
 		Set matches = resultCollector.getSearchResults();
 		assertEquals( matches.size(), 4 );

Back to the top