natFinalizerThread.cc: New file.
* 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. From-SVN: r46163
This commit is contained in:
@@ -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 ();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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 ();
|
||||
}
|
||||
Reference in New Issue
Block a user