/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. You * may obtain a copy of the License at * * http://www.opensource.org/licenses/eclipse-1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package test.org.jikesrvm.basic.core.threads; /** * Test Back Edge GC * * The classes in this file test the back edge call to GC * * An object of this class loops creates a Call GC object * then loops until a GC is done by a different object * then it starts the GC object that it created */ /** * Create the Looper object and start * Create the GC object * wait until the looper object is started * start the GC object * wait for the GC object to complete, then exit */ class TestBackEdgeGC { public static void main(String[] args) throws java.lang.InterruptedException { XThread.say("Creating Looper"); Looper looper = new Looper(); XThread.say("Creating CallGC"); CallGC callGC = new CallGC(1); XThread.say("Starting Looper"); looper.start(); // start Thread2 after thread 1 is in loop while (!looper.running) { try { Thread.sleep(20); } catch (InterruptedException e) {} } XThread.say("Looper running -starting CallGC"); callGC.start(); // wait for GC thread to complete XThread.say("waiting for join with callGC"); callGC.join(); XThread.say("bye"); XThread.outputMessages(); } /** * Objects of this class invokes GC and exit */ static class CallGC extends XThread { int id = 0; CallGC(int cnt) { super("CallGC"); //save id fiels this.id = cnt; } void performTask() { XThread.say("calling GC id = " + id); System.gc(); XThread.say("GC complete- id = " + id); Looper.gccomplete = true; XThread.say("exiting id = " + id); } } static class Looper extends XThread { static boolean gccomplete; Looper() { super("Looper"); } void performTask() { CallGC gc = new CallGC(2); XThread.say("2nd CallGC created"); // Loop until a separate gc is complete while (!gccomplete) { } // start a second gc- using previously created object and test if gc field is valid XThread.say("Starting 2nd CallGC"); gc.start(); try { gc.join(); } catch (InterruptedException e) {} XThread.say("2nd CallGC started - exiting Looper"); } } }