1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

Resume indexer after closing IDE while indexing, bug 248849.

This commit is contained in:
Markus Schorn 2009-07-13 11:20:44 +00:00
parent a75ebb1cf4
commit ccc1cbe5ce
4 changed files with 60 additions and 25 deletions

View file

@ -78,6 +78,11 @@ public interface IIndexFragment {
*/
public static final String PROPERTY_FRAGMENT_FORMAT_VERSION= "org.eclipse.cdt.internal.core.index.fragment.format.version"; //$NON-NLS-1$
/**
* Property key for storing whether indexer has to resume or not.
*/
public static final String PROPERTY_RESUME_INDEXER= "org.eclipse.cdt.internal.core.index.resume"; //$NON-NLS-1$
/**
* Returns the file for the given location and linkage.
* May return <code>null</code>, if no such file exists.

View file

@ -43,6 +43,7 @@ import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.internal.core.dom.AbstractCodeReaderFactory;
import org.eclipse.cdt.internal.core.dom.IIncludeFileResolutionHeuristics;
import org.eclipse.cdt.internal.core.index.IIndexFragment;
import org.eclipse.cdt.internal.core.index.IIndexFragmentFile;
import org.eclipse.cdt.internal.core.index.IWritableIndex;
import org.eclipse.cdt.internal.core.index.IndexBasedCodeReaderFactory;
@ -306,6 +307,8 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
final ArrayList<IIndexFragmentFile> ifilesToRemove= new ArrayList<IIndexFragmentFile>();
extractFiles(files, ifilesToRemove, monitor);
setResume(true);
// remove files from index
removeFilesInIndex(fFilesToRemove, ifilesToRemove, monitor);
@ -313,6 +316,9 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
for (int linkageID : getLinkagesToParse()) {
parseLinkage(linkageID, files, monitor);
}
if (!monitor.isCanceled()) {
setResume(false);
}
} finally {
fIndex.flush();
}
@ -323,6 +329,15 @@ public abstract class AbstractIndexerTask extends PDOMWriter {
}
}
private void setResume(boolean value) throws InterruptedException, CoreException {
fIndex.acquireWriteLock(1);
try {
fIndex.getWritableFragment().setProperty(IIndexFragment.PROPERTY_RESUME_INDEXER, String.valueOf(value));
} finally {
fIndex.releaseWriteLock(1);
}
}
private void extractFiles(Map<Integer, List<Object>> files, List<IIndexFragmentFile> iFilesToRemove,
IProgressMonitor monitor) throws CoreException {
final boolean forceAll= (fUpdateFlags & IIndexManager.UPDATE_ALL) != 0;

View file

@ -72,35 +72,37 @@ public class IndexUpdatePolicy {
return fIndexer;
}
public boolean isAutomatic() {
return fKind != MANUAL;
}
public IPDOMIndexerTask handleDelta(ITranslationUnit[] force, ITranslationUnit[] changed, ITranslationUnit[] removed) {
if (isNullIndexer()) {
return null;
}
switch(fKind) {
case IndexUpdatePolicy.MANUAL:
case MANUAL:
return null;
case IndexUpdatePolicy.POST_CHANGE:
case POST_CHANGE:
if (fIndexer != null) {
return fIndexer.createTask(force, changed, removed);
}
break;
}
for (int i = 0; i < removed.length; i++) {
ITranslationUnit tu = removed[i];
for (ITranslationUnit tu : removed) {
fForce.remove(tu);
fTimestamp.remove(tu);
fRemoved.add(tu);
}
for (int i = 0; i < force.length; i++) {
ITranslationUnit tu = force[i];
for (ITranslationUnit tu : force) {
fForce.add(tu);
fTimestamp.remove(tu);
fRemoved.remove(tu);
}
for (int i = 0; i < changed.length; i++) {
ITranslationUnit tu = changed[i];
for (ITranslationUnit element : changed) {
ITranslationUnit tu = element;
if (!fForce.contains(tu)) {
fTimestamp.add(tu);
}

View file

@ -236,8 +236,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
try {
ICProject[] projects= model.getCModel().getCProjects();
for (int i = 0; i < projects.length; i++) {
addProject(projects[i]);
for (ICProject project : projects) {
addProject(project);
}
} catch (CModelException e) {
CCorePlugin.log(e);
@ -517,7 +517,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
return null;
}
private void createIndexer(ICProject project, IProgressMonitor pm) {
private void createIndexer(ICProject project, IProgressMonitor pm) throws InterruptedException {
assert !Thread.holdsLock(fProjectToPDOM);
IProject prj= project.getProject();
try {
@ -540,13 +540,24 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
if (!rebuild) {
registerIndexer(project, indexer);
IPDOMIndexerTask task= createPolicy(project).createTask();
IPDOMIndexerTask task= policy.createTask();
if (task != null) {
enqueue(task);
}
else {
} else {
enqueue(new TriggerNotificationTask(this, pdom));
}
if (policy.isAutomatic()) {
boolean resume= false;
pdom.acquireReadLock();
try {
resume= "true".equals(pdom.getProperty(IIndexFragment.PROPERTY_RESUME_INDEXER)); //$NON-NLS-1$
} finally {
pdom.releaseReadLock();
}
if (resume) {
enqueue(new PDOMUpdateTask(indexer, IIndexManager.UPDATE_CHECK_TIMESTAMPS));
}
}
return;
}
}
@ -612,8 +623,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
}
synchronized (fTaskQueue) {
int i=0;
for (Iterator<IPDOMIndexerTask> it = fTaskQueue.iterator(); it.hasNext();) {
final IPDOMIndexerTask task= it.next();
for (IPDOMIndexerTask task : fTaskQueue) {
final IPDOMIndexer ti = task.getIndexer();
if (ti != null && referencing.contains(ti.getProject().getProject())) {
fTaskQueue.add(i, subjob);
@ -695,7 +705,12 @@ public class PDOMManager implements IWritableIndexManager, IListener {
if (project.isOpen() && !postponeSetup(cproject)) {
syncronizeProjectSettings(project, new SubProgressMonitor(monitor, 1));
if (getIndexer(cproject) == null) {
createIndexer(cproject, new SubProgressMonitor(monitor, 99));
try {
createIndexer(cproject, new SubProgressMonitor(monitor, 99));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return Status.CANCEL_STATUS;
}
}
}
return Status.OK_STATUS;
@ -891,8 +906,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
ICProject[] cProjects;
try {
cProjects = CoreModel.getDefault().getCModel().getCProjects();
for (int i = 0; i < cProjects.length; i++) {
ICProject project = cProjects[i];
for (ICProject project : cProjects) {
reindex(project);
}
} catch (CModelException e) {
@ -964,8 +978,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
fIndexerStateEvent.setState(state);
Object[] listeners= fStateListeners.getListeners();
monitor.beginTask(Messages.PDOMManager_notifyTask_message, listeners.length);
for (int i = 0; i < listeners.length; i++) {
final IIndexerStateListener listener = (IIndexerStateListener) listeners[i];
for (Object listener2 : listeners) {
final IIndexerStateListener listener = (IIndexerStateListener) listener2;
SafeRunner.run(new ISafeRunnable(){
public void handleException(Throwable exception) {
CCorePlugin.log(exception);
@ -1003,8 +1017,8 @@ public class PDOMManager implements IWritableIndexManager, IListener {
fIndexChangeEvent.setAffectedProject(finalProject, e);
Object[] listeners= fChangeListeners.getListeners();
monitor.beginTask(Messages.PDOMManager_notifyTask_message, listeners.length);
for (int i = 0; i < listeners.length; i++) {
final IIndexChangeListener listener = (IIndexChangeListener) listeners[i];
for (Object listener2 : listeners) {
final IIndexChangeListener listener = (IIndexChangeListener) listener2;
SafeRunner.run(new ISafeRunnable(){
public void handleException(Throwable exception) {
CCorePlugin.log(exception);
@ -1326,8 +1340,7 @@ public class PDOMManager implements IWritableIndexManager, IListener {
void handlePostBuildEvent() {
assert !Thread.holdsLock(fProjectToPDOM);
synchronized (fUpdatePolicies) {
for (Iterator<IndexUpdatePolicy> i = fUpdatePolicies.values().iterator(); i.hasNext();) {
IndexUpdatePolicy policy= i.next();
for (IndexUpdatePolicy policy : fUpdatePolicies.values()) {
IPDOMIndexerTask task= policy.createTask();
if (task != null) {
enqueue(task);