diff options
author | 2017-09-25 10:55:12 -0700 | |
---|---|---|
committer | 2017-09-25 10:55:12 -0700 | |
commit | db67af1122ca3e3cbae72c3e03c6f94a19db645d (patch) | |
tree | 52a1c77347913fabe0a9616ed255e7fbabff6821 | |
parent | 2fe2d41c0e988dbb2bdd5bb91c9a21ffee8fee20 (diff) |
ART: More waiting in 063
Wait till the initial reaper thread goes into TIMED_WAITING, in an
effort to make the test more deterministic.
Bug: 2310700
Test: art/test/testrunner/testrunner.py -b --host -t 063
Change-Id: Id4a213a20c21ed0f6a2a73daf1927f7dcf98040d
-rw-r--r-- | test/063-process-manager/src/Main.java | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/test/063-process-manager/src/Main.java b/test/063-process-manager/src/Main.java index 1005b77107..2cfc0d7fc2 100644 --- a/test/063-process-manager/src/Main.java +++ b/test/063-process-manager/src/Main.java @@ -10,7 +10,7 @@ public class Main { ProcessBuilder pb = new ProcessBuilder("sleep", "0"); Process proc = pb.start(); proc.waitFor(); - Thread.sleep(500); // Consider checking for (and waiting on) the reaper state here. + waitForReaperTimedWaiting(true /* reaperMustExist */); } for (int i = 1; i <= 2; i++) { @@ -32,6 +32,11 @@ public class Main { System.out.println("child died"); } + private static boolean isReaperThread(Thread t) { + String name = t.getName(); + return name.indexOf("process reaper") >= 0; + } + static private void checkManager() { Map<Thread, StackTraceElement[]> traces = Thread.getAllStackTraces(); boolean found = false; @@ -39,8 +44,7 @@ public class Main { for (Map.Entry<Thread, StackTraceElement[]> entry : traces.entrySet()) { Thread t = entry.getKey(); - String name = t.getName(); - if (name.indexOf("process reaper") >= 0) { + if (isReaperThread(t)) { Thread.State state = t.getState(); System.out.println("process manager: " + state); if (state != Thread.State.RUNNABLE && state != Thread.State.TIMED_WAITING) { @@ -56,4 +60,34 @@ public class Main { System.out.println("process manager: nonexistent"); } } + + private static void waitForReaperTimedWaiting(boolean reaperMustExist) { + for (;;) { + Map<Thread, StackTraceElement[]> traces = Thread.getAllStackTraces(); + + boolean ok = true; + boolean found = false; + + for (Thread t : traces.keySet()) { + if (isReaperThread(t)) { + found = true; + Thread.State state = t.getState(); + if (state != Thread.State.TIMED_WAITING) { + ok = false; + break; + } + } + } + + if (ok && (!reaperMustExist || found)) { + return; + } + + try { + Thread.sleep(100); + } catch (Exception e) { + // Ignore. + } + } + } } |