summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Andreas Gampe <agampe@google.com> 2017-09-25 10:55:12 -0700
committer Andreas Gampe <agampe@google.com> 2017-09-25 10:55:12 -0700
commitdb67af1122ca3e3cbae72c3e03c6f94a19db645d (patch)
tree52a1c77347913fabe0a9616ed255e7fbabff6821
parent2fe2d41c0e988dbb2bdd5bb91c9a21ffee8fee20 (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.java40
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.
+ }
+ }
+ }
}