diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-10-10 22:25:43 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-10-10 22:25:43 +0000 |
commit | 37df08c13a4234e69f72c71c80d523bb9d76d21c (patch) | |
tree | 6facc0ca8bcfaba4b6989fa00c24d85c2c5d0aa0 /libjava/gnu/gcj | |
parent | 9d1b6043f2683567085474587ae8d2954efa977d (diff) | |
download | gcc-37df08c13a4234e69f72c71c80d523bb9d76d21c.tar.gz |
* gnu/gcj/runtime/natFinalizerThread.cc: New file.
* java/lang/natRuntime.cc: Include FinalizerThread.h.
(runFinalization): Call finalizerReady.
* nogc.cc (_Jv_GCInitializeFinalizers): New function.
* prims.cc: Include VirtualMachineError.h, FinalizerThread.h.
(_Jv_CreateJavaVM): Start the finalizer thread.
* no-threads.cc: Include InternalError.h.
(_Jv_ThreadStart): Throw InternalError.
(_Jv_ThreadInitData): Don't throw error if this is not the first
thread.
* Makefile.in: Rebuilt.
* Makefile.am (ordinary_java_source_files): Added
FinalizerThread.java.
(nat_source_files): Added natFinalizerThread.cc.
* include/jvm.h (_Jv_GCInitializeFinalizers): Declare.
* boehm.cc (_Jv_GCInitializeFinalizers): New function.
* gnu/gcj/runtime/FirstThread.java (run): Start finalizer thread.
* gnu/gcj/runtime/FinalizerThread.java: New file.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46163 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libjava/gnu/gcj')
-rw-r--r-- | libjava/gnu/gcj/runtime/FinalizerThread.java | 73 | ||||
-rw-r--r-- | libjava/gnu/gcj/runtime/FirstThread.java | 8 | ||||
-rw-r--r-- | libjava/gnu/gcj/runtime/natFinalizerThread.cc | 22 |
3 files changed, 99 insertions, 4 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 (); + } + } + } +} diff --git a/libjava/gnu/gcj/runtime/FirstThread.java b/libjava/gnu/gcj/runtime/FirstThread.java index c52ab42c0ef..fbc7a5bee2b 100644 --- a/libjava/gnu/gcj/runtime/FirstThread.java +++ b/libjava/gnu/gcj/runtime/FirstThread.java @@ -1,6 +1,6 @@ // FirstThread.java - Implementation of very first thread. -/* Copyright (C) 1998, 1999, 2000 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation This file is part of libgcj. @@ -33,12 +33,12 @@ final class FirstThread extends Thread this.args = args; this.is_jar = is_jar; } - + public void run() { if (is_jar) klass_name = getMain(klass_name); - + if (klass == null) { try @@ -50,7 +50,7 @@ final class FirstThread extends Thread throw new NoClassDefFoundError(klass_name); } } - + call_main(); } diff --git a/libjava/gnu/gcj/runtime/natFinalizerThread.cc b/libjava/gnu/gcj/runtime/natFinalizerThread.cc new file mode 100644 index 00000000000..d296bc40551 --- /dev/null +++ b/libjava/gnu/gcj/runtime/natFinalizerThread.cc @@ -0,0 +1,22 @@ +// natFinalizerThread.cc - Implementation of FinalizerThread native methods. + +/* 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. */ + +#include <config.h> + +#include <gcj/cni.h> +#include <jvm.h> + +#include <gnu/gcj/runtime/FinalizerThread.h> + +void +gnu::gcj::runtime::FinalizerThread::runFinalizers () +{ + _Jv_RunFinalizers (); +} |