summaryrefslogtreecommitdiff
path: root/java/openjdk6/files/icedtea/security/20130416/8003335.patch
diff options
context:
space:
mode:
Diffstat (limited to 'java/openjdk6/files/icedtea/security/20130416/8003335.patch')
-rw-r--r--java/openjdk6/files/icedtea/security/20130416/8003335.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/java/openjdk6/files/icedtea/security/20130416/8003335.patch b/java/openjdk6/files/icedtea/security/20130416/8003335.patch
new file mode 100644
index 000000000000..ae733a018f2a
--- /dev/null
+++ b/java/openjdk6/files/icedtea/security/20130416/8003335.patch
@@ -0,0 +1,63 @@
+# HG changeset patch
+# User chegar
+# Date 1356010827 0
+# Node ID 3c7eb39c811464c98847a4f1a167636c1db80f17
+# Parent a0e51ed355c9ae1256f8d344df34babb87a1edce
+8003335: Better handling of Finalizer thread
+Reviewed-by: alanb, ahgross
+
+diff --git a/src/share/classes/java/lang/ref/Finalizer.java b/src/share/classes/java/lang/ref/Finalizer.java
+--- jdk/src/share/classes/java/lang/ref/Finalizer.java
++++ jdk/src/share/classes/java/lang/ref/Finalizer.java
+@@ -38,9 +38,9 @@
+ */
+ static native void invokeFinalizeMethod(Object o) throws Throwable;
+
+- static private ReferenceQueue queue = new ReferenceQueue();
+- static private Finalizer unfinalized = null;
+- static private Object lock = new Object();
++ private static ReferenceQueue queue = new ReferenceQueue();
++ private static Finalizer unfinalized = null;
++ private static final Object lock = new Object();
+
+ private Finalizer
+ next = null,
+@@ -142,7 +142,11 @@
+ /* Called by Runtime.runFinalization() */
+ static void runFinalization() {
+ forkSecondaryFinalizer(new Runnable() {
++ private volatile boolean running;
+ public void run() {
++ if (running)
++ return;
++ running = true;
+ for (;;) {
+ Finalizer f = (Finalizer)queue.poll();
+ if (f == null) break;
+@@ -155,7 +159,11 @@
+ /* Invoked by java.lang.Shutdown */
+ static void runAllFinalizers() {
+ forkSecondaryFinalizer(new Runnable() {
++ private volatile boolean running;
+ public void run() {
++ if (running)
++ return;
++ running = true;
+ for (;;) {
+ Finalizer f;
+ synchronized (lock) {
+@@ -168,10 +176,14 @@
+ }
+
+ private static class FinalizerThread extends Thread {
++ private volatile boolean running;
+ FinalizerThread(ThreadGroup g) {
+ super(g, "Finalizer");
+ }
+ public void run() {
++ if (running)
++ return;
++ running = true;
+ for (;;) {
+ try {
+ Finalizer f = (Finalizer)queue.remove();