From 482f105796736a8d7d4ac4e616e732ff3360963b Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 18 Mar 2016 12:47:30 +0300 Subject: [PATCH] ignore idle application pooled thread --- .../com/intellij/testFramework/ThreadTracker.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/platform/testFramework/src/com/intellij/testFramework/ThreadTracker.java b/platform/testFramework/src/com/intellij/testFramework/ThreadTracker.java index 7eee8d6839ee..298338d8e58b 100644 --- a/platform/testFramework/src/com/intellij/testFramework/ThreadTracker.java +++ b/platform/testFramework/src/com/intellij/testFramework/ThreadTracker.java @@ -138,6 +138,10 @@ public class ThreadTracker { continue; // ignore threads with empty stack traces for now. Seems they are zombies unwilling to die. } + if (isIdleApplicationPoolThread(thread, stackTrace)) { + continue; + } + @SuppressWarnings("NonConstantStringShouldBeStringBuffer") String trace = "Thread leaked: " + thread + "; " + thread.getState() + " (" + thread.isAlive() + ")\n--- its stacktrace:\n"; for (final StackTraceElement stackTraceElement : stackTrace) { @@ -152,6 +156,16 @@ public class ThreadTracker { } } + // true if somebody started new thread via "executeInPooledThread()" and then the thread is waiting for next task + private static boolean isIdleApplicationPoolThread(Thread thread, StackTraceElement[] stackTrace) { + if (!thread.getName().startsWith("ApplicationImpl pooled thread ")) return false; + boolean insideTPEgetTask = Arrays.stream(stackTrace) + .anyMatch(element -> element.getMethodName().equals("getTask") + && element.getClassName().equals("java.util.concurrent.ThreadPoolExecutor")); + + return insideTPEgetTask; + } + public static void awaitThreadTerminationWithParentParentGroup(@NotNull final String grandThreadGroup, int timeout, @NotNull TimeUnit unit) { long start = System.currentTimeMillis(); while (System.currentTimeMillis() < start + unit.toMillis(timeout)) {