blob: e333d7a41c7d66140a743ea5d6c71e8758607c1a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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 ();
}
}
}
}
|