summaryrefslogtreecommitdiffstats
path: root/libjava/gnu/gcj/runtime/FinalizerThread.java
diff options
context:
space:
mode:
authorbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>2004-07-11 21:19:47 +0000
committerbryce <bryce@138bc75d-0d04-0410-961f-82ee72b054a4>2004-07-11 21:19:47 +0000
commite6026a782a4bdda2a65a2121e41e9a3e13a89c49 (patch)
tree1eb123e8167930c24b33e77b72e82925706270d5 /libjava/gnu/gcj/runtime/FinalizerThread.java
parent93c149df04baceb7006fd44481e180ffb6824b16 (diff)
downloadppe42-gcc-e6026a782a4bdda2a65a2121e41e9a3e13a89c49.tar.gz
ppe42-gcc-e6026a782a4bdda2a65a2121e41e9a3e13a89c49.zip
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@84531 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/gnu/gcj/runtime/FinalizerThread.java')
-rw-r--r--libjava/gnu/gcj/runtime/FinalizerThread.java55
1 files changed, 7 insertions, 48 deletions
diff --git a/libjava/gnu/gcj/runtime/FinalizerThread.java b/libjava/gnu/gcj/runtime/FinalizerThread.java
index e333d7a41c7..c9a917cd264 100644
--- a/libjava/gnu/gcj/runtime/FinalizerThread.java
+++ b/libjava/gnu/gcj/runtime/FinalizerThread.java
@@ -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();
}
OpenPOWER on IntegriCloud