public class getstacktrace extends Thread { public boolean done = false; // num_frames is the number of frames > the original run () call so if // num_frames = 1, the thread will have 2 frames, the original Thread.run // call, plus one additional public int num_frames, thread_num; public static int num_threads = 1; static { System.loadLibrary("natgetstacktrace"); } public void run () { thread_num = num_threads++; num_frames = thread_num; if (num_frames <= 1) { natRunner (); } else { if (thread_num % 2 == 0) natPlaceholder (); else placeholder (); } } public void placeholder () { num_frames--; if (num_frames <= 1) { if (thread_num % 2 == 1) natRunner (); else runner (); } else { if (thread_num % 2 == 0) natPlaceholder (); else placeholder (); } } public void runner () { done = true; while (done) yield (); } public native void natPlaceholder (); public native void natRunner (); public static native int do_getstacktrace_tests (Thread[] threads); public static void main (String[] args) { System.out.println ("JVMTI GetStackTrace Interpreted Test"); getstacktrace[] threads = new getstacktrace[10]; for (int i = 0; i < threads.length; i++) { threads[i] = new getstacktrace (); threads[i].start (); while (!threads[i].done) yield (); } do_getstacktrace_tests (threads); for (int i = 0; i < threads.length; i++) { threads[i].done = false; } } }