| // 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 <tromey@redhat.com> |
| * @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 (); |
| } |
| } |
| } |
| } |