aboutsummaryrefslogtreecommitdiff
path: root/libjava/gnu
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-10-10 22:25:43 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2001-10-10 22:25:43 +0000
commit37df08c13a4234e69f72c71c80d523bb9d76d21c (patch)
tree6facc0ca8bcfaba4b6989fa00c24d85c2c5d0aa0 /libjava/gnu
parent9d1b6043f2683567085474587ae8d2954efa977d (diff)
* 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')
-rw-r--r--libjava/gnu/gcj/runtime/FinalizerThread.java73
-rw-r--r--libjava/gnu/gcj/runtime/FirstThread.java8
-rw-r--r--libjava/gnu/gcj/runtime/natFinalizerThread.cc22
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 ();
+}