blob: c29cc1148db619110605c9ecafb300af8e3c366a [file] [log] [blame]
jeffhao5d1ac922011-09-29 17:41:15 -07001// Copyright 2008 The Android Open Source Project
2
3import java.lang.ref.WeakReference;
4
5/**
6 * Some finalizer tests.
7 *
8 * This only works if System.runFinalization() causes finalizers to run
9 * immediately or very soon.
10 */
11public class Main {
12 private static void snooze(int ms) {
13 try {
14 Thread.sleep(ms);
15 } catch (InterruptedException ie) {
16 System.out.println("Snooze: " + ie.getMessage());
17 }
18 }
19
20 public static WeakReference makeRef() {
21 /*
22 * Make ft in another thread, so there is no danger of
23 * a conservative reference leaking onto the main thread's
24 * stack.
25 */
26
27 final WeakReference[] wimp = new WeakReference[1];
28 Thread t = new Thread() {
29 public void run() {
30 FinalizerTest ft = new FinalizerTest("wahoo");
31 wimp[0] = new WeakReference(ft);
32 ft = null;
33 }
34 };
35
36 t.start();
37
38 try {
39 t.join();
40 } catch (InterruptedException ie) {
41 throw new RuntimeException(ie);
42 }
43
44 return wimp[0];
45 }
46
47 public static String wimpString(final WeakReference wimp) {
48 /*
49 * Do the work in another thread, so there is no danger of a
50 * conservative reference to ft leaking onto the main thread's
51 * stack.
52 */
53
54 final String[] s = new String[1];
55 Thread t = new Thread() {
56 public void run() {
57 Object ref = wimp.get();
58 if (ref != null) {
59 s[0] = ref.toString();
60 }
61 }
62 };
63
64 t.start();
65
66 try {
67 t.join();
68 } catch (InterruptedException ie) {
69 throw new RuntimeException(ie);
70 }
71
72 return s[0];
73 }
74
75 public static void main(String[] args) {
76 WeakReference wimp = makeRef();
77
78 System.out.println("wimp: " + wimpString(wimp));
79
80 /* this will try to collect and finalize ft */
81 System.out.println("gc");
82 System.gc();
83
84 System.out.println("wimp: " + wimpString(wimp));
85 System.out.println("finalize");
86 System.runFinalization();
87 System.out.println("wimp: " + wimpString(wimp));
88
89 System.out.println("sleep");
90 snooze(1000);
91
92 System.out.println("reborn: " + FinalizerTest.mReborn);
93 System.out.println("wimp: " + wimpString(wimp));
94 System.out.println("reset reborn");
95 System.gc();
96 FinalizerTest.mReborn = FinalizerTest.mNothing;
97 System.out.println("gc + finalize");
98 System.gc();
99 System.runFinalization();
100
101 System.out.println("sleep");
102 snooze(1000);
103
104 System.out.println("reborn: " + FinalizerTest.mReborn);
105 System.out.println("wimp: " + wimpString(wimp));
106 }
107}