summaryrefslogtreecommitdiff
path: root/libjava/gnu/gcj/runtime/FinalizerThread.java
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 ();
	  }
      }
  }
}