mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
set thread name inside the BoundedTaskExecutor pool accordingly for readability
This commit is contained in:
@@ -22,6 +22,7 @@ import com.intellij.ide.util.newProjectWizard.SelectTemplateSettings;
|
||||
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
|
||||
import com.intellij.ide.wizard.Step;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.impl.LaterInvocator;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.projectRoots.ProjectJdkTable;
|
||||
@@ -59,6 +60,42 @@ public abstract class ProjectWizardTestCase<T extends AbstractProjectWizard> ext
|
||||
private Project myCreatedProject;
|
||||
private Sdk myOldDefaultProjectSdk;
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
myOldDefaultProjectSdk = ProjectRootManager.getInstance(myProjectManager.getDefaultProject()).getProjectSdk();
|
||||
Sdk projectSdk = ProjectRootManager.getInstance(getProject()).getProjectSdk();
|
||||
for (final Sdk jdk : ProjectJdkTable.getInstance().getAllJdks()) {
|
||||
if (projectSdk != jdk) {
|
||||
ApplicationManager.getApplication().runWriteAction(() -> ProjectJdkTable.getInstance().removeJdk(jdk));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tearDown() throws Exception {
|
||||
try {
|
||||
if (myWizard != null) {
|
||||
Disposer.dispose(myWizard.getDisposable());
|
||||
myWizard = null;
|
||||
}
|
||||
if (myCreatedProject != null) {
|
||||
myProjectManager.closeProject(myCreatedProject);
|
||||
ApplicationManager.getApplication().runWriteAction(() -> Disposer.dispose(myCreatedProject));
|
||||
myCreatedProject = null;
|
||||
}
|
||||
ApplicationManager.getApplication().runWriteAction(() -> {
|
||||
ProjectRootManager.getInstance(myProjectManager.getDefaultProject()).setProjectSdk(myOldDefaultProjectSdk);
|
||||
});
|
||||
SelectTemplateSettings.getInstance().setLastTemplate(null, null);
|
||||
UIUtil.dispatchAllInvocationEvents(); // let vfs update pass
|
||||
LaterInvocator.dispatchPendingFlushes();
|
||||
}
|
||||
finally {
|
||||
super.tearDown();
|
||||
}
|
||||
}
|
||||
|
||||
protected Project createProjectFromTemplate(@NotNull String group, @Nullable String name, @Nullable Consumer<Step> adjuster) throws IOException {
|
||||
runWizard(group, name, null, adjuster);
|
||||
try {
|
||||
@@ -139,18 +176,6 @@ public abstract class ProjectWizardTestCase<T extends AbstractProjectWizard> ext
|
||||
throw new RuntimeException();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
myOldDefaultProjectSdk = ProjectRootManager.getInstance(myProjectManager.getDefaultProject()).getProjectSdk();
|
||||
Sdk projectSdk = ProjectRootManager.getInstance(getProject()).getProjectSdk();
|
||||
for (final Sdk jdk : ProjectJdkTable.getInstance().getAllJdks()) {
|
||||
if (projectSdk != jdk) {
|
||||
ApplicationManager.getApplication().runWriteAction(() -> ProjectJdkTable.getInstance().removeJdk(jdk));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void configureJdk() {
|
||||
ApplicationManager.getApplication().runWriteAction(() -> {
|
||||
addSdk(new SimpleJavaSdkType().createJdk(DEFAULT_SDK, SystemProperties.getJavaHome()));
|
||||
@@ -165,28 +190,6 @@ public abstract class ProjectWizardTestCase<T extends AbstractProjectWizard> ext
|
||||
ApplicationManager.getApplication().runWriteAction(() -> ProjectJdkTable.getInstance().addJdk(sdk, getTestRootDisposable()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tearDown() throws Exception {
|
||||
try {
|
||||
if (myWizard != null) {
|
||||
Disposer.dispose(myWizard.getDisposable());
|
||||
myWizard = null;
|
||||
}
|
||||
if (myCreatedProject != null) {
|
||||
myProjectManager.closeProject(myCreatedProject);
|
||||
ApplicationManager.getApplication().runWriteAction(() -> Disposer.dispose(myCreatedProject));
|
||||
myCreatedProject = null;
|
||||
}
|
||||
ApplicationManager.getApplication().runWriteAction(() -> {
|
||||
ProjectRootManager.getInstance(myProjectManager.getDefaultProject()).setProjectSdk(myOldDefaultProjectSdk);
|
||||
});
|
||||
SelectTemplateSettings.getInstance().setLastTemplate(null, null);
|
||||
}
|
||||
finally {
|
||||
super.tearDown();
|
||||
}
|
||||
}
|
||||
|
||||
protected Module importModuleFrom(ProjectImportProvider provider, String path) {
|
||||
return importFrom(path, getProject(), null, provider);
|
||||
}
|
||||
|
||||
@@ -75,6 +75,7 @@ import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.psi.stubs.SerializationManagerEx;
|
||||
import com.intellij.util.*;
|
||||
import com.intellij.util.concurrency.AppExecutorUtil;
|
||||
import com.intellij.util.concurrency.BoundedTaskExecutor;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.IntObjectMap;
|
||||
import com.intellij.util.gist.GistManager;
|
||||
@@ -86,6 +87,7 @@ import com.intellij.util.io.IOUtil;
|
||||
import com.intellij.util.io.storage.HeavyProcessLatch;
|
||||
import com.intellij.util.messages.MessageBus;
|
||||
import com.intellij.util.messages.MessageBusConnection;
|
||||
import com.intellij.util.ui.UIUtil;
|
||||
import gnu.trove.THashMap;
|
||||
import gnu.trove.THashSet;
|
||||
import gnu.trove.TIntArrayList;
|
||||
@@ -2455,4 +2457,24 @@ public class FileBasedIndexImpl extends FileBasedIndex implements BaseComponent,
|
||||
new FileOutputStream(corruptionMarker).close();
|
||||
} catch (Throwable ignore) {}
|
||||
}
|
||||
|
||||
@TestOnly
|
||||
public void waitForVfsEventsExecuted(long timeout, @NotNull TimeUnit unit) throws Exception {
|
||||
ApplicationManager.getApplication().assertIsDispatchThread();
|
||||
// wait in the other thread to be able to handle invokeLater() which myChangedFilesCollector.myVfsEventsExecutor issues
|
||||
Future<?> future = ApplicationManager.getApplication().executeOnPooledThread(() ->
|
||||
{
|
||||
try {
|
||||
((BoundedTaskExecutor)myChangedFilesCollector.myVfsEventsExecutor)
|
||||
.waitAllTasksExecuted(timeout, unit);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
while (!future.isDone()) {
|
||||
UIUtil.dispatchAllInvocationEvents();
|
||||
}
|
||||
future.get();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -481,4 +481,16 @@ public class LaterInvocator {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@TestOnly
|
||||
public static void dispatchPendingFlushes() {
|
||||
if (!isDispatchThread()) throw new IllegalStateException("Must call from EDT");
|
||||
|
||||
Semaphore semaphore = new Semaphore();
|
||||
semaphore.down();
|
||||
invokeLaterWithCallback(semaphore::up, ModalityState.any(), Conditions.FALSE, null);
|
||||
while (!semaphore.isUp()) {
|
||||
UIUtil.dispatchAllInvocationEvents();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import com.intellij.openapi.actionSystem.DataProvider;
|
||||
import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.PathManager;
|
||||
import com.intellij.openapi.application.WriteAction;
|
||||
import com.intellij.openapi.application.impl.LaterInvocator;
|
||||
import com.intellij.openapi.command.CommandProcessor;
|
||||
import com.intellij.openapi.command.WriteCommandAction;
|
||||
import com.intellij.openapi.command.impl.DocumentReferenceManagerImpl;
|
||||
@@ -88,6 +89,7 @@ import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import static com.intellij.testFramework.TemporaryDirectoryKt.generateTemporaryPath;
|
||||
|
||||
@@ -520,6 +522,8 @@ public abstract class PlatformTestCase extends UsefulTestCase implements DataPro
|
||||
|
||||
getTempDir().deleteAll();
|
||||
LocalFileSystem.getInstance().refreshIoFiles(myFilesToDelete);
|
||||
LaterInvocator.dispatchPendingFlushes();
|
||||
((FileBasedIndexImpl)FileBasedIndex.getInstance()).waitForVfsEventsExecuted(1, TimeUnit.MINUTES);
|
||||
})
|
||||
.append(() -> {
|
||||
if (!myAssertionsInTestDetected) {
|
||||
|
||||
@@ -143,7 +143,9 @@ public class ThreadTracker {
|
||||
if (isWellKnownOffender(thread)) continue;
|
||||
|
||||
if (!thread.isAlive()) continue;
|
||||
if (thread.getStackTrace().length == 0) {
|
||||
if (thread.getStackTrace().length == 0
|
||||
// give thread a chance to run up to the completion
|
||||
|| thread.getState() == Thread.State.RUNNABLE) {
|
||||
thread.interrupt();
|
||||
if (new WaitFor(10000){
|
||||
@Override
|
||||
|
||||
@@ -91,7 +91,7 @@ public class BoundedTaskExecutor extends AbstractExecutorService {
|
||||
if (task instanceof Callable && task.getClass().getName().equals("java.util.concurrent.Executors$RunnableAdapter")) {
|
||||
task = ObjectUtils.chooseNotNull(ReflectionUtil.getField(task.getClass(), task, Runnable.class, "task"), task);
|
||||
}
|
||||
return extra == null ? task : task == null ? extra : task.getClass() + extra;
|
||||
return extra == null ? task : task.getClass() + extra;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -204,24 +204,35 @@ public class BoundedTaskExecutor extends AbstractExecutorService {
|
||||
myBackendExecutor.execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
// we are back inside backend executor, no need to call .execute() - just run synchronously
|
||||
Runnable task = currentTask.get();
|
||||
do {
|
||||
currentTask.set(task);
|
||||
try {
|
||||
task.run();
|
||||
}
|
||||
catch (Throwable e) {
|
||||
// do not lose queued tasks because of this exception
|
||||
String oldName = Thread.currentThread().getName();
|
||||
boolean sameName = myName.equals(oldName);
|
||||
if (!sameName) {
|
||||
Thread.currentThread().setName(myName);
|
||||
}
|
||||
try {
|
||||
Runnable task = currentTask.get();
|
||||
do {
|
||||
currentTask.set(task);
|
||||
try {
|
||||
LOG.error(e);
|
||||
task.run();
|
||||
}
|
||||
catch (Throwable ignored) {
|
||||
catch (Throwable e) {
|
||||
// do not lose queued tasks because of this exception
|
||||
try {
|
||||
LOG.error(e);
|
||||
}
|
||||
catch (Throwable ignored) {
|
||||
}
|
||||
}
|
||||
task = pollOrGiveUp(status);
|
||||
}
|
||||
while (task != null);
|
||||
}
|
||||
finally {
|
||||
if (!sameName) {
|
||||
Thread.currentThread().setName(oldName);
|
||||
}
|
||||
task = pollOrGiveUp(status);
|
||||
}
|
||||
while (task != null);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user