diff options
author | 2017-01-12 20:51:02 -0800 | |
---|---|---|
committer | 2017-01-12 20:53:53 -0800 | |
commit | 966de9eee1c5a8da95988669f225531b2509e005 (patch) | |
tree | d22a55a2c1bc533e97dc8facd9706c6cf326ec01 | |
parent | b50cf03f66cf111b8122eabcb2cc8b3d55f9b611 (diff) |
ART: Refactor test 911
Break out the different test cases. As the stack traces print line
numbers, this will reduce the amount of expected.txt churn when
new tests are added.
Bug: 31684812
Test: m test-art-host-run-test-911-get-stack-trace
Change-Id: I3b4cb80ec5dd851ebbdf25fd660038d20a9daa9e
-rw-r--r-- | test/911-get-stack-trace/expected.txt | 778 | ||||
-rw-r--r-- | test/911-get-stack-trace/src/AllTraces.java | 80 | ||||
-rw-r--r-- | test/911-get-stack-trace/src/ControlData.java | 31 | ||||
-rw-r--r-- | test/911-get-stack-trace/src/Main.java | 259 | ||||
-rw-r--r-- | test/911-get-stack-trace/src/OtherThread.java | 82 | ||||
-rw-r--r-- | test/911-get-stack-trace/src/PrintThread.java | 70 | ||||
-rw-r--r-- | test/911-get-stack-trace/src/Recurse.java | 58 | ||||
-rw-r--r-- | test/911-get-stack-trace/src/SameThread.java | 33 | ||||
-rw-r--r-- | test/911-get-stack-trace/stack_trace.cc | 4 |
9 files changed, 750 insertions, 645 deletions
diff --git a/test/911-get-stack-trace/expected.txt b/test/911-get-stack-trace/expected.txt index e40698acc5..f0f92eaec9 100644 --- a/test/911-get-stack-trace/expected.txt +++ b/test/911-get-stack-trace/expected.txt @@ -4,72 +4,72 @@ From top --------- getStackTrace (Ljava/lang/Thread;II)[[Ljava/lang/String; -1 -2 - print (Ljava/lang/Thread;II)V 0 183 - printOrWait (IILMain$ControlData;)V 6 246 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - doTest ()V 38 41 - main ([Ljava/lang/String;)V 6 27 ---------- - print (Ljava/lang/Thread;II)V 0 183 - printOrWait (IILMain$ControlData;)V 6 246 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - doTest ()V 42 42 - main ([Ljava/lang/String;)V 6 27 + print (Ljava/lang/Thread;II)V 0 34 + printOrWait (IILControlData;)V 6 39 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + doTest ()V 38 23 + main ([Ljava/lang/String;)V 6 21 +--------- + print (Ljava/lang/Thread;II)V 0 34 + printOrWait (IILControlData;)V 6 39 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + doTest ()V 42 24 + main ([Ljava/lang/String;)V 6 21 --------- getStackTrace (Ljava/lang/Thread;II)[[Ljava/lang/String; -1 -2 - print (Ljava/lang/Thread;II)V 0 183 - printOrWait (IILMain$ControlData;)V 6 246 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 ---------- - printOrWait (IILMain$ControlData;)V 6 246 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 + print (Ljava/lang/Thread;II)V 0 34 + printOrWait (IILControlData;)V 6 39 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 +--------- + printOrWait (IILControlData;)V 6 39 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 From bottom --------- - main ([Ljava/lang/String;)V 6 27 + main ([Ljava/lang/String;)V 6 21 --------- - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - doTest ()V 65 48 - main ([Ljava/lang/String;)V 6 27 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + doTest ()V 65 30 + main ([Ljava/lang/String;)V 6 21 --------- - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 ################################ ### Other thread (suspended) ### @@ -77,135 +77,135 @@ From bottom From top --------- wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 61 ---------- - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 61 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 26 +--------- + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 26 --------- wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 ---------- - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 +--------- + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 From bottom --------- - run ()V 4 61 + run ()V 4 26 --------- - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 61 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 26 --------- - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 ########################### ### Other thread (live) ### ########################### From top --------- - printOrWait (IILMain$ControlData;)V 44 259 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 95 ---------- - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 95 ---------- - printOrWait (IILMain$ControlData;)V 44 259 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 ---------- - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + printOrWait (IILControlData;)V 44 52 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 59 +--------- + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 59 +--------- + printOrWait (IILControlData;)V 44 52 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 +--------- + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 From bottom --------- - run ()V 4 95 + run ()V 4 59 --------- - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 95 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 59 --------- - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 ################################ ### Other threads (suspended) ### @@ -276,89 +276,89 @@ Signal Catcher --------- Thread-10 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 --------- Thread-11 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 --------- Thread-12 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 --------- Thread-13 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 --------- Thread-4 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 --------- Thread-5 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 --------- Thread-6 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 --------- Thread-7 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 --------- Thread-8 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 --------- Thread-9 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 --------- main getAllStackTraces (I)[[Ljava/lang/Object; -1 -2 - printAll (I)V 0 219 - doTestAllStackTraces ()V 107 156 - main ([Ljava/lang/String;)V 15 31 + printAll (I)V 0 73 + doTest ()V 102 57 + main ([Ljava/lang/String;)V 30 33 --------- FinalizerDaemon @@ -378,218 +378,218 @@ Signal Catcher --------- Thread-10 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 144 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 45 --------- Thread-11 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 144 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 45 --------- Thread-12 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 144 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 45 --------- Thread-13 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 144 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 45 --------- Thread-4 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 144 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 45 --------- Thread-5 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 144 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 45 --------- Thread-6 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 144 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 45 --------- Thread-7 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 144 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 45 --------- Thread-8 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 144 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 45 --------- Thread-9 wait ()V -1 -2 - printOrWait (IILMain$ControlData;)V 24 252 - baz (IIILMain$ControlData;)Ljava/lang/Object; 2 237 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - baz (IIILMain$ControlData;)Ljava/lang/Object; 9 239 - bar (IIILMain$ControlData;)J 0 231 - foo (IIILMain$ControlData;)I 0 226 - run ()V 4 144 + printOrWait (IILControlData;)V 24 45 + baz (IIILControlData;)Ljava/lang/Object; 2 30 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + baz (IIILControlData;)Ljava/lang/Object; 9 32 + bar (IIILControlData;)J 0 24 + foo (IIILControlData;)I 0 19 + run ()V 4 45 --------- main getAllStackTraces (I)[[Ljava/lang/Object; -1 -2 - printAll (I)V 0 219 - doTestAllStackTraces ()V 112 158 - main ([Ljava/lang/String;)V 15 31 + printAll (I)V 0 73 + doTest ()V 107 59 + main ([Ljava/lang/String;)V 30 33 Done diff --git a/test/911-get-stack-trace/src/AllTraces.java b/test/911-get-stack-trace/src/AllTraces.java new file mode 100644 index 0000000000..adf6f38f5a --- /dev/null +++ b/test/911-get-stack-trace/src/AllTraces.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.ArrayList; +import java.util.List; + +public class AllTraces { + private final static List<Object> RETAIN = new ArrayList<Object>(); + + public static void doTest() throws Exception { + System.out.println("################################"); + System.out.println("### Other threads (suspended) ###"); + System.out.println("################################"); + + // Also create an unstarted and a dead thread. + RETAIN.add(new Thread()); + Thread deadThread = new Thread(); + RETAIN.add(deadThread); + deadThread.start(); + deadThread.join(); + + final int N = 10; + + final ControlData data = new ControlData(N); + data.waitFor = new Object(); + + Thread threads[] = new Thread[N]; + + for (int i = 0; i < N; i++) { + Thread t = new Thread() { + public void run() { + Recurse.foo(4, 0, 0, data); + } + }; + t.start(); + threads[i] = t; + } + data.reached.await(); + Thread.yield(); + Thread.sleep(500); // A little bit of time... + + printAll(0); + + printAll(5); + + printAll(25); + + // Let the thread make progress and die. + synchronized(data.waitFor) { + data.waitFor.notifyAll(); + } + for (int i = 0; i < N; i++) { + threads[i].join(); + } + + RETAIN.clear(); + } + + public static void printAll(int max) { + PrintThread.printAll(getAllStackTraces(max)); + } + + // Get all stack traces. This will return an array with an element for each thread. The element + // is an array itself with the first element being the thread, and the second element a nested + // String array as in getStackTrace. + public static native Object[][] getAllStackTraces(int max); +} diff --git a/test/911-get-stack-trace/src/ControlData.java b/test/911-get-stack-trace/src/ControlData.java new file mode 100644 index 0000000000..76ac4b8caa --- /dev/null +++ b/test/911-get-stack-trace/src/ControlData.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.concurrent.CountDownLatch; + +public class ControlData { + CountDownLatch reached; + Object waitFor = null; + volatile boolean stop = false; + + public ControlData() { + this(1); + } + + public ControlData(int latchCount) { + reached = new CountDownLatch(latchCount); + } +} diff --git a/test/911-get-stack-trace/src/Main.java b/test/911-get-stack-trace/src/Main.java index 3479abbeae..7b85c720b8 100644 --- a/test/911-get-stack-trace/src/Main.java +++ b/test/911-get-stack-trace/src/Main.java @@ -14,273 +14,24 @@ * limitations under the License. */ -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.CountDownLatch; - public class Main { public static void main(String[] args) throws Exception { System.loadLibrary(args[1]); - doTest(); - doTestOtherThreadWait(); - doTestOtherThreadBusyLoop(); - - doTestAllStackTraces(); - - System.out.println("Done"); - } - - public static void doTest() throws Exception { - System.out.println("###################"); - System.out.println("### Same thread ###"); - System.out.println("###################"); - System.out.println("From top"); - Recurse.foo(4, 0, 25, null); - Recurse.foo(4, 1, 25, null); - Recurse.foo(4, 0, 5, null); - Recurse.foo(4, 2, 5, null); + SameThread.doTest(); - System.out.println("From bottom"); - Recurse.foo(4, -1, 25, null); - Recurse.foo(4, -5, 5, null); - Recurse.foo(4, -7, 5, null); - } - - public static void doTestOtherThreadWait() throws Exception { System.out.println(); - System.out.println("################################"); - System.out.println("### Other thread (suspended) ###"); - System.out.println("################################"); - final ControlData data = new ControlData(); - data.waitFor = new Object(); - Thread t = new Thread() { - public void run() { - Recurse.foo(4, 0, 0, data); - } - }; - t.start(); - data.reached.await(); - Thread.yield(); - Thread.sleep(500); // A little bit of time... - - System.out.println("From top"); - print(t, 0, 25); - print(t, 1, 25); - print(t, 0, 5); - print(t, 2, 5); - System.out.println("From bottom"); - print(t, -1, 25); - print(t, -5, 5); - print(t, -7, 5); + OtherThread.doTestOtherThreadWait(); - // Let the thread make progress and die. - synchronized(data.waitFor) { - data.waitFor.notifyAll(); - } - t.join(); - } - - public static void doTestOtherThreadBusyLoop() throws Exception { System.out.println(); - System.out.println("###########################"); - System.out.println("### Other thread (live) ###"); - System.out.println("###########################"); - final ControlData data = new ControlData(); - Thread t = new Thread() { - public void run() { - Recurse.foo(4, 0, 0, data); - } - }; - t.start(); - data.reached.await(); - Thread.yield(); - Thread.sleep(500); // A little bit of time... - - System.out.println("From top"); - print(t, 0, 25); - print(t, 1, 25); - print(t, 0, 5); - print(t, 2, 5); - System.out.println("From bottom"); - print(t, -1, 25); - print(t, -5, 5); - print(t, -7, 5); + OtherThread.doTestOtherThreadBusyLoop(); - // Let the thread stop looping and die. - data.stop = true; - t.join(); - } - - private final static List<Object> RETAIN = new ArrayList<Object>(); - - public static void doTestAllStackTraces() throws Exception { System.out.println(); - System.out.println("################################"); - System.out.println("### Other threads (suspended) ###"); - System.out.println("################################"); - - // Also create an unstarted and a dead thread. - RETAIN.add(new Thread()); - Thread deadThread = new Thread(); - RETAIN.add(deadThread); - deadThread.start(); - deadThread.join(); - - final int N = 10; - - final ControlData data = new ControlData(N); - data.waitFor = new Object(); - - Thread threads[] = new Thread[N]; - - for (int i = 0; i < N; i++) { - Thread t = new Thread() { - public void run() { - Recurse.foo(4, 0, 0, data); - } - }; - t.start(); - threads[i] = t; - } - data.reached.await(); - Thread.yield(); - Thread.sleep(500); // A little bit of time... - - printAll(0); - - printAll(5); - - printAll(25); - // Let the thread make progress and die. - synchronized(data.waitFor) { - data.waitFor.notifyAll(); - } - for (int i = 0; i < N; i++) { - threads[i].join(); - } + AllTraces.doTest(); - RETAIN.clear(); - } - - public static void print(String[][] stack) { - System.out.println("---------"); - for (String[] stackElement : stack) { - for (String part : stackElement) { - System.out.print(' '); - System.out.print(part); - } - System.out.println(); - } - } - - public static void print(Thread t, int start, int max) { - print(getStackTrace(t, start, max)); - } - - public static void printAll(Object[][] stacks) { - List<String> stringified = new ArrayList<String>(stacks.length); - - for (Object[] stackInfo : stacks) { - Thread t = (Thread)stackInfo[0]; - String name = (t != null) ? t.getName() : "null"; - String stackSerialization; - if (name.contains("Daemon")) { - // Do not print daemon stacks, as they're non-deterministic. - stackSerialization = "<not printed>"; - } else { - StringBuilder sb = new StringBuilder(); - for (String[] stackElement : (String[][])stackInfo[1]) { - for (String part : stackElement) { - sb.append(' '); - sb.append(part); - } - sb.append('\n'); - } - stackSerialization = sb.toString(); - } - stringified.add(name + "\n" + stackSerialization); - } - - Collections.sort(stringified); - - for (String s : stringified) { - System.out.println("---------"); - System.out.println(s); - } - } - - public static void printAll(int max) { - printAll(getAllStackTraces(max)); - } - - // Wrap generated stack traces into a class to separate them nicely. - public static class Recurse { - - public static int foo(int x, int start, int max, ControlData data) { - bar(x, start, max, data); - return 0; - } - - private static long bar(int x, int start, int max, ControlData data) { - baz(x, start, max, data); - return 0; - } - - private static Object baz(int x, int start, int max, ControlData data) { - if (x == 0) { - printOrWait(start, max, data); - } else { - foo(x - 1, start, max, data); - } - return null; - } - - private static void printOrWait(int start, int max, ControlData data) { - if (data == null) { - print(Thread.currentThread(), start, max); - } else { - if (data.waitFor != null) { - synchronized (data.waitFor) { - data.reached.countDown(); - try { - data.waitFor.wait(); // Use wait() as it doesn't have a "hidden" Java call-graph. - } catch (Throwable t) { - throw new RuntimeException(t); - } - } - } else { - data.reached.countDown(); - while (!data.stop) { - // Busy-loop. - } - } - } - } - } - - public static class ControlData { - CountDownLatch reached; - Object waitFor = null; - volatile boolean stop = false; - - public ControlData() { - this(1); - } - - public ControlData(int latchCount) { - reached = new CountDownLatch(latchCount); - } + System.out.println("Done"); } - - public static native String[][] getStackTrace(Thread thread, int start, int max); - // Get all stack traces. This will return an array with an element for each thread. The element - // is an array itself with the first element being the thread, and the second element a nested - // String array as in getStackTrace. - public static native Object[][] getAllStackTraces(int max); } diff --git a/test/911-get-stack-trace/src/OtherThread.java b/test/911-get-stack-trace/src/OtherThread.java new file mode 100644 index 0000000000..0748433a20 --- /dev/null +++ b/test/911-get-stack-trace/src/OtherThread.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public class OtherThread { + public static void doTestOtherThreadWait() throws Exception { + System.out.println("################################"); + System.out.println("### Other thread (suspended) ###"); + System.out.println("################################"); + final ControlData data = new ControlData(); + data.waitFor = new Object(); + Thread t = new Thread() { + public void run() { + Recurse.foo(4, 0, 0, data); + } + }; + t.start(); + data.reached.await(); + Thread.yield(); + Thread.sleep(500); // A little bit of time... + + System.out.println("From top"); + PrintThread.print(t, 0, 25); + PrintThread.print(t, 1, 25); + PrintThread.print(t, 0, 5); + PrintThread.print(t, 2, 5); + + System.out.println("From bottom"); + PrintThread.print(t, -1, 25); + PrintThread.print(t, -5, 5); + PrintThread.print(t, -7, 5); + + // Let the thread make progress and die. + synchronized(data.waitFor) { + data.waitFor.notifyAll(); + } + t.join(); + } + + public static void doTestOtherThreadBusyLoop() throws Exception { + System.out.println("###########################"); + System.out.println("### Other thread (live) ###"); + System.out.println("###########################"); + final ControlData data = new ControlData(); + Thread t = new Thread() { + public void run() { + Recurse.foo(4, 0, 0, data); + } + }; + t.start(); + data.reached.await(); + Thread.yield(); + Thread.sleep(500); // A little bit of time... + + System.out.println("From top"); + PrintThread.print(t, 0, 25); + PrintThread.print(t, 1, 25); + PrintThread.print(t, 0, 5); + PrintThread.print(t, 2, 5); + + System.out.println("From bottom"); + PrintThread.print(t, -1, 25); + PrintThread.print(t, -5, 5); + PrintThread.print(t, -7, 5); + + // Let the thread stop looping and die. + data.stop = true; + t.join(); + } +} diff --git a/test/911-get-stack-trace/src/PrintThread.java b/test/911-get-stack-trace/src/PrintThread.java new file mode 100644 index 0000000000..97815ccad9 --- /dev/null +++ b/test/911-get-stack-trace/src/PrintThread.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class PrintThread { + public static void print(String[][] stack) { + System.out.println("---------"); + for (String[] stackElement : stack) { + for (String part : stackElement) { + System.out.print(' '); + System.out.print(part); + } + System.out.println(); + } + } + + public static void print(Thread t, int start, int max) { + print(getStackTrace(t, start, max)); + } + + public static void printAll(Object[][] stacks) { + List<String> stringified = new ArrayList<String>(stacks.length); + + for (Object[] stackInfo : stacks) { + Thread t = (Thread)stackInfo[0]; + String name = (t != null) ? t.getName() : "null"; + String stackSerialization; + if (name.contains("Daemon")) { + // Do not print daemon stacks, as they're non-deterministic. + stackSerialization = "<not printed>"; + } else { + StringBuilder sb = new StringBuilder(); + for (String[] stackElement : (String[][])stackInfo[1]) { + for (String part : stackElement) { + sb.append(' '); + sb.append(part); + } + sb.append('\n'); + } + stackSerialization = sb.toString(); + } + stringified.add(name + "\n" + stackSerialization); + } + + Collections.sort(stringified); + + for (String s : stringified) { + System.out.println("---------"); + System.out.println(s); + } + } + + public static native String[][] getStackTrace(Thread thread, int start, int max); +}
\ No newline at end of file diff --git a/test/911-get-stack-trace/src/Recurse.java b/test/911-get-stack-trace/src/Recurse.java new file mode 100644 index 0000000000..439fbaaf84 --- /dev/null +++ b/test/911-get-stack-trace/src/Recurse.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public class Recurse { + public static int foo(int x, int start, int max, ControlData data) { + bar(x, start, max, data); + return 0; + } + + private static long bar(int x, int start, int max, ControlData data) { + baz(x, start, max, data); + return 0; + } + + private static Object baz(int x, int start, int max, ControlData data) { + if (x == 0) { + printOrWait(start, max, data); + } else { + foo(x - 1, start, max, data); + } + return null; + } + + private static void printOrWait(int start, int max, ControlData data) { + if (data == null) { + PrintThread.print(Thread.currentThread(), start, max); + } else { + if (data.waitFor != null) { + synchronized (data.waitFor) { + data.reached.countDown(); + try { + data.waitFor.wait(); // Use wait() as it doesn't have a "hidden" Java call-graph. + } catch (Throwable t) { + throw new RuntimeException(t); + } + } + } else { + data.reached.countDown(); + while (!data.stop) { + // Busy-loop. + } + } + } + } +}
\ No newline at end of file diff --git a/test/911-get-stack-trace/src/SameThread.java b/test/911-get-stack-trace/src/SameThread.java new file mode 100644 index 0000000000..f1e19e367a --- /dev/null +++ b/test/911-get-stack-trace/src/SameThread.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +public class SameThread { + public static void doTest() throws Exception { + System.out.println("###################"); + System.out.println("### Same thread ###"); + System.out.println("###################"); + System.out.println("From top"); + Recurse.foo(4, 0, 25, null); + Recurse.foo(4, 1, 25, null); + Recurse.foo(4, 0, 5, null); + Recurse.foo(4, 2, 5, null); + + System.out.println("From bottom"); + Recurse.foo(4, -1, 25, null); + Recurse.foo(4, -5, 5, null); + Recurse.foo(4, -7, 5, null); + } +} diff --git a/test/911-get-stack-trace/stack_trace.cc b/test/911-get-stack-trace/stack_trace.cc index 57d4f6d2ee..8fc0af4732 100644 --- a/test/911-get-stack-trace/stack_trace.cc +++ b/test/911-get-stack-trace/stack_trace.cc @@ -127,7 +127,7 @@ static jobjectArray TranslateJvmtiFrameInfoArray(JNIEnv* env, return CreateObjectArray(env, count, "[Ljava/lang/String;", callback); } -extern "C" JNIEXPORT jobjectArray JNICALL Java_Main_getStackTrace( +extern "C" JNIEXPORT jobjectArray JNICALL Java_PrintThread_getStackTrace( JNIEnv* env, jclass klass ATTRIBUTE_UNUSED, jthread thread, jint start, jint max) { std::unique_ptr<jvmtiFrameInfo[]> frames(new jvmtiFrameInfo[max]); @@ -146,7 +146,7 @@ extern "C" JNIEXPORT jobjectArray JNICALL Java_Main_getStackTrace( return TranslateJvmtiFrameInfoArray(env, frames.get(), count); } -extern "C" JNIEXPORT jobjectArray JNICALL Java_Main_getAllStackTraces( +extern "C" JNIEXPORT jobjectArray JNICALL Java_AllTraces_getAllStackTraces( JNIEnv* env, jclass klass ATTRIBUTE_UNUSED, jint max) { std::unique_ptr<jvmtiFrameInfo[]> frames(new jvmtiFrameInfo[max]); |