aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang/ref
diff options
context:
space:
mode:
authorDavid Daney <ddaney@avtrex.com>2003-08-21 22:08:09 +0000
committerTom Tromey <tromey@gcc.gnu.org>2003-08-21 22:08:09 +0000
commitc9a61d5aa7e733f106743eb769acfe237c12cceb (patch)
tree4b272a593f6954df3f928105bcc760f277820e6c /libjava/java/lang/ref
parentaa779cf3698b0fbc51db7a669fb4f3745afa03bb (diff)
downloadgcc-c9a61d5aa7e733f106743eb769acfe237c12cceb.zip
gcc-c9a61d5aa7e733f106743eb769acfe237c12cceb.tar.gz
gcc-c9a61d5aa7e733f106743eb769acfe237c12cceb.tar.bz2
re PR libgcj/12013 (Calling Reference.clear() can cause runtime to crash.)
2003-08-21 David Daney <ddaney@avtrex.com> Fix for PR libgcj/12013: * java/lang/ref/natReference.cc (finalize_referred_to_object): Check `cleared' field. * java/lang/ref/Reference.java (copy): Updated comments. (cleared): New field. (clear): Rewrote. From-SVN: r70668
Diffstat (limited to 'libjava/java/lang/ref')
-rw-r--r--libjava/java/lang/ref/Reference.java21
-rw-r--r--libjava/java/lang/ref/natReference.cc4
2 files changed, 16 insertions, 9 deletions
diff --git a/libjava/java/lang/ref/Reference.java b/libjava/java/lang/ref/Reference.java
index b02a4ed..3a2f91e8 100644
--- a/libjava/java/lang/ref/Reference.java
+++ b/libjava/java/lang/ref/Reference.java
@@ -1,5 +1,5 @@
/* java.lang.ref.Reference
- Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -83,15 +83,25 @@ public abstract class Reference
/**
* This is like REFERENT but is not scanned by the GC. We keep a
- * copy around so that we can see when clear() has been called.
+ * copy around so that we can clean up our internal data structure
+ * even after clear() is called.
* GCJ LOCAL:
- * This field doesn't exist in Classpath; we use it to detect
- * clearing.
+ * This field doesn't exist in Classpath.
* END GCJ LOCAL
*/
gnu.gcj.RawData copy;
/**
+ * Set to true if {@link #clear()} is called.
+ * GCJ LOCAL:
+ * This field doesn't exist in Classpath. It is used internally in
+ * natReference.cc, which enqueues the reference unless it is true
+ * (has been cleared).
+ * END GCJ LOCAL
+ */
+ boolean cleared = false;
+
+ /**
* The queue this reference is registered on. This is null, if this
* wasn't registered to any queue or reference was already enqueued.
*/
@@ -166,8 +176,7 @@ public abstract class Reference
*/
public void clear()
{
- referent = null;
- copy = null;
+ cleared = true;
}
/**
diff --git a/libjava/java/lang/ref/natReference.cc b/libjava/java/lang/ref/natReference.cc
index a1550f6..551bd08 100644
--- a/libjava/java/lang/ref/natReference.cc
+++ b/libjava/java/lang/ref/natReference.cc
@@ -258,9 +258,7 @@ finalize_referred_to_object (jobject obj)
{
java::lang::ref::Reference *ref
= reinterpret_cast<java::lang::ref::Reference *> (head->reference);
- // If the copy is already NULL then the user must have
- // called Reference.clear().
- if (ref->copy != NULL)
+ if (! ref->cleared)
ref->enqueue ();
object_list *next = head->next;