74 lines
1.7 KiB
Java
74 lines
1.7 KiB
Java
|
// 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 ();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|