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:
parent
a75ebb1cf4
commit
ccc1cbe5ce
4 changed files with 60 additions and 25 deletions
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue