// FinalizerThread.java -- Thread in which finalizers are run. /* Copyright (C) 2001 Free Software Foundation This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ package gnu.gcj.runtime; /** * @author Tom Tromey * @date October 3, 2001 */ public final class FinalizerThread extends Thread { // Finalizers must be run in a thread with no Java-visible locks // held. This qualifies because we don't make the lock visible. private static final Object lock = new Object (); // This is true if the finalizer thread started successfully. It // might be false if, for instance, there are no threads on the // current platform. In this situation we run finalizers in the // caller's thread. private static boolean thread_started = false; public FinalizerThread () { super ("LibgcjInternalFinalizerThread"); setDaemon (true); } // This is called by the runtime when a finalizer is ready to be // run. It simply wakes up the finalizer thread. public static void finalizerReady () { synchronized (lock) { if (! thread_started) runFinalizers (); else lock.notify (); } } // Actually run the finalizers. private static native void runFinalizers (); public void run () { // Wait on a lock. Whenever we wake up, try to invoke the // finalizers. synchronized (lock) { thread_started = true; while (true) { try { lock.wait (); } catch (InterruptedException _) { // Just ignore it. It doesn't hurt to run finalizers // when none are pending. } runFinalizers (); } } } }