From: tromey Date: Thu, 21 Aug 2003 22:08:09 +0000 (+0000) Subject: 2003-08-21 David Daney X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5eed0b9721ee3147ec7b39258a00ec99ccad81c2;p=thirdparty%2Fgcc.git 2003-08-21 David Daney 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70668 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 06595e00db7b..80151e3e9e5b 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,12 @@ +2003-08-21 David Daney + + 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. + 2003-08-21 Scott Gilbertson Thomas Fitzsimmons diff --git a/libjava/java/lang/ref/Reference.java b/libjava/java/lang/ref/Reference.java index b02a4ed57755..3a2f91e8f16c 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,14 +83,24 @@ 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 a1550f69399a..551bd0809d12 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 (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;