diff options
author | Markus Keller | 2015-12-07 17:54:11 +0000 |
---|---|---|
committer | Markus Keller | 2015-12-15 19:40:35 +0000 |
commit | fcf41d3b46ba97e9e4d60c5ee97c3384b6432cf6 (patch) | |
tree | 574d572e080eccb534dc68ebf508c00d447f2178 | |
parent | ca8fb243a14b09056e967ca015224e113dbf2acb (diff) | |
download | eclipse.jdt.core-fcf41d3b46ba97e9e4d60c5ee97c3384b6432cf6.tar.gz eclipse.jdt.core-fcf41d3b46ba97e9e4d60c5ee97c3384b6432cf6.tar.xz eclipse.jdt.core-fcf41d3b46ba97e9e4d60c5ee97c3384b6432cf6.zip |
Bug 474045: findSecondaryType blocked by sleeping Indexing Thread
Change-Id: I521382c72333f7035c32007e96f077839e4865d1
Signed-off-by: Markus Keller <markus_keller@ch.ibm.com>
-rw-r--r-- | org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java | 122 | ||||
-rw-r--r-- | org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java | 37 |
2 files changed, 134 insertions, 25 deletions
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java index 56fb0ef421..0cb8f3c4de 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java @@ -21,11 +21,29 @@ *******************************************************************************/ package org.eclipse.jdt.internal.core; -import java.io.*; +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.StringReader; import java.net.URI; import java.text.MessageFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.Map.Entry; +import java.util.Set; +import java.util.WeakHashMap; import java.util.zip.ZipException; import java.util.zip.ZipFile; @@ -33,17 +51,67 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IResourceChangeEvent; +import org.eclipse.core.resources.ISaveContext; +import org.eclipse.core.resources.ISaveParticipant; +import org.eclipse.core.resources.ISavedState; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.IWorkspaceDescription; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.IWorkspaceRunnable; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.resources.WorkspaceJob; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtension; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.ISafeRunnable; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.MultiStatus; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.PerformanceStats; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.Plugin; +import org.eclipse.core.runtime.QualifiedName; +import org.eclipse.core.runtime.SafeRunner; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubMonitor; import org.eclipse.core.runtime.content.IContentTypeManager.ContentTypeChangeEvent; import org.eclipse.core.runtime.content.IContentTypeManager.IContentTypeChangeListener; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.preferences.DefaultScope; import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; import org.eclipse.core.runtime.preferences.IPreferencesService; import org.eclipse.core.runtime.preferences.InstanceScope; -import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent; -import org.eclipse.jdt.core.*; +import org.eclipse.jdt.core.ClasspathContainerInitializer; +import org.eclipse.jdt.core.IAccessRule; +import org.eclipse.jdt.core.IClassFile; +import org.eclipse.jdt.core.IClasspathAttribute; +import org.eclipse.jdt.core.IClasspathContainer; +import org.eclipse.jdt.core.IClasspathEntry; +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.IJavaModel; +import org.eclipse.jdt.core.IJavaModelStatus; +import org.eclipse.jdt.core.IJavaModelStatusConstants; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.IParent; +import org.eclipse.jdt.core.IProblemRequestor; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaConventions; +import org.eclipse.jdt.core.JavaCore; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.WorkingCopyOwner; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.core.compiler.CompilationParticipant; import org.eclipse.jdt.core.compiler.IProblem; @@ -66,14 +134,15 @@ import org.eclipse.jdt.internal.core.search.BasicSearchEngine; import org.eclipse.jdt.internal.core.search.IRestrictedAccessTypeRequestor; import org.eclipse.jdt.internal.core.search.JavaWorkspaceScope; import org.eclipse.jdt.internal.core.search.indexing.IndexManager; +import org.eclipse.jdt.internal.core.search.processing.IJob; import org.eclipse.jdt.internal.core.search.processing.JobManager; import org.eclipse.jdt.internal.core.util.HashtableOfArrayToObject; import org.eclipse.jdt.internal.core.util.LRUCache; +import org.eclipse.jdt.internal.core.util.LRUCache.Stats; import org.eclipse.jdt.internal.core.util.Messages; import org.eclipse.jdt.internal.core.util.Util; import org.eclipse.jdt.internal.core.util.WeakHashSet; import org.eclipse.jdt.internal.core.util.WeakHashSetOfCharArray; -import org.eclipse.jdt.internal.core.util.LRUCache.Stats; import org.eclipse.jdt.internal.formatter.DefaultCodeFormatter; import org.eclipse.osgi.service.debug.DebugOptions; import org.eclipse.osgi.service.debug.DebugOptionsListener; @@ -4557,15 +4626,36 @@ public class JavaModelManager implements ISaveParticipant, IContentTypeChangeLis } // Wait for the end of indexing or a cancel - while (this.indexManager.awaitingJobsCount() > 0) { - if (monitor != null && monitor.isCanceled()) { - return projectInfo.secondaryTypes; - } - try { - Thread.sleep(10); - } catch (InterruptedException e) { - return projectInfo.secondaryTypes; - } + try { + this.indexManager.performConcurrentJob(new IJob() { + @Override + public boolean belongsTo(String jobFamily) { + return true; + } + + @Override + public void cancel() { + // job is cancelled through progress + } + + @Override + public void ensureReadyToRun() { + // always ready + } + + @Override + public boolean execute(IProgressMonitor progress) { + return progress == null || !progress.isCanceled(); + } + + @Override + public String getJobFamily() { + return ""; //$NON-NLS-1$ + } + + }, IJob.WaitUntilReady, monitor); + } catch (OperationCanceledException oce) { + return projectInfo.secondaryTypes; } } diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java index 913f3e702f..8dc74b2600 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SearchableEnvironment.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2011 IBM Corporation and others. + * Copyright (c) 2000, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -28,6 +28,7 @@ import org.eclipse.jdt.internal.core.search.BasicSearchEngine; import org.eclipse.jdt.internal.core.search.IRestrictedAccessConstructorRequestor; import org.eclipse.jdt.internal.core.search.IRestrictedAccessTypeRequestor; import org.eclipse.jdt.internal.core.search.indexing.IndexManager; +import org.eclipse.jdt.internal.core.search.processing.IJob; import org.eclipse.jdt.internal.core.util.Util; /** @@ -589,16 +590,34 @@ public class SearchableEnvironment if (camelCaseMatch) matchRule |= SearchPattern.R_CAMELCASE_MATCH; if (monitor != null) { IndexManager indexManager = JavaModelManager.getIndexManager(); - while (indexManager.awaitingJobsCount() > 0) { - try { - Thread.sleep(50); // indexes are not ready, sleep 50ms... - } catch (InterruptedException e) { - // Do nothing + // Wait for the end of indexing or a cancel + indexManager.performConcurrentJob(new IJob() { + @Override + public boolean belongsTo(String jobFamily) { + return true; } - if (monitor.isCanceled()) { - throw new OperationCanceledException(); + + @Override + public void cancel() { + // job is cancelled through progress } - } + + @Override + public void ensureReadyToRun() { + // always ready + } + + @Override + public boolean execute(IProgressMonitor progress) { + return progress == null || !progress.isCanceled(); + } + + @Override + public String getJobFamily() { + return ""; //$NON-NLS-1$ + } + + }, IJob.WaitUntilReady, monitor); new BasicSearchEngine(this.workingCopies).searchAllConstructorDeclarations( qualification, simpleName, |