diff options
Diffstat (limited to 'libjava/gnu/gcj/runtime/FinalizerThread.java')
| -rw-r--r-- | libjava/gnu/gcj/runtime/FinalizerThread.java | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/libjava/gnu/gcj/runtime/FinalizerThread.java b/libjava/gnu/gcj/runtime/FinalizerThread.java new file mode 100644 index 00000000000..e333d7a41c7 --- /dev/null +++ b/libjava/gnu/gcj/runtime/FinalizerThread.java @@ -0,0 +1,73 @@ +// 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 (); + } + } + } +} |

