re PR awt/16748 (IAA.ImageComponentsTest: Freezes When Window Is Resized)

2004-07-11  Bryce McKinlay  <mckinlay@redhat.com>

	PR libgcj/16748
	* prims.cc (_Jv_CreateJavaVM): Fix comment.
	* gnu/gcj/runtime/FinalizerThread.java (init): New. Native.
	(finalizerReady): Now native.
	(run): Likewise.
	(runFinalizers): Removed.
	* gnu/gcj/runtime/natFinalizerThread.cc (run): Implement here. Use
	a primitive lock, and don't hold it while running the finalizers.
	(runFinalizers): Implement. Don't aquire any Java lock.
	(finalizerReady): Use lock primitives to signal finalizer thread.

From-SVN: r84531
This commit is contained in:
Bryce McKinlay
2004-07-11 21:19:47 +00:00
committed by Bryce McKinlay
parent f44b0c8ec5
commit 31a7b75558
4 changed files with 64 additions and 53 deletions
+7 -48
View File
@@ -1,6 +1,6 @@
// FinalizerThread.java -- Thread in which finalizers are run.
/* Copyright (C) 2001 Free Software Foundation
/* Copyright (C) 2001, 2004 Free Software Foundation
This file is part of libgcj.
@@ -16,58 +16,17 @@ package gnu.gcj.runtime;
*/
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;
private static boolean finalizer_ready;
public FinalizerThread ()
{
super ("LibgcjInternalFinalizerThread");
setDaemon (true);
finalizer_ready = false;
init();
}
// 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 ();
}
}
}
private native void init();
static native void finalizerReady();
public native void run();
}