diff options
author | David Daney <ddaney@avtrex.com> | 2003-08-21 22:08:09 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2003-08-21 22:08:09 +0000 |
commit | c9a61d5aa7e733f106743eb769acfe237c12cceb (patch) | |
tree | 4b272a593f6954df3f928105bcc760f277820e6c /libjava/java/lang/ref | |
parent | aa779cf3698b0fbc51db7a669fb4f3745afa03bb (diff) | |
download | gcc-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.java | 21 | ||||
-rw-r--r-- | libjava/java/lang/ref/natReference.cc | 4 |
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; |