@Override public void terminateProcess(ThreadInfo ti) { SystemState ss = getSystemState(); ThreadInfo[] liveThreads = getLiveThreads(); ThreadInfo finalizerTi = null; for (int i = 0; i < liveThreads.length; i++) { if (!liveThreads[i].isSystemThread()) { // keep the stack frames around, so that we can inspect the snapshot liveThreads[i].setTerminated(); } else { // FinalizerThread is not killed at this point. We need to keep it around in // case fianlizable objects are GCed after System.exit() returns. finalizerTi = liveThreads[i]; } } ss.setMandatoryNextChoiceGenerator( new BreakGenerator("exit", ti, true), "exit without break CG"); // if there is a finalizer thread, we have to run the last GC, to queue finalizable objects, if // any if (finalizerTi != null) { assert finalizerTi.isAlive(); activateGC(); } }
/** Saves the backtracking information. */ @Override public void pushSystemState() { sstack = new ImmutableList<Object>(ss.getBacktrackData(), sstack); }
protected void backtrackSystemState() { Object o = sstack.head; sstack = sstack.tail; ss.backtrackTo(o); }